MQL5 WIZARD: CREATING EXPERT ADVISORS WITHOUT PROGRAMMING
ที่มา https://www.mql5.com/en/articles/171
ลงทะเบียน เปิดบัญชี mini ได้ที่ https://www.exness.com/a/73208
บทนำ
เมื่อคุณสร้างระบบการซื้อขายอัตโนมัติจำเป็นต้องเขียนอัลกอริธึมในการวิเคราะห์สถานการณ์ตลาดและการสร้างสัญญาณการซื้อขายอัลกอริทึมของตำแหน่งที่เปิดอยู่รวมทั้งระบบการจัดการเงินและการจัดการความเสี่ยง
เมื่อรหัสของโมดูลถูกเขียนขึ้นแล้วงานที่ยากที่สุดคือรวบรวมส่วนประกอบทั้งหมดและแก้ปัญหารหัสต้นฉบับของหุ่นยนต์การค้า นี่คือบทบาทสำคัญของโครงสร้างปฏิสัมพันธ์ของโมดูล: หากสร้างขึ้นไม่ดีเวลาส่วนใหญ่จะใช้ในการค้นหาและแก้ไขข้อผิดพลาดและถ้าคุณเปลี่ยนอัลกอริทึมของโมดูลใด ๆ จะนำไปสู่การเขียนซอร์สโค้ดใหม่ทั้งหมด .
ใน MQL5 โดยใช้วิธีการเชิงวัตถุช่วยลดการเขียนและทดสอบระบบการซื้อขายอัตโนมัติได้อย่างมีนัยสำคัญ
MetaQuotes Software Corp.ได้พัฒนาชั้นเรียนเพื่อใช้กลยุทธ์การซื้อขาย ตอนนี้คุณสามารถสร้างรหัสที่ปรึกษาผู้เชี่ยวชาญโดยอัตโนมัติโดยตรงใน MetaEditor โดยเลือกที่ต้องการสัญญาณการค้า (ปัจจุบันมี 20 ของพวกเขา) ย้อนหลัง (4) และการบริหารจัดการการเงิน (5) โมดูล โดยการรวมโมดูลเหล่านี้คุณจะได้รับรูปแบบต่างๆของระบบการซื้อขายพร้อมใช้
นอกจากนี้คุณยังสามารถใช้ชั้นเรียนของคุณเองด้วยการใช้โมดูลเหล่านี้ได้ สร้างด้วยตนเองหรือสั่งซื้อผ่านบริการ งาน
ในบทความนี้เราจะพิจารณาการผลิตอัตโนมัติของรหัสที่มาปรึกษาผู้เชี่ยวชาญโดยใช้MQL5 Wizard และจะไม่มีอะไรให้โปรแกรม!
1. สร้างหุ่นยนต์เทรดดิ้งโดยใช้ MQL5 Wizard
รหัสที่มาของผู้เชี่ยวชาญที่ปรึกษาสร้างโดยใช้ตัวช่วยสร้าง MQL5ใน MetaEditor
ชั้นเรียนพื้นฐานของกลยุทธ์การซื้อขายจะอยู่ในโฟลเดอร์ '\ <client_terminal_directory> \ MQL5 \ Include \ Expert \' อัลกอริทึมที่พร้อมใช้งานของสัญญาณการค้าชั้นเรียนของตำแหน่งที่เปิดตามมาและชั้นเรียนของเงินและการจัดการความเสี่ยงจะอยู่ในโฟลเดอร์ย่อย Signal, Trailing และ Money MQL5 Wizard จะแยกวิเคราะห์แฟ้มในโฟลเดอร์เหล่านี้และใช้ในการสร้างรหัสของผู้เชี่ยวชาญที่ปรึกษา
ในการเปิดตัว MQL5 Wizard คุณต้องคลิกปุ่ม "ใหม่" บนแถบเครื่องมือหรือเลือก "ใหม่" จากเมนู "ไฟล์" (หรือเพียงกด Ctrl + N):
รูปที่ 1. เปิดตัว MQL5 Wizard
รูปที่ 1. เปิดตัว MQL5 Wizard
จากนั้นเลือกประเภทของโปรแกรมที่คุณต้องการสร้าง ในกรณีของเราให้เลือกตัวเลือก "Expert Advisor (generate)":
รูปที่ 2. การเลือกประเภทของโปรแกรม
รูปที่ 2. การเลือกประเภทของโปรแกรม
ขั้นตอนที่ 1. คุณสมบัติทั่วไปของที่ปรึกษาผู้เชี่ยวชาญ
ถัดไปจะเปิดกล่องโต้ตอบซึ่งคุณสามารถกำหนดคุณสมบัติทั่วไปของ Expert Advisor:
ภาพที่ 3. คุณสมบัติทั่วไปของที่ปรึกษาผู้เชี่ยวชาญ
รูปที่ 3. คุณสมบัติทั่วไปของที่ปรึกษาผู้เชี่ยวชาญ
ระบุชื่อที่ปรึกษาผู้เชี่ยวชาญของคุณชื่อผู้เขียนและลิงก์ไปยังเว็บไซต์ของคุณในฟิลด์ "ชื่อ" "ผู้เขียน" และ "ลิงก์" (ตามลำดับ)
ที่ปรึกษาผู้เชี่ยวชาญยังมีพารามิเตอร์การป้อนข้อมูลต่อไปนี้:
สัญลักษณ์ (ชนิดสตริง) - สัญลักษณ์การทำงานสำหรับ Expert Advisor
ระยะเวลา (ประเภทระยะเวลา) - ระยะเวลาการทำงานสำหรับ Expert Advisor ..
ในขั้นตอนถัดไปเลือกประเภทของสัญญาณการค้าซึ่งผู้เชี่ยวชาญจะทำการค้า
ขั้นที่ 2. เลือกโมดูลของสัญญาณการค้า
อัลกอริธึมของการเปิดและปิดตำแหน่งจะถูกกำหนดโดยโมดูลของสัญญาณการค้า โมดูลสัญญาณการค้ามีกฎของการเปิด / ปิด / ตำแหน่งย้อนกลับ
ห้องสมุดมาตรฐานมีโมดูลสัญญาณการค้าที่พร้อมใช้งาน:
CSignalAC - โมดูลสัญญาณตามรูปแบบการตลาดของตัวบ่งชี้ที่Oscillator เร่ง
CSignalAMA - โมดูลสัญญาณตามรูปแบบการตลาดของตัวบ่งชี้การปรับเปลี่ยนค่าเฉลี่ยเคลื่อนที่
CSignalAO - โมดูลสัญญาณตามรูปแบบการตลาดของตัวบ่งชี้ที่Oscillator ที่น่ากลัว
CSignalBearsPower - โมดูลสัญญาณตามรูปแบบการตลาดของ oscillator หมีพลังงาน
CSignalBullsPower - โมดูลสัญญาณตามรูปแบบการตลาดของออสซิลบูลส์พาวเวอร์
CSignalCCI - โมดูลสัญญาณตามรูปแบบการตลาดของ oscillator ดัชนีสินค้าโภคภัณฑ์ช่อง
CSignalDeM - โมดูลสัญญาณตามรูปแบบการตลาดของ oscillator DeMarker
CSignalDEMA - โมดูลสัญญาณตามรูปแบบการตลาดของตัวบ่งชี้ดับเบิลเฉลี่ยเคลื่อนที่ที่อธิบาย
CSignalEnvelopes - โมดูลสัญญาณตามรูปแบบการตลาดของตัวบ่งชี้ซองจดหมาย
CSignalFrAMA - โมดูลสัญญาณตามรูปแบบการตลาดของตัวบ่งชี้เศษส่วน Adaptive ค่าเฉลี่ยเคลื่อนที่
CSignalITF - โมดูลของการกรองสัญญาณตามเวลา
CSignalMACD - โมดูลสัญญาณตามรูปแบบการตลาดของ oscillator MACD
CSignalMA - โมดูลสัญญาณตามรูปแบบการตลาดของตัวบ่งชี้ค่าเฉลี่ยเคลื่อนที่
CSignalSAR - โมดูลสัญญาณตามรูปแบบการตลาดของตัวบ่งชี้Parabolic SAR
CSignalRSI - โมดูลสัญญาณตามรูปแบบการตลาดของ oscillator ดัชนีความแข็งแรงญาติ
CSignalRVI - โมดูลของสัญญาณขึ้นอยู่กับรูปแบบการตลาดของ Oscillator ดัชนีความแรงของสัมพัทธภาพ
CSignalStoch - โมดูลสัญญาณตามรูปแบบการตลาดของ oscillator Stochastic
CSignalTRIX - โมดูลสัญญาณตามรูปแบบการตลาดของออสซิลทริปเปิเอกเฉลี่ย
CSignalTEMA - โมดูลสัญญาณตามรูปแบบการตลาดของตัวบ่งชี้ที่ทริปเปิเฉลี่ยเคลื่อนที่ที่อธิบาย
CSignalWPR - โมดูลสัญญาณตามรูปแบบการตลาดของ oscillator วิลเลียมส์ช่วงร้อยละ
ประเภทสัญญาณการค้าถูกเลือกจากรายการ "ชื่อ" แบบเลื่อนลง
หลังจากกดปุ่มถัดไปคุณจะเห็นหน้าต่าง:
รูปที่ 4 การเลือกสัญญาณการค้าของ Expert Advisor
รูปที่ 4 การเลือกสัญญาณการค้าของ Expert Advisor
หากต้องการเพิ่มโมดูลของสัญญาณการค้าให้กดปุ่ม "เพิ่ม"
ให้เพิ่มสัญญาณการค้าบนพื้นฐานของการย้ายตัวบ่งชี้เฉลี่ย
รูปที่ 5 เลือกอัลกอริธึมของสัญญาณทางการค้า
รูปที่ 5 เลือกอัลกอริธึมของสัญญาณทางการค้า
แต่ละโมดูลของสัญญาณการค้ามีพารามิเตอร์ของตัวเอง คุณสามารถใช้ค่าเริ่มต้นได้
มีการสร้างพารามิเตอร์สองรูปแบบ คุณสามารถสลับระหว่างพวกเขาได้ด้วยการคลิกสองครั้งที่ปุ่มเมาส์ซ้ายบนไอคอนของพารามิเตอร์ หากพารามิเตอร์มีไอคอนที่เน้นแล้วจะมีให้เป็นตัวแปรอินพุทของ Expert Advisor พารามิเตอร์ดังกล่าวสามารถใช้สำหรับการเพิ่มประสิทธิภาพของผู้เชี่ยวชาญในStrategy Testerได้ หากพารามิเตอร์มีไอคอนสีเทาแสดงว่ามีค่าคงที่ซึ่งคุณไม่สามารถแก้ไขได้จากคุณสมบัติของผู้เชี่ยวชาญที่ปรึกษา
โมดูลของสัญญาณการค้าจะปรากฏในรายการ:
รูปที่ 6. เพิ่มโมดูลสัญญาณทางการค้าแล้ว
รูปที่ 6. เพิ่มโมดูลสัญญาณทางการค้าแล้ว
ขั้นตอนที่ 3. เลือก Module of Trailing Open Positions
ขั้นตอนต่อไปคือการเลือกอัลกอริธึมของตำแหน่งที่เปิดตามหลัง (Trailing Stop) การใช้เส้นสายช่วยให้คุณสามารถประหยัดผลกำไรที่ได้รับ
ไลบรารีมาตรฐานมีหลายวิธีในการเปิดตำแหน่งที่เปิดอยู่ :
CTrailingNone - หยุดต่อท้ายไม่ได้ใช้
CTrailingFixedPips - Trailing Stop ตาม Stop Stop คงที่
CTrailingMA - Trailing Stop ตาม MA
CTrailingPSAR - ท้ายหยุดอยู่บนพื้นฐานของParabolic SAR
ใน Expert Advisor ของเราให้เลือก "Trailing Stop จาก Stop Stop คงที่":
รูปที่ 6 เลือก Algorithm of Trailing Open Positions
รูปที่ 7. เลือก Algorithm of Trailing Open Positions
ประเภทของการต่อท้ายนี้มีสองพารามิเตอร์ ได้แก่ StopLevel และ ProfitLevel (ในเครื่องหมายคำพูดด้วยเครื่องหมายจุลภาค 2 และ 4 หลัก) ซึ่งจะใช้กับตำแหน่งที่เปิดอยู่:
รูปที่ 7 การตั้งค่าพารามิเตอร์ของอัลกอริธึมที่เลือกไว้สำหรับตำแหน่งที่เปิดตามมา
รูปที่ 9 การตั้งค่าพารามิเตอร์ของอัลกอริทึมที่เลือกไว้สำหรับตำแหน่งที่เปิดตามมา
ขั้นตอนที่ 4. เลือกโมดูลเงินและการจัดการความเสี่ยง
ในขั้นตอนสุดท้ายคุณต้องเลือกระบบเงินและการบริหารความเสี่ยงซึ่งจะใช้ในที่ปรึกษาผู้เชี่ยวชาญของคุณ
วัตถุประสงค์ของอัลกอริทึมนี้คือการกำหนดปริมาณการซื้อขาย (ในล็อต) สำหรับการดำเนินธุรกิจการค้าและการบริหารความเสี่ยง เมื่อมูลค่าการสูญเสียเกินกว่าขีด จำกัด ที่อนุญาต (ตัวอย่างเช่น 10% ของทุน) โมดูลการจัดการเงินและความเสี่ยงจะบังคับให้ปิดสถานะที่ไม่สามารถทำกำไรได้
Standard Library มีการใช้งานพร้อมกันหลายรูปแบบของขั้นตอนวิธีการจัดการเงินและความเสี่ยง :
CMoneyFixedLot - การซื้อขายที่มีปริมาณการค้าคงที่
CMoneyFixedMargin - การซื้อขายโดยมีอัตรากำไรคงที่
CMoneyFixedRisk - การซื้อขายที่มีความเสี่ยงคงที่
CMoneyNone - การซื้อขายที่มีปริมาณการซื้อขายน้อยที่สุด
CMoneySizeOptimized - การซื้อขายที่มีปริมาณการค้าเพิ่มขึ้น
รูปที่ 8. เลือกอัลกอริธึมของเงินและการจัดการความเสี่ยง
รูปที่ 9 เลือกอัลกอริธึมของเงินและการบริหารความเสี่ยง
เลือกอัลกอริธึม 'การซื้อขายกับการค้าคงที่'
โมดูลที่เราเลือกมีสองพารามิเตอร์:
ล็อต - ปริมาณการซื้อขายในล็อต
เปอร์เซ็นต์ - เปอร์เซ็นต์ที่อนุญาตสูงสุดของความเสี่ยง
รูปที่ 9 การกำหนดพารามิเตอร์ของอัลกอริธึมที่เลือกของเงินและการบริหารความเสี่ยง
รูปที่ 10 การกำหนดพารามิเตอร์ของอัลกอริธึมที่เลือกของเงินและการบริหารความเสี่ยง
หลังจากคลิก "Finish" ไฟล์ TestExpert.mq5 จะปรากฏขึ้นในโฟลเดอร์ \ teminal_data_filder \ MQL5 \ Experts \ ชื่อไฟล์สอดคล้องกับชื่อที่ระบุของ Expert Advisor
2. โครงสร้างของที่ปรึกษาผู้เชี่ยวชาญที่สร้างขึ้นโดยใช้ตัวช่วยสร้าง MQL5
รหัสที่มาของ Expert Advisor ที่สร้างโดยตัวช่วยสร้าง MQL5 มีลักษณะดังนี้:
// + ----------------------------------------------- ------------------- +
// | TestExpert.mq5 |
// | Copyright 2012, MetaQuotes Software Corp. |
// | https://www.mql5.com |
// + ----------------------------------------------- ------------------- +
# property copyright "Copyright 2012, MetaQuotes Software Corp. "
#property link "https://www.mql5.com"
#property version "1.00"
// + --------------------------- --------------------------------------- +
// | รวม |
// + ----------------------------------------------- ------------------- +
#include <Expert \ Expert.mqh>
// --- สัญญาณที่ใช้ได้
#include <Expert \ Signal \ SignalMA.mqh>
// - - พร้อมใช้งานตามหลัง
#include <Expert \ Trailing \ TrailingFixedPips.mqh>
// --- การจัดการเงินที่มีอยู่
# รวม <Expert \ Money \ MoneyFixedLot.mqh>
// + ------------- -------------------------------------------------- --- +
// | ปัจจัยการผลิต |
// + ----------------------------------------------- ------------------- +
// --- ปัจจัยที่ใช้สำหรับผู้เชี่ยวชาญด้าน
การป้อนข้อมูล สตริง Expert_Title = "TestExpert" ;
ulong Expert_MagicNumber = 23689 ; //
bool Expert_EveryTick = false ; //
// --- ปัจจัยที่ใช้สำหรับสัญญาณหลักของ
การป้อนข้อมูล int Signal_ThresholdOpen = 10 ; / / ค่าเกณฑ์สัญญาณเพื่อเปิด [0 ... 100]
input int Signal_ThresholdClose = 10 ; // ค่า threshold ของสัญญาณเพื่อปิด [0 ... 100]
input double Signal_PriceLevel = 0.0 ; // ระดับราคาเพื่อสร้าง
อินพุท ข้อตกลงDouble Signal_StopLevel = 50.0 ; / / หยุดการสูญเสียระดับ (ในจุด)
เข้า คู่ Signal_TakeLevel = 50.0 ; / / ใช้ระดับกำไร (ในจุด)
อินพุท int Signal_Expiration = 4 ; // หมดอายุรอคำสั่งซื้อ (ในบาร์)
การป้อนข้อมูล int Signal_MA_PeriodMA = 85 ; // Moving Average (85,0, ... ) ระยะเวลาการ
ใส่ ค่าเฉลี่ยint Signal_MA_Shift = 0 ; // Moving Average (85,0, ... )
อินพุต การเปลี่ยนเวลาENUM_MA_METHOD Signal_MA_Method = MODE_SMA ; // ค่าเฉลี่ยเคลื่อนที่ (85,0, ... ) วิธี
ป้อนข้อมูล เฉลี่ยENUM_APPLIED_PRICE Signal_MA_Applied = PRICE_CLOSE ; // Moving Average (85,0, ... )
สัญญาณอินพุท แบบ Double Signal_MA_Weight = 1.0 ; // Moving Average (85,0, ... ) น้ำหนัก [0 ... 1.0]
// --- อินพุทสำหรับการ
ป้อนข้อมูล int ด้านหลัง Trailing_FixedPips_StopLevel = 30 ; / / หยุดการสูญเสียระดับต่อท้าย (ในจุด)
อินพุท int Trailing_FixedPips_ProfitLevel = 50 ; / / เอากำไรระดับต่อท้าย (ในจุด)
/ / - ปัจจัยการผลิตสำหรับ
ใส่ เงินสองครั้ง Money_FixLot_Percent = 10.0 ; // เปอร์เซ็นต์การ
ป้อนข้อมูล Double Money_FixLot_Lots = 0.1 ; // Fixed volume
// + ------------------------------------------- ----------------------- +
// | ผู้เชี่ยวชาญผู้เชี่ยวชาญระดับโลก |
// + ----------------------------------------------- ------------------- +
CExpert ExtExpert;
// + ----------------------------------------------- ------------------- +
// | ฟังก์ชั่นการริเริ่มของผู้เชี่ยวชาญ |
// + ----------------------------------------------- ------------------- +
int OnInit ()
{
// --- เริ่มต้นผู้เชี่ยวชาญ
ถ้า (! ExtExpert.Init ( Symbol (), Period (), Expert_EveryTick, Expert_MagicNumber))
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการเริ่มต้นใช้งานผู้เชี่ยวชาญ" );
ExtExpert.Deinit ();
ผลตอบแทน (- 1 );
}
// --- สร้างสัญญาณ
CExpertSignal * signal = new CExpertSignal;
if (signal == NULL )
{
/ / ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการสร้างสัญญาณ" );
ExtExpert.Deinit ();
ผลตอบแทน (- 2 );
}
// ---
ExtExpert.InitSignal (สัญญาณ);
signal.ThresholdOpen (Signal_ThresholdOpen);
signal.ThresholdClose (Signal_ThresholdClose);
signal.PriceLevel (Signal_PriceLevel);
signal.StopLevel (Signal_StopLevel);
signal.TakeLevel (Signal_TakeLevel);
signal.Expiration (Signal_Expiration);
// --- การสร้างตัวกรอง CSignalMA
CSignalMA * filter0 = ใหม่ CSignalMA;
if (filter0 == NULL )
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการสร้าง filter0" );
ExtExpert.Deinit ();
ผลตอบแทน (- 3 );
}
signal.AddFilter (filter0);
// --- ตั้งค่าพารามิเตอร์ของตัวกรอง
filter0.PeriodMA (Signal_MA_PeriodMA);
filter0.Shift (Signal_MA_Shift);
filter0.Method (Signal_MA_Method);
filter0.Applied (Signal_MA_Applied);
filter0.Weight (Signal_MA_Weight);
// --- การสร้างวัตถุต่อท้าย
CTrailingFixedPips * trailing = new CTrailingFixedPips;
if (trailing == NULL )
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": เกิดข้อผิดพลาดในการสร้างต่อท้าย" );
ExtExpert.Deinit ();
ผลตอบแทน (- 4 );
}
// --- เพิ่ม trailing ไปยังผู้เชี่ยวชาญ (จะถูกลบโดยอัตโนมัติ))
if (! ExtExpert.InitTrailing (trailing))
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการเริ่มต้นการต่อท้าย" );
ExtExpert.Deinit ();
ผลตอบแทน (- 5 );
}
// --- ตั้งค่าพารามิเตอร์ต่อท้าย
trailing.StopLevel (Trailing_FixedPips_StopLevel);
trailing.ProfitLevel (Trailing_FixedPips_ProfitLevel);
// --- การสร้างวัตถุเงิน
CMoneyFixedLot * money = new CMoneyFixedLot;
ถ้า (เงิน == NULL )
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการสร้างเงิน" );
ExtExpert.Deinit ();
ผลตอบแทน (- 6 );
}
// --- เพิ่มเงินให้ผู้เชี่ยวชาญ (จะถูกลบโดยอัตโนมัติ))
if (! ExtExpert.InitMoney (money))
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการเริ่มต้นเงิน" );
ExtExpert.Deinit ();
ผลตอบแทน (- 7 );
}
// --- ตั้งค่าเงิน
money.Percent (Money_FixLot_Percent);
money.Lots (Money_FixLot_Lots);
/ / --- ตรวจสอบพารามิเตอร์ทั้งหมดของวัตถุการค้า
ถ้า (! ExtExpert.ValidationSettings ())
{
// --- ล้มเหลว
ExtExpert.Deinit ();
ผลตอบแทน (- 8 );
}
// --- ปรับแต่งดัชนีที่จำเป็นทั้งหมด
ถ้า (! ExtExpert.InitIndicators ())
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการเริ่มต้นตัวชี้วัด" );
ExtExpert.Deinit ();
ผลตอบแทน (- 9 );
}
// --- ok
return ( 0 );
}
// + ----------------------------------------------- ------------------- +
// | การทำงานของ deinitialization ของผู้เชี่ยวชาญ |
// + ----------------------------------------------- ------------------- +
โมฆะ OnDeinit ( const intเหตุผล)
{
ExtExpert.Deinit ();
}
// + ----------------------------------------------- ------------------- +
// | ฟังก์ชันตัวจัดการเหตุการณ์ "Tick"
// + ----------------------------------------------- ------------------- +
โมฆะ OnTick ()
{
ExtExpert OnTick ();
}
// + ----------------------------------------------- ------------------- +
// | ฟังก์ชันตัวจัดการเหตุการณ์ "Trade" |
// + ----------------------------------------------- ------------------- +
โมฆะ OnTrade ()
{
ExtExpert OnTrade ();
}
// + ----------------------------------------------- ------------------- +
// | ฟังก์ชันตัวจัดการเหตุการณ์ "Timer"
// + ----------------------------------------------- ------------------- +
โมฆะ OnTimer ()
{
ExtExpert OnTimer ();
}
// + ----------------------------------------------- ------------------- +
รหัสของที่ปรึกษาผู้เชี่ยวชาญประกอบด้วยหลายส่วน
ส่วนการอธิบายคุณสมบัติของโปรแกรม:
# property copyright "ลิขสิทธิ์ 2012, MetaQuotes Software Corp. "
#property link "https://www.mql5.com"
#property version "1.00"
ไฟล์ที่รวม:
#include <Expert \ Expert.mqh>
// --- สัญญาณที่ใช้ได้
#include <Expert \ Signal \ SignalMA.mqh>
// --- มีต่อท้าย
#include <Expert \ Trailing \ TrailingFixedPips.mqh>
// --- การจัดการเงินที่มีอยู่
# รวม <Expert \ Money \ MoneyFixedLot.mqh>
รหัสของคลาสCExpert (อินสแตนซ์ที่ใช้ใน Expert Advisor) จะอยู่ในไฟล์ Expert.mqh
แฟ้ม SignalMA.mqh มีรหัสที่มาของการคัดเลือกระดับสัญญาณการค้า - CSignalMA แฟ้ม TrailingFixedPips.mqh มีรหัสที่มาของตำแหน่งที่เปิดท้ายระดับอัลกอริทึม - CTrailingFixedPips Money และการจัดการความเสี่ยงจะถูกใช้โดยคลาสCMoneyFixedLot ที่มีอยู่ในไฟล์ MoneyFixedLot.mqh
ถัดมาพารามิเตอร์การป้อนข้อมูลของที่ปรึกษาผู้เชี่ยวชาญ:
/ / --- ปัจจัยการผลิตสำหรับผู้เชี่ยวชาญด้านการ
ป้อนข้อมูล สตริง Expert_Title = "TestExpert" ; // ชื่อเอกสาร
ulong Expert_MagicNumber = 23689 ; //
bool Expert_EveryTick = false ; //
// --- ปัจจัยที่ใช้สำหรับสัญญาณหลักของ
การป้อนข้อมูล int Signal_ThresholdOpen = 10 ; / / ค่าเกณฑ์สัญญาณเพื่อเปิด [0 ... 100]
input int Signal_ThresholdClose = 10 ; // ค่า threshold ของสัญญาณเพื่อปิด [0 ... 100]
input double Signal_PriceLevel = 0.0 ; // ระดับราคาเพื่อสร้าง
อินพุท ข้อตกลงDouble Signal_StopLevel = 50.0 ; / / หยุดการสูญเสียระดับ (ในจุด)
เข้า คู่ Signal_TakeLevel = 50.0 ; / / ใช้ระดับกำไร (ในจุด)
อินพุท int Signal_Expiration = 4 ; // หมดอายุของการสั่งซื้อที่ค้างอยู่ (ในบาร์)
การป้อนข้อมูล int Signal_MA_PeriodMA = 85 ; // Moving Average (85,0, ... ) ระยะเวลาการ
ป้อน ค่าเฉลี่ยint Signal_MA_Shift = 0 ; // Moving Average (85,0, ... )
อินพุต การเปลี่ยนเวลาENUM_MA_METHOD Signal_MA_Method = MODE_SMA ; // ค่าเฉลี่ยเคลื่อนที่ (85,0, ... ) วิธี
ป้อนข้อมูล เฉลี่ยENUM_APPLIED_PRICE Signal_MA_Applied = PRICE_CLOSE ; // Moving Average (85,0, ... )
อินพุตของ ชุดราคาคู่ Signal_MA_Weight = 1.0; // Moving Average (85,0, ... ) น้ำหนัก [0 ... 1.0]
// - อินพุทสำหรับการ
ป้อนข้อมูล int int Trailing_FixedPips_StopLevel = 30 ; / / หยุดการสูญเสียระดับต่อท้าย (ในจุด)
อินพุท int Trailing_FixedPips_ProfitLevel = 50 ; / / เอากำไรระดับต่อท้าย (ในจุด)
/ / - ปัจจัยการผลิตสำหรับ
ใส่ เงินสองครั้ง Money_FixLot_Percent = 10.0 ; // เปอร์เซ็นต์การ
ป้อนข้อมูล Double Money_FixLot_Lots = 0.1 ; // Fixed volume
พารามิเตอร์สามตัวแรก (Expert_Title, Expert_MagicNumber และ Expert_EveryTick) เป็นแบบทั่วไป พวกเขามักจะไม่คำนึงถึงปัจจุบันที่เลือกสัญญาณซื้อขาย , ต่อท้ายและเงินและการบริหารความเสี่ยงขั้นตอนวิธีการ
พารามิเตอร์ Expert_Title ของสายอักขระระบุชื่อ Expert Advisor, Expert_MagicNumber ระบุรหัส (ค่านี้จะถูกใช้ในพารามิเตอร์ของคำขอทางการค้า) และพารามิเตอร์ Expert_EveryTick ใช้เพื่อตั้งค่าโหมดการทำงานของ EA ถ้า Expert_EveryTick ถูกตั้งค่าเป็น Real Expert Advisor จะเรียกฟังก์ชัน handler (ตรวจสอบเงื่อนไขการค้าการดำเนินการทางการค้าการเปิดตำแหน่งที่เปิด) ทุกครั้งที่มีการทำเครื่องหมายใหม่สำหรับสัญลักษณ์ทำงาน
หลังจากพารามิเตอร์ทั่วไปของ Expert Advisor เป็นพารามิเตอร์สำหรับป้อนสัญญาณอัลกอริธึมสัญญาณที่เลือก (ในกรณีของเราเป็นพารามิเตอร์ที่ใช้ใน คลาสCSignalMA )
เราได้เลือกคลาสCTrailingStopFixedPipsของตำแหน่งที่เปิดตามมา เส้นทางจะเปิดตำแหน่งในระยะห่างที่กำหนดโดยระดับ Stop Loss และ Take Profit ซึ่งมีการกำหนดค่าไว้ใน "ปกติ" 2/4 จุดหลัก เมื่อราคาเคลื่อนไปยังตำแหน่งที่เปิดตามระยะทางซึ่งเกินจำนวนจุดที่กำหนดโดยระดับ Trailing_FixedPips_StopLevel Expert Advisor จะปรับเปลี่ยนค่าของระดับ Stop Loss และ Take Profit (ถ้า Trailing_FixedPips_ProfitLevel> 0)
พารามิเตอร์การป้อนข้อมูล Money_FixLot_Percent และ Money_FixLot_Lots สอดคล้องกับพารามิเตอร์ของอัลกอริทึมที่มีล็อตการค้าแบบถาวรซึ่งใช้งานในคลาสCMoneyFixedLot ในกรณีของเราการค้าจะดำเนินการโดยมีปริมาณคงที่เท่ากับมูลค่าของ Money_FixLot_Lots
CMoneyFixedLotชั้นยังดำเนินขั้นตอนวิธีการบริหารความเสี่ยง: ถ้ามีการสูญเสีย (เป็นร้อยละที่กำหนดของผู้ถือหุ้นในปัจจุบัน) ระบุในพารามิเตอร์ Inp_Money_FixLot_Percent ที่CMoneyFixedLotชั้นจะแนะนำให้ปรึกษาผู้เชี่ยวชาญเพื่อกวาดต้อนใกล้ชิดของตำแหน่งไม่ได้ประโยชน์และดังนั้นจึงจะ ทำได้
หลังจากป้อนพารามิเตอร์ของผู้เชี่ยวชาญ Advisor ExtExpert วัตถุของคลาสCExpertถูกประกาศ:
CExpert ExtExpert;
นี่เป็นตัวอย่างของชั้นกลยุทธ์การซื้อขาย
เป็นตัวอย่างของการที่CExpertระดับวัตถุ ExtExpert มีการอ้างอิงไปยังวัตถุลูกของCExpertSignal (ชั้นฐานของสัญญาณการค้า) ที่CExpertMoney (ชั้นฐานของเงินและการบริหารความเสี่ยง) และCExpertTrailing (ชั้นฐานของท้ายเปิด ตำแหน่ง) นอกจากนี้คลาสCExpertประกอบด้วยอินสแตนซ์ของ CExpertTrade, SSymbolInfo , CAccountInfo , CPositionInfo , คลาสCOrderInfoและคอนเทนเนอร์ CIndicators
เมื่อต้องการตั้งค่าพารามิเตอร์ของ Expert Advisor คุณต้องสร้างอินสแตนซ์ของคลาสที่เกี่ยวข้องและระบุการอ้างอิงไปยังอ็อบเจ็กต์ที่สร้างขึ้นในคลาส ExtExpert
ลองพิจารณาฟังก์ชันOnInitของการเริ่มต้นที่ปรึกษาผู้เชี่ยวชาญ ที่นี่เราเริ่มต้นและกำหนดค่าคุณสมบัติของคลาส ExtExpert
1. การเริ่มต้นของคลาส ExtExpert:
// --- เริ่มต้นผู้เชี่ยวชาญ
ถ้า (! ExtExpert.Init ( Symbol (), Period (), Expert_EveryTick, Expert_MagicNumber))
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการเริ่มต้นใช้งานผู้เชี่ยวชาญ" );
ExtExpert.Deinit ();
ผลตอบแทน (- 1 );
}
อ็อบเจ็กต์ ExtExpert ถูกเตรียมใช้งานโดยใช้เมธอดInit ที่นี่เราตั้งค่าสัญลักษณ์ระยะเวลาแฟล็กของเมธอดที่เรียกใช้ติ๊กทุกตัว ID ของ Expert Advisor รวมถึงการสร้างและเริ่มต้นออบเจ็กต์ส่วนตัวของคลาส (ในขั้นตอนนี้CEXpertSignal , CExpertMoneyและCExpertTrailing classes จะถูกใช้เป็นสัญญาณต่อท้ายและเงิน วัตถุการจัดการ)
ถ้าอ็อบเจ็กต์ ExtExpert ไม่สามารถเริ่มต้นได้สำเร็จ Expert Advisor จะถูกยกเลิกด้วยรหัส return -1
2. สร้างและกำหนดค่าคุณสมบัติของวัตถุสัญญาณ
// --- สร้างสัญญาณ
CExpertSignal * signal = new CExpertSignal;
if (signal == NULL )
{
/ / ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการสร้างสัญญาณ" );
ExtExpert.Deinit ();
ผลตอบแทน (- 2 );
}
// ---
ExtExpert.InitSignal (สัญญาณ);
signal.ThresholdOpen (Signal_ThresholdOpen);
signal.ThresholdClose (Signal_ThresholdClose);
signal.PriceLevel (Signal_PriceLevel);
signal.StopLevel (Signal_StopLevel);
signal.TakeLevel (Signal_TakeLevel);
signal.Expiration (Signal_Expiration);
// --- การสร้างตัวกรอง CSignalMA
CSignalMA * filter0 = ใหม่ CSignalMA;
if (filter0 == NULL )
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการสร้าง filter0" );
ExtExpert.Deinit ();
ผลตอบแทน (- 3 );
}
signal.AddFilter (filter0);
// --- ตั้งค่าพารามิเตอร์ของตัวกรอง
filter0.PeriodMA (Signal_MA_PeriodMA);
filter0.Shift (Signal_MA_Shift);
filter0.Method (Signal_MA_Method);
filter0.Applied (Signal_MA_Applied);
filter0.Weight (Signal_MA_Weight);
การกำหนดค่าของวัตถุสัญญาณทางการค้าประกอบด้วยหลายขั้นตอน:
การสร้างวัตถุสัญญาณและการตั้งค่าพารามิเตอร์
การสร้างโมดูลของสัญญาณการค้าและการเพิ่มลงในอินสแตนซ์คลาสของ CExpertSignal
ถ้าอ็อบเจ็กต์ ExtExpert ไม่สามารถเริ่มต้นได้สำเร็จ Expert Advisor จะถูกยกเลิกด้วยรหัสการรับคืน (ตั้งแต่ -2 ถึง -3) ขึ้นอยู่กับว่าเกิดข้อผิดพลาดขึ้น
ขึ้นอยู่กับว่าพารามิเตอร์ถูกระบุไว้ใน MQL5 Wizard จะมีการสร้างรหัสที่เหมาะสม
// --- ตั้งค่าพารามิเตอร์สัญญาณ
filter.PropiodMA ( 85 ); // --- พารามิเตอร์ถูกตั้งค่าเป็น MQL5 Wizard
// --- (ไอคอนสีเทา - ค่าคงที่เท่ากับ 85)
filter0.SlowPeriod (Signal_MA_Shift); // --- พารามิเตอร์ถูกตั้งค่าเป็นตัวแปรอินพุท
// --- (ไอคอนสีน้ำเงิน - พารามิเตอร์การป้อนข้อมูลของ Expert Advisor)
หากพารามิเตอร์ถูกกำหนดและค่าของมันไม่แตกต่างจากค่าเริ่มต้นจะไม่มีการเขียนรหัสที่สร้างขึ้น ในกรณีเช่นนี้จะใช้ค่าดีฟอลต์ของพารามิเตอร์ (ระบุไว้ในคลาสที่เกี่ยวข้อง)
3. สร้างและกำหนดค่าคุณสมบัติอ็อบเจ็กต์ Trailing
// --- การสร้างวัตถุต่อท้าย
CTrailingFixedPips * trailing = new CTrailingFixedPips;
if (trailing == NULL )
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": เกิดข้อผิดพลาดในการสร้างต่อท้าย" );
ExtExpert.Deinit ();
ผลตอบแทน (- 4 );
}
// --- เพิ่ม trailing ไปยังผู้เชี่ยวชาญ (จะถูกลบโดยอัตโนมัติ))
if (! ExtExpert.InitTrailing (trailing))
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการเริ่มต้นการต่อท้าย" );
ExtExpert.Deinit ();
ผลตอบแทน (- 5 );
}
// --- ตั้งค่าพารามิเตอร์ต่อท้าย
trailing.StopLevel (Trailing_FixedPips_StopLevel);
trailing.ProfitLevel (Trailing_FixedPips_ProfitLevel);
การกำหนดค่าของวัตถุต่อท้ายยังประกอบด้วยหลายขั้นตอน:
การสร้างวัตถุต่อท้าย;
การเพิ่มต่อท้ายให้กับผู้เชี่ยวชาญ
การตั้งค่าพารามิเตอร์ต่อท้าย
ถ้าผู้เชี่ยวชาญด้านการให้คำปรึกษาจะถูกยกเลิกด้วยรหัสการส่งคืน (ตั้งแต่ -4 ถึง -5) ซึ่งขึ้นอยู่กับว่าเกิดข้อผิดพลาดขึ้น
4. สร้างและกำหนดค่าคุณสมบัติของวัตถุเงิน
// --- การสร้างวัตถุเงิน
CMoneyFixedLot * money = new CMoneyFixedLot;
ถ้า (เงิน == NULL )
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการสร้างเงิน" );
ExtExpert.Deinit ();
ผลตอบแทน (- 6 );
}
// --- เพิ่มเงินให้ผู้เชี่ยวชาญ (จะถูกลบโดยอัตโนมัติ))
if (! ExtExpert.InitMoney (money))
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการเริ่มต้นเงิน" );
ExtExpert.Deinit ();
ผลตอบแทน (- 7 );
}
// --- ตั้งค่าเงิน
money.Percent (Money_FixLot_Percent);
money.Lots (Money_FixLot_Lots);
การกำหนดค่าของวัตถุการจัดการเงินและความเสี่ยงยังประกอบด้วย 4 ขั้นตอน:
การสร้างวัตถุเงิน
การเพิ่มเงินให้กับผู้เชี่ยวชาญ
การตั้งค่าเงิน
ถ้าวัตถุเงินไม่ได้เริ่มต้นที่ประสบความสำเร็จที่ปรึกษาผู้เชี่ยวชาญจะถูกยกเลิกด้วยรหัสผลตอบแทน (จาก -6 -7) ซึ่งขึ้นอยู่กับสิ่งที่ขั้นตอนที่มีข้อผิดพลาดเกิดขึ้น
5. เริ่มต้นตัวบ่งชี้ทั้งหมดที่ใช้ในชั้นเรียน
/ / --- ตรวจสอบพารามิเตอร์ทั้งหมดของวัตถุการค้า
ถ้า (! ExtExpert.ValidationSettings ())
{
// --- ล้มเหลว
ExtExpert.Deinit ();
ผลตอบแทน (- 8 );
}
// --- ปรับแต่งดัชนีที่จำเป็นทั้งหมด
ถ้า (! ExtExpert.InitIndicators ())
{
// ---
printf ล้มเหลว ( __FUNCTION__ + ": ข้อผิดพลาดในการเริ่มต้นตัวชี้วัด" );
ExtExpert.Deinit ();
ผลตอบแทน (- 9 );
}
// --- ok
return ( 0 );
หลังจากที่คุณสร้างและเริ่มต้นวัตถุของสัญญาณทางการค้าการต่อท้ายและการจัดการเงินแล้ววิธีการ ValidationSettings () ของ ExtExpert จะถูกเรียกใช้ หลังจากที่เรียกว่า InitIndicators () ของ ExtExpert วัตถุ มันเริ่มต้นตัวชี้วัดที่ใช้ในการส่งสัญญาณต่อท้ายและวัตถุเงิน
OnDeinit , OnTick , OnTradeและOnTimerเหตุการณ์จัดการจะดำเนินการโดยการเรียกวิธีการที่เหมาะสมของชนชั้น ExtExpert
ถ้าคุณต้องการทราบรายละเอียดเกี่ยวกับการใช้งานของCExpertคุณสามารถดูรหัสต้นฉบับของตัวบ่งชี้ที่อยู่ใน '\ <client_terminal_directory> \ MQL5 \ Include \ Expert \ expert.mqh'
3. ตรวจสอบที่ปรึกษาผู้เชี่ยวชาญที่สร้างขึ้นในโปรแกรมทดสอบกลยุทธ์ของ MetaTrader 5
ถ้ามีส่วนประกอบทั้งหมดของไลบรารีมาตรฐานรหัสของที่ปรึกษาผู้เชี่ยวชาญที่สร้างขึ้นจะสำเร็จ:
รูปที่ 10 การรวบรวมรหัสแหล่งที่ปรึกษาผู้เชี่ยวชาญที่สร้างขึ้นใน MQL5 Wizard สำเร็จ
รูปที่ 10 การรวบรวมรหัสแหล่งที่ปรึกษาผู้เชี่ยวชาญที่สร้างขึ้นใน MQL5 Wizard สำเร็จ
ส่งผลให้ที่ปรึกษาผู้เชี่ยวชาญจะค้าตามขั้นตอนวิธีการเลือกของสัญญาณการค้า , ต่อท้ายตำแหน่งที่เปิดและเงินและการบริหารความเสี่ยง
คุณสามารถตรวจสอบว่าระบบการซื้อขายที่สร้างขึ้นใหม่ของคุณใช้งานได้อย่างไรโดยใช้Strategy Testerจากเครื่องลูกข่ายของMetaTrader 5 ในรูปที่ 11 คุณสามารถดูผลการทดสอบข้อมูลย้อนหลังด้วยการตั้งค่าเริ่มต้น (EURUSD, H1, 2010.01.01-2011.06.01):
รูปที่ 11. ผลการทดสอบของผู้เชี่ยวชาญด้านการทดสอบข้อมูลย้อนหลัง (EURUSD, H1)
รูปที่ 11. ผลการทดสอบของผู้เชี่ยวชาญด้านการทดสอบข้อมูลย้อนหลัง (EURUSD, H1)
ชุดพารามิเตอร์ผู้เชี่ยวชาญของผู้เชี่ยวชาญที่ดีที่สุดสามารถหาได้จากการเพิ่มประสิทธิภาพในเครื่องมือทดสอบกลยุทธ์ของ MetaTrader 5
ข้อสรุป
การใช้ชั้นเรียนของกลยุทธ์การซื้อขายช่วยลดการสร้างและทดสอบแนวคิดการซื้อขายของคุณได้อย่างมาก ตอนนี้รหัสที่มาทั้งหมดของ Expert Advisor สามารถสร้างได้โดยตรงใน MetaEditor โดยใช้MQL5 Wizardบนพื้นฐานของไลบรารี Standard Library พร้อมใช้หรือโมดูลของคุณเอง
หากคุณไม่ต้องการหรือไม่สามารถเขียนโมดูลสัญญาณการค้าของคุณเองคุณสามารถได้รับประโยชน์จากบริการงานและสั่งซื้อหุ่นยนต์การค้าทั้งหมดหรือเฉพาะโมดูลที่จำเป็นเท่านั้น วิธีนี้จะให้ประโยชน์เพิ่มเติม:
ต้นทุนการพัฒนาของโมดูลแยกต่างหากควรต่ำกว่าค่าใช้จ่ายของที่ปรึกษาผู้เชี่ยวชาญทั้งหมด
โมดูลที่ได้สามารถนำมาใช้ซ้ำเพื่อสร้างทั้ง Expert Advisor แบบสแตนด์อโลนและหุ่นยนต์การค้าทั้งหมด (ตามโมดูลนี้) โดยใช้ MQL5 Wizard
โมดูลที่สั่งซื้อต้องปฏิบัติตามข้อกำหนดเพิ่มเติมของ MQL5 Wizard อย่างเคร่งครัดและให้การควบคุมเพิ่มเติมเกี่ยวกับคุณภาพของรหัส
สรพล
jun_jao2000@hotmail.com