MQL5 Wizard: Isyarat Dagangan Berdasarkan Crossover Dua EMA dengan Penapis Masa Harian

Mike 2011.01.13 23:32 36 0 0
Lampiran

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.

Penapisan isyarat berdasarkan tempoh masa tertentu dilaksanakan dalam kelas CSignalITF. Sebagai contoh penggunaannya, kita akan membincangkan kelas CSignal2EMA_ITF (ia mengandungi objek kelas CSignalITF).

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

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


Ciri sistem ini adalah, dagangan bergantung kepada parameter input Limit. Bergantung pada tandanya, terdapat beberapa kes:

  1. 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)
  2. Limit<0. Ia akan masuk ke arah pergerakan harga (Pesanan Beli Stop dan Jual Stop akan diletakkan bergantung kepada isyarat dagangan).
  3. 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.

Sistem dagangan akan meletakkan pesanan pending bergantung kepada isyarat dagangan. Jika pesanan telah diletakkan dengan berjaya, ia akan mengikuti pesanan pending sepanjang purata bergerak. Pesanan akan dilaksanakan jika harga pasaran mencapai harga pesanan.
//+--------------------------------------------------------------------+
//| 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

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

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)

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).

Penggunaan penapis masa membolehkan untuk memperbaiki isyarat dagangan dan mengambil kira dinamik pasaran (contohnya, ciri sesi dagangan).

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.


Senarai
Komen 0