MQL5 Wizard membolehkan anda mencipta kod untuk Sistem Trading secara automatik. Lihat Mencipta Sistem Trading Sedia Ada dalam MQL5 Wizard untuk maklumat lanjut.
Isyarat dagangan strategi ini berasaskan dua purata bergerak. Strategi ini dibincangkan dalam MQL5 Wizard - Isyarat Dagangan Berdasarkan Crossover Dua Purata Bergerak Exponential. Purata bergerak berfungsi dengan baik semasa tren, tetapi dalam keadaan lain ia boleh menghasilkan banyak isyarat palsu. Salah satu cara untuk memperbaiki strategi ini adalah dengan menggunakan penapis masa (contohnya, membuka posisi baru semasa sesi Eropah FOREX).
Di sini kita akan mengkaji strategi berdasarkan crossover dua Purata Bergerak Exponential (EMA cepat dan EMA perlahan) dengan penapis masa harian. Strategi ini dikenali sebagai "Isyarat Berdasarkan Crossover Dua EMA dengan Penapis Masa Harian" (apabila mencipta EA secara automatik dalam MQL5 Wizard).
Isyarat dagangan:
- Buka posisi panjang: EMA cepat melintasi EMA perlahan ke atas dan syarat penapis masa harian tidak dipenuhi.
- Buka posisi pendek: EMA cepat melintasi EMA perlahan ke bawah dan syarat penapis masa harian tidak dipenuhi.
Strategi ini dilaksanakan dalam kelas CSignal2EMA_ITF.
Sistem dagangan ini berdasarkan pesanan tertunda, tahap harga dikira bergantung kepada nilai purata bergerak, dan unit ATR (Average True Range) digunakan.

Gambar 1. Isyarat dagangan, berdasarkan crossover dua EMA dengan penapis masa harian
Isyarat Dagangan
Strategi dagangan ini dilaksanakan dalam CSignal2EMA_ITF, ia mempunyai beberapa kaedah dilindungi untuk memudahkan akses kepada nilai indikator:
double FastEMA(int ind) // mengembalikan nilai EMA cepat bagi bar double SlowEMA(int ind) // mengembalikan nilai EMA perlahan bagi bar double StateFastEMA(int ind) // mengembalikan nilai positif/negatif jika EMA cepat meningkat/menurun double StateSlowEMA(int ind) // mengembalikan nilai positif/negatif jika EMA perlahan meningkat/menurun double StateEMA(int ind) // mengembalikan perbezaan antara EMA cepat dan perlahan double ATR(int ind) // mengembalikan nilai ATR bagi bar
- Limit>0. Ia akan masuk pada pergerakan kembali apabila pecahan palsu purata bergerak pada harga yang lebih baik daripada harga pasaran (Pesanan Beli Limit dan Jual Limit akan diletakkan bergantung kepada isyarat dagangan)
- Limit<0. Ia akan masuk ke arah pergerakan harga (Pesanan Beli Stop dan Jual Stop akan diletakkan bergantung kepada isyarat dagangan).
- Limit=0. Dalam kes ini, ia akan berdagang menggunakan harga pasaran.
1. Buka Posisi Panjang
Ia menyemak syarat untuk membuka posisi panjang: jika perbezaan antara EMA cepat dan perlahan pada bar terakhir yang lengkap telah berubah tandanya dari "-" kepada "+" (StateEMA(1)>0 && StateEMA(2)<0).
Seterusnya, ia menyemak syarat penapis masa harian dengan memanggil kaedah CheckOpenLong() dari kelas CSignalITF. Jika dagangan dibenarkan, ia akan mengira tahap harga asas (nilai purata bergerak) dan julat nilai ATR bagi bar terakhir yang lengkap.
Bergantung kepada tandanya, parameter input Limit akan meletakkan pesanan pending beli. Harga pesanan, tahap Ambil Untung dan Henti Rugi dikira berbanding tahap harga asas (dalam unit ATR). Masa tamat pesanan ditentukan (dalam bar) oleh parameter input Expiration.
//+------------------------------------------------------------------+ //| Memeriksa syarat untuk membuka posisi panjang (beli) | //+------------------------------------------------------------------+ 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 Panjang
Dalam kes kita, fungsi yang memeriksa syarat untuk menutup posisi panjang sentiasa mengembalikan nilai palsu, iaitu, dianggap bahawa posisi panjang akan ditutup oleh Ambil Untung atau Henti Rugi. Jika perlu, anda boleh menulis kod sendiri dengan pelaksanaan kaedah ini.
//+------------------------------------------------------------------+ //| Memeriksa syarat untuk menutup posisi panjang | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseLong(double& price) { return(false); }
3. Buka Posisi Pendek
Ia menyemak syarat untuk membuka posisi pendek: jika perbezaan antara EMA cepat dan perlahan pada bar terakhir yang lengkap telah berubah tandanya dari "+" kepada "-" (StateEMA(1)<0 && StateEMA(2)>0).
Seterusnya, ia menyemak syarat penapis masa harian dengan memanggil kaedah CheckOpenLong() dari kelas CSignalITF. Jika dagangan dibenarkan, ia akan mengira tahap harga asas (nilai purata bergerak) dan julat nilai ATR bagi bar terakhir yang lengkap.
Bergantung kepada tandanya, parameter input Limit akan meletakkan pesanan pending jual. Harga pesanan, tahap Ambil Untung dan Henti Rugi dikira berbanding tahap harga asas (dalam unit ATR). Masa tamat pesanan ditentukan (dalam bar) oleh parameter input Expiration.
//+------------------------------------------------------------------+ //| Memeriksa syarat untuk membuka posisi pendek (jual) | //+------------------------------------------------------------------+ 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 Pendek
Dalam kes kita, fungsi yang memeriksa syarat untuk menutup posisi pendek sentiasa mengembalikan nilai palsu, iaitu, dianggap bahawa posisi akan ditutup oleh Ambil Untung atau Henti Rugi. Jika perlu, anda boleh menulis kod sendiri dengan pelaksanaan kaedah ini.
//+------------------------------------------------------------------+ //| Memeriksa syarat untuk menutup posisi pendek | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseShort(double& price) { return(false); }
5. Trailing Stop bagi Pesanan Pending Beli
Sistem Trading akan mengikut pesanan pending bergantung kepada nilai purata bergerak semasa dan ATR.
//+--------------------------------------------------------------------+ //| Memeriksa syarat untuk mengubah pesanan beli pending | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* order,double& price) { //--- semak 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 bagi Pesanan Pending Jual
Sistem Trading akan mengikut pesanan pending bergantung kepada nilai purata bergerak semasa dan ATR.
Pesanan akan dilaksanakan jika harga pasaran mencapai harga pesanan.
//+--------------------------------------------------------------------+ //| Memeriksa syarat untuk mengubah pesanan jual pending | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* order,double& price) { //--- semak if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price=m_symbol.NormalizePrice(ema+m_limit*atr); //--- return(true); }
Mencipta Sistem Trading menggunakan MQL5 Wizard
Untuk mencipta robot dagangan berdasarkan strategi ini, anda perlu memilih sifat isyarat sebagai "Isyarat Berdasarkan Crossover Dua EMA dengan Penapis Masa Harian" dalam pilihan "Mencipta Sistem Trading Sedia Ada" dalam MQL5 Wizard:

Gambar 2. Pilih "Isyarat Berdasarkan Crossover Dua EMA dengan Penapis Masa Harian" dalam MQL5 Wizard
Seterusnya, anda perlu menentukan algoritma trailing stop yang diperlukan dan sistem pengurusan wang dan risiko. Kod Sistem Trading akan dicipta secara automatik, anda boleh menyusunnya dan mengujinya dalam Strategi Penguji terminal klien MetaTrader 5.
Keputusan Ujian
Mari kita lihat ujian balik Sistem Trading pada data sejarah (EUR/USD H1, tempoh ujian: 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 penciptaan Sistem Trading, kami menggunakan volum tetap (Trading Volum Tetap, 0.1), algoritma Trailing Stop tidak digunakan (Trailing tidak digunakan).

Gambar 3. Keputusan Ujian Sistem Trading dengan isyarat dagangan, berdasarkan crossover dua EMA tanpa menggunakan penapis ITF
Penapis harian tidak digunakan, jadi terdapat banyak isyarat palsu. Isyarat dagangan boleh dipertingkatkan jika kita melakukan analisis keputusan dagangan bergantung kepada waktu dagangan.
Dalam kes kita, kita mendapati bahawa crossover dua EMA memberikan banyak isyarat palsu bermula dari 6:00 hingga 23:59. Kita boleh menetapkan penapis masa harian dengan menetapkan parameter penapis.
Sebagai contoh, kita boleh menetapkan penapis masa yang membenarkan membuka posisi hanya dari 0:00 hingga 5:59. Ini boleh dilakukan dengan menetapkan nilai BadHoursOfDay=16777152=111111111111111111000000b. Semua waktu dagangan lain adalah "buruk", jadi lebih baik untuk melarang pembukaan posisi baru dari 6:00 hingga akhir hari.
Jika kita menetapkan nilai BadHoursOfDay=16777152, kita akan menapis banyak isyarat palsu:

Gambar 4. Keputusan Ujian Sistem Trading dengan isyarat dagangan, berdasarkan crossover dua EMA dengan penapis masa (BadHoursofDay=16777152)
Kelas CSignalITF menyediakan banyak ciri penapisan masa yang lain (hanya tetapkan "baik" dan "buruk" minit dalam satu jam, jam dalam satu hari, hari dalam satu minggu).
Lampiran: Fail Signal2EMA-ITF.mqh dengan kelas CSignal2EMA_ITF mesti diletakkan ke dalam terminal_data_folder\MQL5\Include\Expert\Signal folder.
Fail expert_2ema_itf.mq5 mengandungi kod Sistem Trading, yang dicipta menggunakan MQL5 Wizard.
Komen 0