Penulis asal:
Paul Stringer
Indikator ini membantu kita mengenal pasti corak Harami dan dilengkapi dengan sistem amaran, e-mel, dan notifikasi. Dengan penggunaan indikator ini, anda akan lebih cepat bertindak dalam membuat keputusan trading.
Berikut adalah beberapa perubahan yang telah dibuat pada kod indikator ini untuk melaksanakan fungsi amaran, mesej e-mel, dan notifikasi:
- Parameter input baru telah ditambah:
input uint BilanganBar=1;//Bilangan bar untuk isyarat input bool BunyiON=true; //Aktifkan amaran input uint BilanganAmaran=2;//Bilangan amaran input bool EMailON=false; //Aktifkan penghantaran isyarat melalui e-mel input bool NotifikasiON=false; //Aktifkan penghantaran isyarat ke peranti mudah alih
- Tiga fungsi baru telah ditambah di akhir kod indikator: BuySignal(), SellSignal(), dan GetStringTimeframe()
//+------------------------------------------------------------------+ //| Fungsi isyarat beli | //+------------------------------------------------------------------+ void BuySignal(string NamaIsyarat, // teks nama indikator untuk mesej e-mel dan notifikasi double &ArrowsBeli[], // buffer indikator dengan isyarat beli const int Bilangan_total, // bilangan bar semasa const int Prev_dikira, // bilangan bar pada tick sebelumnya const double &Tutup[], // harga tutup const int &Spread[]) // spread { //--- static uint pengira=0; if(Bilangan_total!=Prev_dikira) pengira=0; bool IsyaratBeli=false; bool UjiSiri=ArrayGetAsSeries(ArrowsBeli); int indeks; if(UjiSiri) indeks=int(BilanganBar); else indeks=Bilangan_total-int(BilanganBar)-1; if(NormalizeDouble(ArrowsBeli[indeks],_Digits) && ArrowsBeli[indeks]!=EMPTY_VALUE) IsyaratBeli=true; if(IsyaratBeli && pengira<=BilanganAmaran) { pengira++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string teks=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.jam)+":"+string(tm.menit); UjiSiri=ArrayGetAsSeries(Tutup); if(UjiSiri) indeks=int(BilanganBar); else indeks=Bilangan_total-int(BilanganBar)-1; double Tanya=Tutup[indeks]; double TanyaBid=Tutup[indeks]; UjiSiri=ArrayGetAsSeries(Spread); if(UjiSiri) indeks=int(BilanganBar); else indeks=Bilangan_total-int(BilanganBar)-1; TanyaBid+=Spread[indeks]*_Point; string sTanya=DoubleToString(Tanya,_Digits); string sTanyaBid=DoubleToString(TanyaBid,_Digits); string sTemp=GetStringTimeframe(ChartPeriod()); if(BunyiON) Alert("ISYARAT BELI Tanya=",Tanya," TanyaBid=",TanyaBid," waktu sekarang=",teks," Simbol=",Symbol()," Tempoh=",sTemp); if(EMailON) SendMail(NamaIsyarat+": ISYARAT BELI","ISYARAT BELI di Tanya="+sTanya+", TanyaBid="+sTanyaBid+", Tarikh="+teks+" Simbol="+Symbol()+" Tempoh="+sTemp); if(NotifikasiON) SendNotification(NamaIsyarat+": ISYARAT BELI di Tanya="+sTanya+", TanyaBid="+sTanyaBid+", Tarikh="+teks+" Simbol="+Symbol()+" Tempoh="+sTemp); } //--- } //+------------------------------------------------------------------+ //| Fungsi isyarat jual | //+------------------------------------------------------------------+ void SellSignal(string NamaIsyarat, // teks nama indikator untuk mesej e-mel dan notifikasi double &ArrowsJual[], // buffer indikator dengan isyarat jual const int Bilangan_total, // bilangan bar semasa const int Prev_dikira, // bilangan bar pada tick sebelumnya const double &Tutup[], // harga tutup const int &Spread[]) // spread { //--- static uint pengira=0; if(Bilangan_total!=Prev_dikira) pengira=0; bool IsyaratJual=false; bool UjiSiri=ArrayGetAsSeries(ArrowsJual); int indeks; if(UjiSiri) indeks=int(BilanganBar); else indeks=Bilangan_total-int(BilanganBar)-1; if(NormalizeDouble(ArrowsJual[indeks],_Digits) && ArrowsJual[indeks]!=EMPTY_VALUE) IsyaratJual=true; if(IsyaratJual && pengira<=BilanganAmaran) { pengira++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string teks=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.jam)+":"+string(tm.menit); UjiSiri=ArrayGetAsSeries(Tutup); if(UjiSiri) indeks=int(BilanganBar); else indeks=Bilangan_total-int(BilanganBar)-1; double Tanya=Tutup[indeks]; double TanyaBid=Tutup[indeks]; UjiSiri=ArrayGetAsSeries(Spread); if(UjiSiri) indeks=int(BilanganBar); else indeks=Bilangan_total-int(BilanganBar)-1; TanyaBid+=Spread[indeks]*_Point; string sTanya=DoubleToString(Tanya,_Digits); string sTanyaBid=DoubleToString(TanyaBid,_Digits); string sTemp=GetStringTimeframe(ChartPeriod()); if(BunyiON) Alert("ISYARAT JUAL Tanya=",Tanya," TanyaBid=",TanyaBid," waktu sekarang=",teks," Simbol=",Symbol()," Tempoh=",sTemp); if(EMailON) SendMail(NamaIsyarat+": ISYARAT JUAL","ISYARAT JUAL di Tanya="+sTanya+", TanyaBid="+sTanyaBid+", Tarikh="+teks+" Simbol="+Symbol()+" Tempoh="+sTemp); if(NotifikasiON) SendNotification(NamaIsyarat+": ISYARAT JUAL di Tanya="+sTanya+", TanyaBid="+sTanyaBid+", Tarikh="+teks+" Simbol="+Symbol()+" Tempoh="+sTemp); } //--- } //+------------------------------------------------------------------+ //| Mendapatkan tempoh sebagai string | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES tempoh) { //---- return(StringSubstr(EnumToString(tempoh),7,-1)); //---- }
- Beberapa panggilan kepada fungsi BuySignal() dan SellSignal() telah ditambah selepas kitaran pengiraan indikator dalam blok OnCalculate()
//--- BuySignal("Harami_Alert",ArrowsBeli,rates_total,prev_calculated,Tutup,Spread); SellSignal("Harami_Alert",ArrowsJual,rates_total,prev_calculated,Tutup,Spread); //---
Di mana ArrowsBeli dan ArrowsJual adalah nama buffer indikator untuk menyimpan isyarat beli dan jual. Nilai kosong dalam buffer indikator, sama ada sifar atau EMPTY_VALUE harus ditetapkan.
Dijangkakan hanya satu panggilan kepada fungsi BuySignal() dan SellSignal() akan digunakan dalam blok OnCalculate() kod indikator.
Indikator ini pada asalnya ditulis dalam MQL4 dan pertama kali diterbitkan di Pangkalan Kod pada 14.06.2016.

Gambar 1. Indikator Harami_Alert pada carta
Gambar 2. Harami_Alert. Menghasilkan amaran
