Laman utama Perdagangan Sistem Siaran

MQL5 Wizard: Cipta Isyarat Dagangan Menggunakan Corak Morning/Evening Star dan MFI

Lampiran
323.zip (6.46 KB, Muat turun 2 kali)

MQL5 Wizard membolehkan anda untuk mencipta Asisten Pakar (EA) siap pakai berdasarkan kelas-kelas dari pustaka Standard yang disertakan bersama terminal klien. Dengan menggunakan MQL5 Wizard, anda dapat menguji idea dagangan dengan cepat hanya dengan membuat kelas isyarat dagangan anda sendiri. Struktur kelas ini dan contoh penggunaannya boleh ditemui dalam artikel MQL5 Wizard: Cara Membuat Modul Isyarat Dagangan.

Idea asasnya adalah seperti berikut: kelas isyarat dagangan diturunkan dari CExpertSignal. Kemudian, anda perlu mengubah kaedah LongCondition() dan ShortCondition() dengan kaedah anda sendiri.

Terdapat sebuah buku berjudul "Strategi Pedagang Terbaik" (dalam bahasa Rusia) yang membincangkan banyak strategi dagangan. Di sini, kita akan fokus kepada corak lilin pembalikan yang disahkan oleh Stochastic, CCI, MFI, dan RSI.

Cara terbaik adalah dengan mencipta kelas berasingan yang diturunkan dari CExpertSignal untuk memeriksa pembentukan corak lilin. Untuk mengesahkan isyarat dagangan yang dihasilkan oleh corak lilin, anda hanya perlu menulis kelas yang diturunkan dari CCandlePattern dan menambah ciri-ciri yang diperlukan (contohnya, pengesahan oleh osilator).

Kita akan mengkaji isyarat yang berdasarkan kepada corak pembalikan "Morning Star/Evening Star" (Morning Doji Star/Evening Doji Star) yang disahkan oleh indikator MFI. Modul isyarat dagangan ini adalah berdasarkan kelas CCandlePattern, yang merupakan contoh mudah untuk mencipta isyarat dagangan menggunakan corak lilin.

1. Corak lilin pembalikan "Morning Star" dan "Evening Star"

1.1. Morning Star

Corak ini menunjukkan pembalikan daripada aliran menurun, yang terdiri daripada tiga lilin. Selepas lilin hitam yang panjang, terdapat lilin (warna tidak penting) dengan badan kecil, yang terletak di luar badan lilin hitam tersebut. Badan kecil ini menunjukkan bahawa kekuatan pembeli dan penjual adalah sama dan pasaran bersedia untuk mengubah aliran.

Lilin ketiga dalam corak ini adalah lilin bullish, badan lilin tersebut tidak bertindih dengan badan lilin kedua, dan harga penutupan terletak di dalam badan lilin pertama (bearish). Lilin hasil dari model ini juga ditunjukkan dalam Rajah 1.

Dalam kes jika lilin kedua adalah lilin doji, model ini dipanggil "Morning Doji Star".

Rajah 1. Corak lilin Morning Star dan Morning Doji Star

Rajah 1. Corak lilin Morning Star dan Morning Doji Star

Pengenalan corak "Morning Star" dilaksanakan dalam kaedah CheckPatternMorningStar() dan CheckPatternMorningDoji() dari kelas CCandlePattern:

