MQL5 Wizard memungkinkan kita untuk membuat kode Expert Advisor (EA) secara otomatis. Untuk detail lebih lanjut, lihat artikel tentang Membuat Expert Advisor Siap Pakai di MQL5 Wizard.
Sinyal trading dari strategi ini didasarkan pada dua moving average yang dijelaskan dalam MQL5 Wizard - Sinyal Trading Berdasarkan Crossover Dua Exponentially Smoothed Moving Averages. Moving averages efektif saat tren berlangsung, tetapi di sisi lain dapat memberikan banyak sinyal palsu. Salah satu cara untuk meningkatkan strategi ini adalah dengan menggunakan filter waktu (misalnya, membuka posisi baru saat sesi Eropa di FOREX).
Di sini, kita akan membahas strategi yang didasarkan pada crossover dua Exponentially Smoothed Moving Averages (fast EMA dan slow EMA) dengan filter waktu intraday. Strategi ini disebut "Sinyal Berdasarkan Crossover Dua EMA dengan Filter Waktu Intraday" (saat membuat EA secara otomatis di MQL5 Wizard).
Sinyal Trading:
- Buka posisi long: Fast EMA crossover ke atas slow EMA dan kondisi filter waktu intraday tidak terpenuhi.
- Buka posisi short: Fast EMA crossover ke bawah slow EMA dan kondisi filter waktu intraday tidak terpenuhi.
Strategi ini diimplementasikan dalam kelas CSignal2EMA_ITF.
Sistem trading ini didasarkan pada pending order, dengan level harga yang dihitung berdasarkan nilai moving average dan ATR (Average True Range) digunakan.

Gambar 1. Sinyal trading berdasarkan crossover dua EMA dengan filter waktu intraday
Sinyal Trading
Strategi trading ini diimplementasikan dalam CSignal2EMA_ITF, yang memiliki beberapa metode terlindungi untuk mempermudah akses ke nilai indikator:
double FastEMA(int ind) // mengembalikan nilai fast EMA dari bar double SlowEMA(int ind) // mengembalikan nilai slow EMA dari bar double StateFastEMA(int ind) // mengembalikan nilai positif/negatif jika fast EMA meningkat/menurun double StateSlowEMA(int ind) // mengembalikan nilai positif/negatif jika slow EMA meningkat/menurun double StateEMA(int ind) // mengembalikan selisih antara fast dan slow EMA double ATR(int ind) // mengembalikan nilai ATR dari bar
- Limit>0. Akan masuk pada pergerakan balik ketika terjadi breakdown palsu dari moving average pada harga yang lebih baik daripada harga pasar (Buy Limit dan Sell Limit akan ditempatkan tergantung pada sinyal trading)
- Limit<0. Akan masuk ke arah pergerakan harga (Buy Stop dan Sell Stop akan ditempatkan tergantung pada sinyal trading).
- Limit=0. Dalam kasus ini, trading akan dilakukan menggunakan harga pasar.
1. Buka posisi long
Sistem ini memeriksa kondisi untuk membuka posisi long: jika perbedaan antara fast dan slow EMA pada bar terakhir yang sudah selesai telah berubah tanda dari "-" ke "+" (StateEMA(1)>0 && StateEMA(2)<0).
Selanjutnya, sistem memeriksa kondisi filter waktu intraday dengan memanggil metode CheckOpenLong() dari kelas CSignalITF. Jika trading diizinkan, maka akan dihitung level harga dasar (nilai moving average) dan nilai rentang ATR dari bar terakhir yang sudah selesai.
Bergantung pada tanda dari parameter input Limit, sistem akan menempatkan pending order buy. Harga order, level Take Profit, dan Stop Loss dihitung relatif terhadap level harga dasar (dalam unit ATR). Waktu kedaluwarsa order ditentukan (dalam bar) oleh parameter input Expiration.
//+------------------------------------------------------------------+ //| Memeriksa kondisi untuk membuka posisi long (buy) | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)>0 && StateEMA(2)<0)) return(false); if(!m_time_filter.CheckOpenLong(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
2. Tutup posisi long
Dalam kasus ini, fungsi yang memeriksa kondisi untuk menutup posisi long selalu mengembalikan nilai false, yaitu diasumsikan bahwa posisi long akan ditutup oleh Take Profit atau Stop Loss. Jika perlu, Anda dapat menulis kode sendiri untuk implementasi metode ini.
//+------------------------------------------------------------------+ //| Memeriksa kondisi untuk menutup posisi long | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseLong(double& price) { return(false); }
3. Buka posisi short
Sistem memeriksa kondisi untuk membuka posisi short: jika perbedaan antara fast dan slow EMA pada bar terakhir yang sudah selesai telah berubah tanda dari "+" ke "-" (StateEMA(1)<0 && StateEMA(2)>0).
Selanjutnya, sistem memeriksa kondisi filter waktu intraday dengan memanggil metode CheckOpenLong() dari kelas CSignalITF. Jika trading diizinkan, maka akan dihitung level harga dasar (nilai moving average) dan nilai rentang ATR dari bar terakhir yang sudah selesai.
Bergantung pada tanda dari parameter input Limit, sistem akan menempatkan pending order sell. Harga order, level Take Profit, dan Stop Loss dihitung relatif terhadap level harga dasar (dalam unit ATR). Waktu kedaluwarsa order ditentukan (dalam bar) oleh parameter input Expiration.
//+------------------------------------------------------------------+ //| Memeriksa kondisi untuk membuka posisi short (sell) | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)<0 && StateEMA(2)>0)) return(false); if(!m_time_filter.CheckOpenShort(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price =m_symbol.NormalizePrice(ema+m_limit*atr); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
4. Tutup posisi short
Dalam kasus ini, fungsi yang memeriksa kondisi untuk menutup posisi short selalu mengembalikan nilai false, yaitu diasumsikan bahwa posisi akan ditutup oleh Take Profit atau Stop Loss. Jika perlu, Anda dapat menulis kode sendiri untuk implementasi metode ini.
//+------------------------------------------------------------------+ //| Memeriksa kondisi untuk menutup posisi short | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseShort(double& price) { return(false); }
5. Trailing Stop dari Pending Order Buy
Expert Advisor akan melakukan trailing pada pending orders tergantung pada nilai moving average saat ini dan ATR.
//+--------------------------------------------------------------------+ //| Memeriksa kondisi untuk memodifikasi pending order buy | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* order,double& price) { //--- periksa if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); //--- return(true); }
6. Trailing Stop dari Pending Order Sell
Expert Advisor akan melakukan trailing pada pending orders tergantung pada nilai moving average saat ini dan ATR.
Order akan dieksekusi jika harga pasar mencapai harga order.
//+--------------------------------------------------------------------+ //| Memeriksa kondisi untuk memodifikasi pending order sell | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* order,double& price) { //--- periksa if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price=m_symbol.NormalizePrice(ema+m_limit*atr); //--- return(true); }
Membuat Expert Advisor Menggunakan MQL5 Wizard
Untuk membuat robot trading berdasarkan strategi ini, Anda perlu memilih properti sinyal sebagai "Sinyal Berdasarkan Crossover Dua EMA dengan Filter Waktu Intraday" di opsi "Membuat Expert Advisor Siap Pakai" dari MQL5 Wizard:

