MQL5 Wizard memungkinkan kita untuk membuat kode Expert Advisor (EA) secara otomatis. Untuk detail lebih lanjut, lihat Membuat Expert Advisors Siap Pakai di MQL5 Wizard.
Di sini, kita akan membahas strategi yang berbasis pada sinyal crossover harga dengan indikator Moving Average (MA) yang dikonfirmasi oleh indikator ADX. Strategi ini disebut "Sinyal berdasarkan crossover harga dengan MA yang dikonfirmasi oleh ADX" (ketika membuat EA secara otomatis di MQL5 Wizard).
Sinyal Trading:
- Buy: harga penutupan dari bar terakhir yang sudah selesai lebih tinggi dari moving average, dan moving average meningkat pada bar saat ini dan bar terakhir yang sudah selesai.
- Sell: harga penutupan dari bar terakhir yang sudah selesai lebih rendah dari moving average, dan moving average menurun pada bar saat ini dan bar terakhir yang sudah selesai.
- Untuk memfilter sinyal yang salah, akan dicek kekuatan tren (ADX>ADXmin) dan arah tren menggunakan Directional Movement Indexes (DI+ dan DI-).
Strategi ini diimplementasikan dalam kelas CSignalADX_MA (file ini harus ditempatkan di terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqh).

Gambar 1. Sinyal trading berdasarkan crossover harga dengan Moving Average, dikonfirmasi oleh ADX
Sinyal Trading
Strategi trading ini diimplementasikan dalam kelas CSignalADX_MA, yang memiliki beberapa metode terlindungi untuk menyederhanakan akses ke indikator dan nilai harga:
double PlusADX(int ind) // mengembalikan nilai dari garis DI+ bar double MainADX(int ind) // mengembalikan nilai dari garis utama bar double MinusADX(int ind) // mengembalikan nilai dari garis DI- bar double EMA(int ind) // mengembalikan nilai dari moving average bar double Close(int ind) // mengembalikan nilai dari harga penutupan bar double StateADX(int ind) // mengembalikan selisih antara garis DI+ dan DI- double StateEMA(int ind) // mengembalikan nilai positif jika EMA meningkat dan negatif jika menurun double StateClose(int ind) // mengembalikan selisih antara harga penutupan dan moving average
1. Membuka posisi long
Ketentuan untuk membuka posisi long:
- StateEMA(0)<0 dan StateEMA(1)>0: moving average meningkat pada bar saat ini dan bar terakhir yang sudah selesai;
- StateClose(1)>0: harga penutupan dari bar terakhir yang sudah selesai lebih tinggi dari moving average;
- MainADX(0)>minimum_ADX: nilai ADX dari bar saat ini lebih besar dari nilai minimal yang ditentukan (untuk memeriksa keberadaan tren);
- StateADX(0)>0: DI+ lebih besar dari DI- pada bar saat ini.
//+------------------------------------------------------------------+ //| Memeriksa kondisi untuk membuka posisi long (buy) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { //--- kondisi 1: moving average meningkat pada bar saat ini dan bar terakhir yang sudah selesai bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- kondisi 2: harga penutupan dari bar terakhir yang sudah selesai lebih tinggi dari moving average bool Buy_Condition_2=(StateClose(1)>0); //--- kondisi 3: nilai ADX dari bar saat ini lebih besar dari nilai minimal yang ditentukan (ambang batas tren) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- kondisi 4: nilai DI+ lebih besar dari DI- pada bar saat ini 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 kondisi return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
2. Menutup posisi long
Ketentuan untuk menutup posisi long:
- StateEMA(0)<0 dan StateEMA(1)<0: moving average menurun pada bar saat ini dan bar terakhir yang sudah selesai;
- StateClose(1)<0: harga penutupan dari bar terakhir yang sudah selesai lebih rendah dari moving average;
- MainADX(0)>minimum_ADX: nilai ADX dari bar saat ini lebih besar dari nilai minimal yang ditentukan (untuk memeriksa keberadaan tren);
- StateADX(0)<0: DI- lebih besar dari DI+ pada bar saat ini.
//+------------------------------------------------------------------+ //| Memeriksa kondisi untuk menutup posisi long | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseLong(double& price) { //--- kondisi 1: moving average menurun pada bar saat ini dan bar terakhir yang sudah selesai bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- kondisi 2: harga penutupan dari bar terakhir yang sudah selesai lebih rendah dari moving average bool Sell_Condition_2=(StateClose(1)<0); //--- kondisi 3: nilai ADX dari bar saat ini lebih besar dari nilai minimal yang ditentukan (ambang batas tren) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- kondisi 4: nilai DI- lebih besar dari DI- pada bar saat ini bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; //--- memeriksa semua kondisi return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
3. Membuka posisi short
Ketentuan untuk membuka posisi short sama dengan ketentuan menutup posisi long.
//+------------------------------------------------------------------+ //| Memeriksa kondisi untuk membuka posisi short (sell) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { //--- kondisi 1: moving average menurun pada bar saat ini dan bar terakhir yang sudah selesai bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- kondisi 2: harga penutupan dari bar terakhir yang sudah selesai lebih rendah dari moving average bool Sell_Condition_2=(StateClose(1)<0); //--- kondisi 3: nilai ADX dari bar saat ini lebih besar dari nilai minimal yang ditentukan (ambang batas tren) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- kondisi 4: nilai DI- lebih besar dari DI- pada bar saat ini 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 kondisi return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
4. Menutup posisi short
Ketentuan untuk menutup posisi short sama dengan ketentuan membuka posisi long.
//+------------------------------------------------------------------+ //| Memeriksa kondisi untuk menutup posisi short | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseShort(double& price) { //--- kondisi 1: moving average meningkat pada bar saat ini dan bar terakhir yang sudah selesai bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- kondisi 2: harga penutupan dari bar terakhir yang sudah selesai lebih tinggi dari moving average bool Buy_Condition_2=(StateClose(1)>0); //--- kondisi 3: nilai ADX dari bar saat ini lebih besar dari nilai minimal yang ditentukan (ambang batas tren) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- kondisi 4: nilai DI+ lebih besar dari DI- pada bar saat ini bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; //--- memeriksa semua kondisi return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
Membuat Expert Advisor Menggunakan MQL5 Wizard
Untuk membuat robot trading berdasarkan strategi ini, Anda perlu memilih properti sinyal sebagai "Sinyal berdasarkan crossover harga dengan MA yang dikonfirmasi oleh ADX" di opsi MQL5 Wizard:

Gambar 2. Pilih 'Sinyal berdasarkan crossover harga dengan MA yang dikonfirmasi oleh ADX' di MQL5 Wizard
Selanjutnya, Anda harus menentukan algoritma trailing stop yang diperlukan dan sistem manajemen uang dan risiko. Kode Expert Advisor akan dibuat secara otomatis, Anda dapat mengompilasinya dan mengujinya di Strategy Tester dari terminal klien MetaTrader 5.
Hasil Pengujian
Kita akan mempertimbangkan backtesting dari Expert Advisor pada data historis (EURUSD H1, periode pengujian: 1.1.2010-05.01.2011, PeriodADX=33, MinimumADX=22, PeriodMA=39, StopLoss=400, TakeProfit=900).
Dalam pembuatan Expert Advisor, kita menggunakan volume tetap (Trading Fixed Lot, 0.1), algoritma Trailing Stop tidak digunakan (Trailing tidak digunakan).

Gambar 3. Hasil backtesting historis dari Expert Advisor, berdasarkan crossover harga dengan MA yang dikonfirmasi oleh ADX
Lampiran: File SignalADX-MA.mqh dengan kelas CSignalADX_MA harus ditempatkan di terminal_data_folder\MQL5\Include\Expert\Signal\.
File ma_crossover_adx.mq5 berisi kode dari Expert Advisor, yang dibuat menggunakan MQL5 Wizard.
Komentar 0