MQL5 Wizard membolehkan anda mencipta Pembantu Pakar siap sedia berdasarkan kelas Perpustakaan Standard yang disediakan bersama terminal klien (lihat Mewujudkan Pembantu Pakar Sedia Ada dalam MQL5 Wizard untuk butiran lanjut). Ia membolehkan anda menyemak idea dagangan dengan cepat, hanya perlu mencipta kelas isyarat dagangan anda sendiri. Struktur kelas ini dan contoh boleh ditemui dalam artikel MQL5 Wizard: Cara Mencipta Modul Isyarat Dagangan.
Idea amnya adalah seperti berikut: kelas isyarat dagangan diturunkan daripada CExpertSignal, seterusnya, perlu menggantikan kaedah LongCondition() dan ShortCondition() dengan kaedah anda sendiri.
Terdapat sebuah buku "Strategi Pedagang Terbaik" (dalam bahasa Rusia), di mana banyak strategi dagangan dibincangkan, kita akan fokus kepada corak candlestick pembalikan, yang disahkan oleh Stochastic, CCI, MFI dan RSI.
Cara terbaik adalah dengan mencipta kelas yang berasingan, diturunkan dari CExpertSignal untuk menyemak pembentukan corak candlestick. Untuk mengesahkan isyarat dagangan yang dihasilkan oleh corak candlestick, cukup untuk menulis kelas yang diturunkan dari CCandlePattern dan menambah ciri-ciri yang diperlukan (contohnya, pengesahan oleh osilator).
Di sini kita akan mempertimbangkan isyarat yang berdasarkan corak pembalikan "Bintang Pagi/Bintang Malam" (Morning Doji Star/Evening Doji Star), yang disahkan oleh indikator CCI. Modul isyarat dagangan ini berdasarkan kelas CCandlePattern, yang merupakan contoh mudah penggunaannya untuk mencipta isyarat dagangan dengan corak candlestick.
1. Corak Candlestick Pembalikan: "Bintang Pagi" dan "Bintang Malam"
1.1. Bintang Pagi
Corak ini menunjukkan pembalikan daripada trend menurun, ia terdiri daripada tiga lilin (Lihat Rajah 1). Selepas lilin hitam yang panjang, terdapat lilin (warna tidak penting) dengan badan kecil yang terletak di luar badan lilin hitam. Badan kecil lilin menunjukkan bahawa kekuatan lembu dan beruang adalah sama dan pasaran bersedia untuk mengubah arah trend.
Lilin ketiga dalam corak ini adalah lilin bullish, badannya tidak bertindih dengan badan lilin kedua, dan harga tutup terletak dalam badan lilin pertama (bearish). Lilin yang terhasil daripada model ini juga ditunjukkan dalam Rajah 1.
Sekiranya lilin kedua adalah lilin seperti doji, model ini dipanggil "Bintang Doji Pagi".

Fig. 1. Corak Candlestick 'Bintang Pagi' dan 'Bintang Doji Pagi'
Pengesahan corak "Bintang Pagi" dilakukan dalam kaedah CheckPatternMorningStar() dan CheckPatternMorningDoji() dari kelas CCandlePattern:
//+------------------------------------------------------------------+ //| Semak pembentukan corak "Bintang Pagi" | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternMorningStar() { //--- Bintang Pagi if((Open(3)-Close(3)>AvgBody(1)) && // lilin bearish, badannya lebih besar daripada badan lilin purata (MathAbs(Close(2)-Open(2)<AvgBody(1)*0.5) && // lilin kedua mempunyai badan kecil (kurang daripada separuh badan purata) (Close(2)<Close(3)) && // tutup lilin kedua lebih rendah daripada tutup lilin pertama (Open(2)<Open(3)) && // buka lilin kedua lebih rendah daripada buka lilin pertama (Close(1)>MidOpenClose(3))) // tutup lilin terakhir lebih tinggi daripada pusat lilin pertama return(true); //--- return(false); }
Kaedah CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) dan CheckCandlestickPattern(CANDLE_PATTERN_MORNING_DOJI) digunakan untuk menyemak pembentukan corak "Bintang Pagi" dan "Bintang Doji Pagi".
1.2. Bintang Malam
Corak ini menunjukkan pembalikan daripada trend menaik, ia terdiri daripada tiga lilin (Lihat Rajah 2). Selepas lilin putih yang panjang, terdapat lilin (warna tidak penting) dengan badan kecil, yang terletak di luar badan lilin putih. Badan kecil lilin menunjukkan bahawa kekuatan lembu dan beruang adalah sama dan pasaran bersedia untuk mengubah arah trend.
Lilin ketiga dalam corak ini adalah lilin bearish, badannya tidak bertindih dengan badan lilin kedua, dan harga tutup terletak dalam badan lilin pertama (bullish). Lilin yang terhasil daripada model ini juga ditunjukkan dalam Rajah 2.
Sekiranya lilin kedua adalah lilin seperti doji, model ini dipanggil "Bintang Doji Malam".

