MQL5 Wizard membolehkan anda mencipta kod untuk Sistem Trading secara automatik. Lihat Membuat Sistem Trading Sedia Ada dalam MQL5 Wizard untuk maklumat lanjut.
Kita akan membincangkan strategi yang berdasarkan crossover harga menggunakan indikator Moving Average (MA), yang disahkan oleh indikator ADX. Strategi ini dikenali sebagai "Isyarat Berdasarkan Crossover Harga dengan MA yang Disahkan oleh ADX" (ketika mencipta EA secara automatik di MQL5 Wizard).
Isyarat Perdagangan:
- Beli: harga penutupan bar terakhir yang telah selesai lebih tinggi daripada moving average, dan moving average meningkat pada bar semasa dan terakhir yang telah selesai.
- Jual: harga penutupan bar terakhir yang telah selesai lebih rendah daripada moving average, dan moving average menurun pada bar semasa dan terakhir yang telah selesai.
- Untuk menapis isyarat palsu, ia memeriksa kekuatan trend (ADX>ADXmin) dan arah trend menggunakan Indeks Pergerakan Arah (DI+ dan DI-).
Strategi ini dilaksanakan dalam kelas CSignalADX_MA (ia perlu diletakkan di terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqh).

Gambar 1. Isyarat perdagangan berdasarkan crossover harga dengan Moving Average, disahkan oleh ADX
Isyarat Perdagangan
Strategi perdagangan ini dilaksanakan dalam kelas CSignalADX_MA, yang mempunyai beberapa kaedah terpelihara untuk memudahkan akses kepada indikator dan nilai harga:
double PlusADX(int ind) // mengembalikan nilai baris DI+ bar double MainADX(int ind) // mengembalikan nilai baris utama bar double MinusADX(int ind) // mengembalikan nilai baris DI- bar double EMA(int ind) // mengembalikan nilai moving average bar double Close(int ind) // mengembalikan nilai harga penutupan bar double StateADX(int ind) // mengembalikan perbezaan antara baris DI+ dan DI- double StateEMA(int ind) // mengembalikan nilai positif jika EMA meningkat dan negatif jika menurun double StateClose(int ind) // mengembalikan perbezaan antara harga penutupan dan moving average
1. Membuka posisi long
Keadaan untuk membuka posisi long:
- StateEMA(0)<0 dan StateEMA(1)>0: moving average meningkat pada bar semasa dan bar terakhir yang telah selesai;
- StateClose(1)>0: harga penutupan bar terakhir yang telah selesai lebih tinggi daripada moving average;
- MainADX(0)>minimum_ADX: nilai ADX bar semasa lebih besar daripada nilai minimum yang ditetapkan (untuk memeriksa kehadiran trend);
- StateADX(0)>0: DI+ lebih besar daripada DI- pada bar semasa.
//+------------------------------------------------------------------+ //| Memeriksa keadaan untuk membuka posisi long (beli) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { //--- keadaan 1: moving average meningkat pada bar semasa dan bar terakhir yang telah selesai bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- keadaan 2: harga penutupan bar terakhir lebih tinggi daripada moving average bool Buy_Condition_2=(StateClose(1)>0); //--- keadaan 3: nilai ADX bar semasa lebih besar daripada nilai minimum yang ditetapkan (threshold trend) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- keadaan 4: nilai DI+ lebih besar daripada DI- pada bar semasa bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; sl =m_symbol.Ask()-m_stop_loss*m_adjusted_point; tp =m_symbol.Ask()+m_take_profit*m_adjusted_point; //--- memeriksa semua keadaan return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
2. Menutup posisi long
Keadaan untuk menutup posisi long:
- StateEMA(0)<0 dan StateEMA(1)<0: moving average menurun pada bar semasa dan bar terakhir yang telah selesai;
- StateClose(1)<0: harga penutupan bar terakhir lebih rendah daripada moving average;
- MainADX(0)>minimum_ADX: nilai ADX bar semasa lebih besar daripada nilai minimum yang ditetapkan (untuk memeriksa kehadiran trend);
- StateADX(0)<0: DI- lebih besar daripada DI+ pada bar semasa.
//+------------------------------------------------------------------+ //| Memeriksa keadaan untuk menutup posisi long | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseLong(double& price) { //--- keadaan 1: moving average menurun pada bar semasa dan bar terakhir yang telah selesai bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- keadaan 2: harga penutupan bar terakhir lebih rendah daripada moving average bool Sell_Condition_2=(StateClose(1)<0); //--- keadaan 3: nilai ADX bar semasa lebih besar daripada nilai minimum yang ditetapkan (threshold trend) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- keadaan 4: nilai DI- lebih besar daripada DI+ pada bar semasa bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; //--- memeriksa semua keadaan return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
3. Membuka posisi short
Keadaan untuk membuka posisi short adalah sama dengan keadaan menutup posisi long.
//+------------------------------------------------------------------+ //| Memeriksa keadaan untuk membuka posisi short (jual) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { //--- keadaan 1: moving average menurun pada bar semasa dan bar terakhir yang telah selesai bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- keadaan 2: harga penutupan bar terakhir lebih rendah daripada moving average bool Sell_Condition_2=(StateClose(1)<0); //--- keadaan 3: nilai ADX bar semasa lebih besar daripada nilai minimum yang ditetapkan (threshold trend) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- keadaan 4: nilai DI- lebih besar daripada DI- pada bar semasa bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; sl =m_symbol.Bid()+m_stop_loss*m_adjusted_point; tp =m_symbol.Bid()-m_take_profit*m_adjusted_point; //--- memeriksa semua keadaan return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
4. Menutup posisi short
Keadaan untuk menutup posisi short adalah sama dengan keadaan untuk membuka posisi long.
//+------------------------------------------------------------------+ //| Memeriksa keadaan untuk menutup posisi short | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseShort(double& price) { //--- keadaan 1: moving average meningkat pada bar semasa dan bar terakhir yang telah selesai bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- keadaan 2: harga penutupan bar terakhir lebih tinggi daripada moving average bool Buy_Condition_2=(StateClose(1)>0); //--- keadaan 3: nilai ADX bar semasa lebih besar daripada nilai minimum yang ditetapkan (threshold trend) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- keadaan 4: nilai DI+ lebih besar daripada DI- pada bar semasa bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; //--- memeriksa semua keadaan return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
Mencipta Sistem Trading Menggunakan MQL5 Wizard
Untuk mencipta robot perdagangan berdasarkan strategi ini, anda perlu memilih ciri isyarat sebagai "Isyarat Berdasarkan Crossover Harga dengan MA yang Disahkan oleh ADX" dalam pilihan MQL5 Wizard:

Gambar 2. Pilih "Isyarat Berdasarkan Crossover Harga dengan MA yang Disahkan oleh ADX" dalam MQL5 Wizard
Seterusnya, anda perlu menentukan algoritma trailing stop yang diperlukan dan sistem pengurusan wang dan risiko. Kod Sistem Trading akan dihasilkan secara automatik, anda boleh menyusunnya dan mengujinya dalam Strategy Tester terminal klien MetaTrader 5.
Keputusan Ujian
Mari kita lihat pengujian balik Sistem Trading pada data sejarah (EURUSD H1, tempoh ujian: 1.1.2010-05.01.2011, PeriodADX=33, MinimumADX=22, PeriodMA=39, StopLoss=400, TakeProfit=900).
Dalam penciptaan Sistem Trading, kami menggunakan volume tetap (Trading Fixed Lot, 0.1), algoritma Trailing Stop tidak digunakan (Trailing tidak digunakan).

Gambar 3. Keputusan uji balik sejarah Sistem Trading, berdasarkan crossover harga dengan MA disahkan oleh ADX
Lampiran: Fail SignalADX-MA.mqh dengan kelas CSignalADX_MA mesti diletakkan di terminal_data_folder\MQL5\Include\Expert\Signal\.
Fail ma_crossover_adx.mq5 mengandungi kod Sistem Trading, yang dicipta menggunakan MQL5 Wizard.
Komen 0