//+------------------------------------------------------------------+
//| Memeriksa pembentukan corak "Morning Star" |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternMorningStar()
  {
//--- Morning Star
   if((Open(3)-Close(3)>AvgBody(1)) && // lilin bearish, badan lebih besar dari purata badan lilin
      (MathAbs(Close(2)-Open(2)<AvgBody(1)*0.5) && // lilin kedua mempunyai badan kecil (kurang dari separuh badan purata)
      (Close(2)<Close(3)) && // penutupan lilin kedua lebih rendah dari penutupan lilin pertama
      (Open(2)<Open(3)) && // pembukaan lilin kedua lebih rendah dari pembukaan lilin pertama
      (Close(1)>MidOpenClose(3)))    // penutupan lilin terakhir lebih tinggi dari tengah lilin pertama
      return(true);
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| Memeriksa pembentukan corak "Morning Doji Star" |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternMorningDoji()
  {
//--- Morning Doji Star
   if((Open(3)-Close(3)>AvgBody(1)) && // lilin bearish dengan badan lebih besar dari purata badan lilin 
      (AvgBody(2)<AvgBody(1*0.1) && // lilin kedua mempunyai badan yang sangat kecil (doji) 
      (Close(2)<Close(3)) && // penutupan lilin kedua lebih rendah dari penutupan lilin pertama 
    (Open(2)<Open(3)) && // pembukaan lilin kedua lebih rendah dari pembukaan lilin pertama
      (Open(1)>Close(2)) && // jarak ke atas pada lilin terakhir
      (Close(1)>Close(2)))    // penutupan lilin terakhir lebih tinggi dari penutupan lilin kedua
      return(true);
//---
   return(false);
  }

Kaedah CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) dan CheckCandlestickPattern(CANDLE_PATTERN_MORNING_DOJI) dari kelas CCandlePattern digunakan untuk memeriksa pembentukan corak "Morning Star" dan "Morning Doji Star".

1.2. Evening Star

Corak ini menunjukkan pembalikan daripada aliran menaik, yang juga terdiri daripada tiga lilin. Selepas lilin putih yang panjang, terdapat lilin (warna tidak penting) dengan badan kecil, yang terletak di luar badan lilin putih. Badan kecil ini juga menunjukkan kekuatan pembeli dan penjual adalah sama dan pasaran bersedia untuk mengubah aliran.

Lilin ketiga dalam corak ini adalah lilin bearish, badan lilin tersebut tidak bertindih dengan badan lilin kedua, dan harga penutupan terletak di dalam badan lilin pertama (bullish). Lilin hasil dari model ini juga ditunjukkan dalam Rajah 2.

Jika lilin kedua adalah doji, model ini dipanggil "Evening Doji Star".

Rajah 2. Corak lilin Evening Star dan Evening Doji Star

Rajah 2. Corak lilin Evening Star dan Evening Doji Star

Berikut adalah kaedah untuk mengenalpasti corak "Evening Star" dan "Evening Doji Star":

//+------------------------------------------------------------------+
//| Memeriksa pembentukan corak "Evening Star" |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternEveningStar()
  {
//--- Evening Star
   if((Close(3)-Open(3)>AvgBody(1)) && // lilin bullish dengan badan lebih tinggi dari purata
      (MathAbs(Close(2)-Open(2)<AvgBody(1*0.5) && // lilin kedua mempunyai badan kecil (kurang dari separuh purata)
     (Close(2)>Close(3)) && // penutupan lilin kedua lebih tinggi dari penutupan lilin pertama
     (Open(2)>Open(3)) && // pembukaan lilin kedua lebih tinggi dari pembukaan lilin pertama
     (Close(1)<MidOpenClose(3)))   // penutupan lilin terakhir lebih rendah dari tengah lilin pertama
    return(true);
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| Memeriksa pembentukan corak "Evening Doji Star" |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternEveningDoji()
  {
//--- Evening Doji Star
   if((Close(3)-Open(3)>AvgBody(1)) && // lilin bullish dengan badan lebih tinggi dari purata 
      (AvgBody(2)<AvgBody(1*0.1) && // lilin kedua mempunyai badan yang sangat kecil (doji) 
     (Close(2)>Close(3)) && // penutupan lilin kedua lebih tinggi dari penutupan lilin pertama
     (Open(2)>Open(3)) && // pembukaan lilin kedua lebih tinggi dari pembukaan lilin pertama
     (Open(1)<Close(2)) && // jarak ke bawah pada lilin terakhir
     (Close(1)<Close(2)))    // penutupan lilin terakhir lebih rendah dari penutupan lilin kedua
    return(true);
//---
   return(false);
  }

Kaedah CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) dan CheckCandlestickPattern(CANDLE_PATTERN_EVENING_DOJI) dari kelas CCandlePattern digunakan untuk memeriksa pembentukan corak "Evening Star" dan "Evening Doji Star".

2. Isyarat dagangan, disahkan oleh indikator MFI

Isyarat dagangan untuk membuka posisi panjang atau pendek mesti disahkan oleh indikator MFI. Nilai indikator MFI mesti lebih rendah dari 40 (untuk posisi panjang) atau lebih tinggi dari 60 (untuk posisi pendek).

Penutupan posisi terbuka bergantung pada nilai indikator MFI. Ia boleh dilakukan dalam 2 kes:

  1. jika MFI telah mencapai tahap kritikal yang bertentangan (70 untuk posisi panjang dan 30 untuk posisi pendek)
  2. jika isyarat pembalikan tidak disahkan (apabila indikator MFI mencapai tahap berikut: 30 untuk posisi panjang dan 70 untuk posisi pendek)

Rajah 3. Corak Morning Star, disahkan oleh indikator MFI

Rajah 3. Corak Morning Star, disahkan oleh indikator MFI


  • int CMS_ES_MFI::LongCondition() - memeriksa syarat untuk membuka posisi panjang (mengembalikan 80) dan menutup posisi pendek (mengembalikan 40);
  • int CMS_ES_MFI::ShortCondition() - memeriksa syarat untuk membuka posisi pendek (mengembalikan 80) dan menutup posisi panjang (mengembalikan 40).

2.1. Membuka posisi panjang/Menutup posisi pendek

  1. Pembentukan corak "Morning Star" mesti disahkan oleh indikator MFI: MFi(1)<40 (nilai indikator MFI pada bar terakhir mesti kurang dari 40).

  2. Posisi pendek mesti ditutup jika indikator MFI telah melintasi ke atas tahap kritikal (70 atau 30).

//+------------------------------------------------------------------+
//| Memeriksa syarat untuk kemasukan dan keluar dari pasaran |
//| 1) Kemasukan pasaran (membuka posisi panjang, hasil=80) |
//| 2) Keluar dari pasaran (menutup posisi pendek, hasil=40) |
//+------------------------------------------------------------------+
int CMS_ES_MFI::LongCondition()
  {
   int result=0;
//--- idx boleh digunakan untuk menentukan mod kerja Asisten Pakar
//--- idx=0 - dalam kes ini EA memeriksa syarat dagangan pada setiap tik
//--- idx=1 - dalam kes ini EA memeriksa syarat dagangan hanya pada bar berita
   int idx   =StartIndex();
//--- memeriksa syarat untuk membuka posisi panjang
//--- pembentukan corak Morning Star dan MFI<40
  if(CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) && (MFI(1)<40))
     result=80;
//--- memeriksa syarat untuk menutup posisi pendek
//--- persilangan garis isyarat ke tahap terlebih beli/terlebih jual (ke atas 30, ke atas 70)
  if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70)))
     result=40;
//--- mengembalikan hasil
   return(result);
  }


2.2. Membuka posisi pendek/Menutup posisi panjang

  1. Pembentukan corak "Evening Star" mesti disahkan oleh indikator MFI: MFI(1)>60 (nilai indikator MFI pada bar terakhir mesti lebih dari 60).

  2. Posisi panjang mesti ditutup jika indikator MFI telah melintasi ke atas tahap kritikal (70 atau 30).

//+------------------------------------------------------------------+
//| Memeriksa syarat untuk kemasukan dan keluar dari pasaran |
//| 1) Kemasukan pasaran (membuka posisi pendek, hasil=80) |
//| 2) Keluar dari pasaran (menutup posisi panjang, hasil=40) |
//+------------------------------------------------------------------+
int CMS_ES_MFI::ShortCondition()
  {
   int result=0;
//--- idx boleh digunakan untuk menentukan mod kerja Asisten Pakar
//--- idx=0 - dalam kes ini EA memeriksa syarat dagangan pada setiap tik
//--- idx=1 - dalam kes ini EA memeriksa syarat dagangan hanya pada bar berita
   int idx   =StartIndex();
//--- memeriksa syarat untuk membuka posisi pendek
//--- pembentukan corak Evening Star dan MFI>60
  if(CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) && (MFI(1)>60))
     result=80;
//--- memeriksa syarat untuk menutup posisi panjang
//--- persilangan garis isyarat ke tahap terlebih beli/terlebih jual (ke atas 70, ke bawah 30)
  if(((MFI(1)>70) && (MFI(2)<70)) || ((MFI(1)<30) && (MFI(2)>30)))
     result=40;
//--- mengembalikan hasil
   return(result);
  }