Fig. 2. Corak Candlestick 'Bintang Malam' dan 'Bintang Doji Malam'
Berikut adalah kaedah untuk mengenal pasti corak "Bintang Malam" dan "Bintang Doji Malam":
//+------------------------------------------------------------------+ //| Semak pembentukan corak "Bintang Malam" | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternEveningStar() { //--- Bintang Malam if((Close(3)-Open(3)>AvgBody(1)) && // lilin bullish dengan badan lebih tinggi daripada badan purata (MathAbs(Close(2)-Open(2)<AvgBody(1)*0.5) && // lilin kedua mempunyai badan kecil (kurang daripada separuh badan purata)   (Close(2)>Close(3)) && // tutup lilin kedua lebih tinggi daripada tutup lilin pertama (Open(2)>Open(3)) && // buka lilin kedua lebih tinggi daripada buka lilin pertama (Close(1)<MidOpenClose(3))) // tutup lilin terakhir lebih rendah daripada pusat lilin pertama return(true); //--- return(false); }
Kaedah CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) dan CheckCandlestickPattern(CANDLE_PATTERN_EVENING_DOJI) digunakan untuk menyemak pembentukan corak "Bintang Malam" dan "Bintang Doji Malam".
2. Sinyal Dagangan yang Disahkan oleh Indikator CCI
Isyarat dagangan untuk membuka posisi panjang atau pendek mesti disahkan oleh indikator CCI. Nilai CCI mesti lebih besar/kecil daripada tahap kritikal (-50 untuk posisi panjang dan 50 untuk posisi pendek).
Penutupan posisi yang dibuka bergantung kepada nilai CCI. Ia boleh dilakukan dalam 2 kes:
- jika garis CCI telah mencapai tahap kritikal yang bertentangan (80 untuk posisi panjang dan -80 untuk posisi pendek)
- jika isyarat pembalikan tidak disahkan (apabila CCI mencapai tahap berikut: -80 untuk posisi panjang dan 80 untuk posisi pendek)

Fig. 3. Corak 'Bintang Malam', disahkan oleh indikator CCI
- int CMS_ES_CCI::LongCondition() - memeriksa syarat untuk membuka posisi panjang (mengembalikan 80) dan menutup posisi pendek (mengembalikan 40);
- int CMS_ES_CCI::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 "Bintang Pagi" mesti disahkan oleh indikator CCI: CCI(1)<-50 (nilai CCI bar yang telah selesai mesti kurang daripada -50).
Posisi pendek mesti ditutup jika indikator CCI telah melintasi ke atas tahap kritikal -80 atau melintasi ke bawah tahap kritikal 80.
//+------------------------------------------------------------------+ //| Memeriksa syarat untuk masuk dan keluar dari pasaran | //| 1) Masuk pasaran (buka posisi panjang, hasil=80)| //| 2) Keluar dari pasaran (tutup posisi pendek, hasil=40)| //+------------------------------------------------------------------+ int CMS_ES_CCI::LongCondition() { int result=0; //--- idx boleh digunakan untuk menentukan mod kerja Pembantu Pakar //--- idx=0 - dalam kes ini EA memeriksa syarat dagangan pada setiap tick //--- idx=1 - dalam kes ini EA hanya memeriksa syarat dagangan pada bar berita int idx =StartIndex(); //--- memeriksa syarat untuk membuka posisi panjang //--- pembentukan corak Bintang Pagi dan CCI<-50 if(CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) && (CCI(1)<-50)) result=80; //--- memeriksa syarat untuk menutup posisi pendek //--- lintasan garis isyarat aras terlebih beli/terlebih jual (ke bawah -80, ke bawah -80) if(((CCI(1)>-80) && (CCI(2)<-80)) || ((CCI(1)<80) && (CCI(2)>80))) result=40; //--- mengembalikan hasil return(result); }
2.2. Membuka Posisi Pendek/Menutup Posisi Panjang
Pembentukan corak "Bintang Malam" mesti disahkan oleh indikator CCI: CCI(1)>50 (nilai CCI indikator bar yang telah selesai mesti lebih besar daripada 50).
Posisi panjang mesti ditutup jika indikator CCI telah melintasi ke bawah -80 atau 80.
//+------------------------------------------------------------------+ //| Memeriksa syarat untuk masuk dan keluar dari pasaran | //| 1) Masuk pasaran (buka posisi pendek, hasil=80)| //| 2) Keluar dari pasaran (tutup posisi panjang, hasil=40)| //+------------------------------------------------------------------+ int CMS_ES_CCI::ShortCondition() { int result=0; //--- idx boleh digunakan untuk menentukan mod kerja Pembantu Pakar //--- idx=0 - dalam kes ini EA memeriksa syarat dagangan pada setiap tick //--- idx=1 - dalam kes ini EA hanya memeriksa syarat dagangan pada bar berita int idx =StartIndex(); //--- memeriksa syarat untuk membuka posisi pendek //--- pembentukan corak Bintang Malam dan CCI>50 if(CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) && (CCI(1)>50)) result=80; //--- memeriksa syarat untuk menutup posisi panjang //--- lintasan garis isyarat aras terlebih beli/terlebih jual (ke bawah -80, ke bawah 80) if(((CCI(1)<80) && (CCI(2)>80)) || ((CCI(1)<-80) && (CCI(2)>-80))) result=40; //--- mengembalikan hasil return(result); }
2.3. Mewujudkan Pembantu Pakar menggunakan MQL5 Wizard
Kelas CMS_ES_CCI tidak termasuk dalam kelas Perpustakaan Standard, untuk menggunakannya, perlu memuat turun fail acms_es_cci.mqh (lihat lampiran) dan menyimpannya ke dalam folder_data_terminal_klien\MQL5\Include\Expert\Signal\MySignals. Perkara yang sama perlu dilakukan dengan fail candlepatterns.mqh. Anda boleh menggunakannya dalam MQL5 Wizard selepas memulakan semula MetaEditor.
Untuk mencipta Pembantu Pakar, lancarkan MQL5 Wizard:

