Strategi Trading Menggunakan MQL5 Wizard: Sinyal Crossover Harga dengan Moving Average dan ADX

Mike 2011.01.11 01:50 27 0 0
Lampiran

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

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
Fitur dari implementasi ini adalah pemeriksaan tambahan untuk keberadaan tren (menggunakan Directional Movement Indicator). Ini memungkinkan untuk memfilter sinyal yang salah dan memeriksa kondisi trading menggunakan nilai dari bar saat ini (yang belum selesai).

1. Membuka posisi long

Ketentuan untuk membuka posisi long:

  1. StateEMA(0)<0 dan StateEMA(1)>0: moving average meningkat pada bar saat ini dan bar terakhir yang sudah selesai;
  2. StateClose(1)>0: harga penutupan dari bar terakhir yang sudah selesai lebih tinggi dari moving average;
  3. MainADX(0)>minimum_ADX: nilai ADX dari bar saat ini lebih besar dari nilai minimal yang ditentukan (untuk memeriksa keberadaan tren);
  4. 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:

  1. StateEMA(0)<0 dan StateEMA(1)<0: moving average menurun pada bar saat ini dan bar terakhir yang sudah selesai;
  2. StateClose(1)<0: harga penutupan dari bar terakhir yang sudah selesai lebih rendah dari moving average;
  3. MainADX(0)>minimum_ADX: nilai ADX dari bar saat ini lebih besar dari nilai minimal yang ditentukan (untuk memeriksa keberadaan tren);
  4. 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

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

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.


Daftar
Komentar 0