2.3. Mencipta Asisten Pakar menggunakan MQL5 Wizard

Kelas CMS_ES_MFI tidak termasuk dalam kelas Pustaka Standard, untuk menggunakannya, anda perlu memuat turun fail ams_es_mfi.mqh (lihat lampiran) dan simpan ke dalam folder data_terminal_klien\MQL5\Include\Expert\Signal\MySignals. Begitu juga dengan fail acandlepatterns.mqh. Anda boleh menggunakan ini dalam MQL5 Wizard selepas memulakan semula MetaEditor.

Untuk mencipta Asisten Pakar, mulakan MQL5 Wizard:

Rajah 4. Mencipta Asisten Pakar menggunakan MQL5 Wizard

Rajah 4. Mencipta Asisten Pakar menggunakan MQL5 Wizard

Mari kita tentukan nama Asisten Pakar:

Rajah 5. Ciri umum Asisten Pakar

Rajah 5. Ciri umum Asisten Pakar

Setelah itu, kita perlu memilih modul isyarat dagangan yang digunakan.

Rajah 6. Ciri isyarat Asisten Pakar

Rajah 6. Ciri isyarat Asisten Pakar

Dalam kes kita, kita hanya menggunakan satu modul isyarat dagangan.

Menambah modul "Isyarat berdasarkan Morning Star/Evening Star disahkan oleh MFI" untuk isyarat dagangan:

Rajah 7. Ciri isyarat Asisten Pakar

Rajah 7. Ciri isyarat Asisten Pakar

Modul isyarat dagangan telah ditambah:

Rajah 8. Ciri isyarat Asisten Pakar

Rajah 8. Ciri isyarat Asisten Pakar

Anda boleh memilih sebarang ciri trailing, tetapi kita akan menggunakan "Trailing Stop tidak digunakan":

Rajah 9. Ciri pengurusan wang Asisten Pakar

Rajah 9. Ciri pengurusan wang Asisten Pakar

Mengenai ciri pengurusan wang, kita akan menggunakan "Dagangan dengan volume dagangan tetap":

Rajah 10. Ciri pengurusan wang Asisten Pakar

Rajah 10. Ciri pengurusan wang Asisten Pakar

Dengan menekan butang "Selesai", kita akan mendapatkan kod Asisten Pakar yang dijana, terletak di Expert_AMS_ES_MFI.mq5, yang akan disimpan di terminal_data_folder\MQL5\Experts\.

Parameter input lalai Asisten Pakar yang dijana adalah:

//--- input untuk isyarat utama
input int            Signal_ThresholdOpen   =10;     // Nilai ambang isyarat untuk membuka [0...100]
input int            Signal_ThresholdClose  =10     // Nilai ambang isyarat untuk menutup [0...100]
input double         Signal_PriceLevel      =0.0    // Tahap harga untuk melaksanakan urus niaga
input double         Signal_StopLevel       =50.0   // Tahap Stop Loss (dalam poin)
input double         Signal_TakeLevel       =50.0    // Tahap Ambil Untung (dalam poin)

perlu digantikan dengan:

//--- input untuk isyarat utama
input int            Signal_ThresholdOpen   =40;     // Nilai ambang isyarat untuk membuka [0...100]
input int            Signal_ThresholdClose  =20     // Nilai ambang isyarat untuk menutup [0...100]
input double         Signal_PriceLevel      =0.0    // Tahap harga untuk melaksanakan urus niaga
input double         Signal_StopLevel       =0.0    // Tahap Stop Loss (dalam poin)
input double         Signal_TakeLevel       =0.0    // Tahap Ambil Untung (dalam poin)

Parameter input Signal_ThresholdOpen/Signal_ThresholdClose membolehkan anda untuk menentukan tahap ambang untuk membuka dan menutup posisi.

Dalam kod kaedah LongCondition() dan ShortCondition() dari kelas isyarat dagangan, kita telah menetapkan nilai tetap untuk ambang:

  • Membuka posisi: 80;
  • Menutup posisi: 40.

Asisten Pakar yang dijana oleh MQL5 Wizard akan membuka dan menutup posisi menggunakan "undi" dari modul isyarat dagangan. Undi dari modul utama (sebagai wadah, ia terdiri daripada semua modul yang ditambah) juga digunakan, tetapi kaedah LongCondition() dan ShortCondition()nya sentiasa mengembalikan 0.

Hasil undi dari modul utama juga digunakan dalam purata "undi". Dalam kes kita, terdapat modul utama + 1 modul isyarat dagangan, jadi kita perlu mengambil kira fakta ini ketika menetapkan nilai ambang. Oleh kerana fakta ini, nilai ThresholdOpen dan ThresholdClose mesti ditetapkan sebagai 40=(0+80)/2 dan 20=(0+40)/2.

Nilai parameter input Signal_StopLevel dan Signal_TakeLevel ditetapkan kepada 0, yang bermaksud bahawa penutupan posisi hanya akan dilakukan apabila syarat penutupan adalah benar.


2.4. Keputusan ujian sejarah

Mari kita lihat ujian Asisten Pakar pada data sejarah (EURUSD H1, tempoh ujian: 2010.01.01-2011.03.16, PeriodMFI=49, MA_period=3).

Dalam mencipta Asisten Pakar, kami menggunakan volum tetap (Dagangan Volum Tetap, 0.1), algoritma Trailing Stop tidak digunakan (Trailing tidak digunakan).

Rajah 11. Keputusan ujian Asisten Pakar, berdasarkan Morning/Evening Stars + MFI

Rajah 11. Keputusan ujian Asisten Pakar, berdasarkan Morning/Evening Stars + MFI


Set parameter input terbaik boleh didapati menggunakan Strategy Tester dari terminal klien MetaTrader 5.

Kod Asisten Pakar yang dicipta oleh MQL5 Wizard dilampirkan dalam expert_ams_es_mfi.mq5.

Siaran berkaitan

Komen (0)