Fig. 4. Mewujudkan Pembantu Pakar menggunakan MQL5 Wizard
Mari kita tentukan nama Pembantu Pakar:

Fig. 5. Ciri umum Pembantu Pakar
Selepas itu kita perlu memilih modul isyarat dagangan yang digunakan.

Fig. 6. Ciri isyarat Pembantu Pakar
Dalam kes kita hanya menggunakan satu modul isyarat dagangan.
Menambah modul isyarat "Sinyal Berdasarkan Bintang Pagi/Malam Disahkan oleh CCI":

Fig. 7. Ciri isyarat Pembantu Pakar
Modul isyarat dagangan telah ditambah:

Fig. 8. Ciri isyarat Pembantu Pakar
Anda boleh memilih sebarang ciri trailing, tetapi kita akan menggunakan "Trailing Stop tidak digunakan":

Fig. 9. Ciri pengurusan wang Pembantu Pakar
Berkenaan dengan ciri pengurusan wang, kita akan menggunakan "Dagangan dengan jumlah dagangan tetap":

Fig. 10. Ciri pengurusan wang Pembantu Pakar
Dengan menekan butang "Siap", kita akan mendapatkan kod Pembantu Pakar yang dihasilkan, terletak di Expert_AMS_ES_CCI.mq5, ia akan disimpan di terminal_data_folder\MQL5\Experts\.
Parameter input lalai Pembantu Pakar yang dihasilkan:
//--- input untuk isyarat utama input int Signal_ThresholdOpen =10; // Nilai ambang isyarat untuk dibuka [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 mata) input double Signal_TakeLevel =50.0; // Tahap Take Profit (dalam mata)
perlu digantikan kepada:
//--- input untuk isyarat utama input int Signal_ThresholdOpen =40; // Nilai ambang isyarat untuk dibuka [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 mata) input double Signal_TakeLevel =0.0 // Tahap Take Profit (dalam mata)
Parameter input Signal_ThresholdOpen/Signal_ThresholdClose membolehkan untuk menetapkan tahap ambang untuk membuka dan menutup posisi.
Dalam kod kaedah LongCondition() dan ShortCondition() kelas isyarat dagangan, kita telah menetapkan nilai tetap untuk ambang:
- Buka posisi: 80;
- Tutup posisi: 40.
Pembantu Pakar yang dihasilkan oleh MQL5 Wizard membuka dan menutup posisi menggunakan "undian" dari modul isyarat dagangan. Undian modul utama (sebagai bekas, ia terdiri daripada semua modul yang ditambah) juga digunakan, tetapi kaedah LongCondition() dan ShortCondition() sentiasa mengembalikan 0.
Keputusan undian modul utama juga digunakan dalam purata "undian". Dalam kes kita, terdapat modul utama + 1 modul isyarat dagangan, jadi kita perlu mengambil kira fakta ini semasa menetapkan nilai ambang. Oleh kerana fakta ini, ThresholdOpen dan ThresholdClose mesti ditetapkan sebagai 40=(0+80)/2 dan 20=(0+40)/2.
