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
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
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:
- jika MFI telah mencapai tahap kritikal yang bertentangan (70 untuk posisi panjang dan 30 untuk posisi pendek)
- 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
- 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
Pembentukan corak "Morning Star" mesti disahkan oleh indikator MFI: MFi(1)<40 (nilai indikator MFI pada bar terakhir mesti kurang dari 40).
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
Pembentukan corak "Evening Star" mesti disahkan oleh indikator MFI: MFI(1)>60 (nilai indikator MFI pada bar terakhir mesti lebih dari 60).
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
Mari kita tentukan nama Asisten Pakar:

Rajah 5. Ciri umum Asisten Pakar
Setelah itu, kita perlu memilih modul isyarat dagangan yang digunakan.

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
Modul isyarat dagangan telah ditambah:

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
Mengenai ciri pengurusan wang, kita akan menggunakan "Dagangan dengan volume dagangan tetap":

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
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
- Mengenal MQL5 Wizard: Isyarat Dagangan Berdasarkan Pola Bullish dan Bearish Engulfing + MFI
- Panduan Lengkap MQL5 Wizard untuk Isyarat Dagangan: Garisan Pertemuan Bullish/Bearish dan MFI
- MQL5 Wizard: Cipta Isyarat Dagangan dengan Bullish dan Bearish Harami + MFI
- MQL5 Wizard: Cipta Sinyal Dagangan Menggunakan Pola Candlestick Hammer dan Hanging Man
- MQL5 Wizard: Cipta Signal Dagangan Berdasarkan Corak Lilin 3 Hitam dan 3 Putih + MFI