Gambar 2. Pilih 'Sinyal Berdasarkan Crossover Dua EMA dengan Filter Waktu Intraday' 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 mengkompilasinya dan mengujinya di Strategy Tester dari terminal klien MetaTrader 5.
Hasil Pengujian
Mari kita lihat pengujian balik dari Expert Advisor pada data historis (EUenSD H1, periode pengujian: 1.1.2010-05.01.2011, PeriodFastEMA=5, PeriodSlowEMA=30, PeriodATR=7, Limit=1.2, StopLoss=5, TakeProfit=8, Expiration=4, GoodMinuteOfHour=-1, BadMinutesOfHour=0, GoodHourOfDay=-1, BadHoursOfDay=0, GoodDayOfWeek=-1, BadDaysOfWeek=0).
Dalam pembuatan Expert Advisor, kami menggunakan volume tetap (Trading Fixed Lot, 0.1), algoritma Trailing Stop tidak digunakan (Trailing tidak digunakan).

Gambar 3. Hasil Pengujian dari Expert Advisor dengan sinyal trading, berdasarkan crossover dua EMA tanpa penggunaan filter ITF
Filter intraday tidak digunakan, sehingga terdapat banyak sinyal palsu. Sinyal trading dapat diperbaiki jika kita menganalisis hasil transaksi berdasarkan jam trading.
Dalam kasus kami, kami menemukan bahwa crossover dua EMA memberikan banyak sinyal palsu mulai dari pukul 6:00 hingga 23:59. Kita dapat menentukan filter waktu intraday dengan mengatur parameter filternya.
Misalnya, kita dapat menentukan filter waktu yang memungkinkan untuk membuka posisi hanya dari pukul 0:00 hingga 5:59. Ini dapat dilakukan dengan mengatur nilai BadHoursOfDay=16777152=111111111111111111000000b. Semua jam trading lainnya adalah "buruk", sehingga lebih baik melarang pembukaan posisi baru dari pukul 6:00 hingga akhir hari.
Jika kita mengatur nilai BadHoursOfDay=16777152, kita akan memfilter banyak sinyal palsu:

Gambar 4. Hasil Pengujian dari Expert Advisor dengan sinyal trading, berdasarkan crossover dua EMA dengan filter waktu (BadHoursofDay=16777152)
CSignalITF menyediakan banyak fitur filtrasi waktu lainnya (tinggal tentukan "jam baik" dan "jam buruk" dalam satu jam, jam dalam sehari, hari dalam seminggu).
Lampiran: Signal2EMA-ITF.mqh dengan kelas CSignal2EMA_ITF harus ditempatkan di terminal_data_folder\MQL5\Include\Expert\Signal folder.
File expert_2ema_itf.mq5 berisi kode Expert Advisor yang dibuat menggunakan MQL5 Wizard.
Postingan terkait
- Membuat Expert Advisor MQL5 untuk Sinyal Trading Berdasarkan Dark Cloud Cover dan Piercing Line dengan RSI
- Membuat Expert Advisor dengan MQL5 Wizard: Sinyal Trading Berdasarkan Dark Cloud Cover dan Piercing Line
- MQL5 Wizard: Membuat EA dengan Sinyal Trading Berdasarkan Pola Morning/Evening Stars dan Stochastic
- RRS Impulse: EA Unggulan untuk Trading MetaTrader 4
- MQL5 Wizard: Mengoptimalkan Sinyal Perdagangan dengan Morning/Evening Stars dan MFI