Penulis asli:
TrendLaboratory Ltd.
Indikator sinyal panah semaphore ini didasarkan pada osilator Fisher_org_v1 yang meninggalkan area overbought dan oversold, dengan fitur pemberitahuan, mengirim email, dan notifikasi push ke perangkat mobile.
Beberapa perubahan telah dilakukan pada kode indikator untuk menerapkan pemberitahuan, pesan email, dan notifikasi push:
- Menambahkan parameter input baru:
input uint NumberofBar=1;//Jumlah bar untuk sinyal input bool SoundON=true; //Aktifkan pemberitahuan suara input uint NumberofAlerts=2;//Jumlah pemberitahuan input bool EMailON=false; //Aktifkan pengiriman email sinyal input bool PushON=false; //Aktifkan pengiriman sinyal ke perangkat mobile
- Menambahkan tiga fungsi baru di akhir kode indikator: BuySignal(), SellSignal(), dan GetStringTimeframe():
//+------------------------------------------------------------------+ //| Fungsi sinyal beli | //+------------------------------------------------------------------+ void BuySignal(string SignalSirname, // teks nama indikator untuk pesan email dan push double &BuyArrow[], // buffer indikator dengan sinyal beli const int Rates_total, // jumlah bar saat ini const int Prev_calculated, // jumlah bar pada tick sebelumnya const double &Close[], // harga penutupan const int &Spread[]) // spread { u//--- static uint counter=0; if(Rates_total!=Prev_calculated) counter=0; bool BuySignal=false; bool SeriesTest=ArrayGetAsSeries(BuyArrow); int index; if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; if(NormalizeDouble(BuyArrow[index],_Digits) && BuyArrow[index]!=EMPTY_VALUE) BuySignal=true; if(BuySignal && counter<=NumberofAlerts) { counter++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); SeriesTest=ArrayGetAsSeries(Close); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; double Ask=Close[index]; double Bid=Close[index]; SeriesTest=ArrayGetAsSeries(Spread); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SoundON) Alert("Sinyal BUY Ask=",Ask," Bid=",Bid," waktu saat ini=",text," Simbol=",Symbol()," Periode=",sPeriod); if(EMailON) SendMail(SignalSirname+": Pemberitahuan sinyal BUY","Sinyal BUY di Ask="+sAsk+", Bid="+sBid+", Tanggal="+text+" Simbol="+Symbol()+" Periode="+sPeriod); if(PushON) SendNotification(SignalSirname+": Sinyal BUY di Ask="+sAsk+", Bid="+sBid+", Tanggal="+text+" Simbol="+Symbol()+" Periode="+sPeriod); } u//--- } //+------------------------------------------------------------------+ //| Fungsi sinyal jual | //+------------------------------------------------------------------+ void SellSignal(string SignalSirname, // teks nama indikator untuk pesan email dan push double &SellArrow[], // buffer indikator dengan sinyal jual const int Rates_total, // jumlah bar saat ini const int Prev_calculated, // jumlah bar pada tick sebelumnya const double &Close[], // harga penutupan const int &Spread[]) // spread { u//--- static uint counter=0; if(Rates_total!=Prev_calculated) counter=0; bool SellSignal=false; bool SeriesTest=ArrayGetAsSeries(SellArrow); int index; if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; if(NormalizeDouble(SellArrow[index],_Digits) && SellArrow[index]!=EMPTY_VALUE) SellSignal=true; if(SellSignal && counter<=NumberofAlerts) { counter++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); SeriesTest=ArrayGetAsSeries(Close); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; double Ask=Close[index]; double Bid=Close[index]; SeriesTest=ArrayGetAsSeries(Spread); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SoundON) Alert("Sinyal SELL Ask=",Ask," Bid=",Bid," waktu saat ini=",text," Simbol=",Symbol()," Periode=",sPeriod); if(EMailON) SendMail(SignalSirname+": Pemberitahuan sinyal SELL","Sinyal SELL di Ask="+sAsk+", Bid="+sBid+", Tanggal="+text+" Simbol="+Symbol()+" Periode="+sPeriod); if(PushON) SendNotification(SignalSirname+": Sinyal SELL di Ask="+sAsk+", Bid="+sBid+", Tanggal="+text+" Simbol="+Symbol()+" Periode="+sPeriod); } u//--- } //+------------------------------------------------------------------+ //| Mendapatkan timeframe sebagai string | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- Menambahkan beberapa panggilan ke fungsi BuySignal() dan SellSignal() setelah siklus perhitungan indikator di blok OnCalculate():
BuySignal("iWPRSign",BuyBuffer,rates_total,prev_calculated,close,spread); SellSignal("iWPRSign",SellBuffer,rates_total,prev_calculated,close,spread);
Di mana BuyBuffer dan SellBuffer adalah nama buffer indikator untuk menyimpan sinyal beli dan jual. Nilai kosong dalam buffer indikator harus diset menjadi nol atau EMPTY_VALUE.
Diperkirakan bahwa hanya satu panggilan ke fungsi BuySignal() dan SellSignal() yang akan digunakan dalam blok OnCalculate() dari kode indikator.

Gambar 1. Indikator Fisher_org_v1_Sign pada grafik

Gambar 2. Indikator Fisher_org_v1_Sign Menghasilkan pemberitahuan.
Postingan terkait
- Menggunakan Buffer Jam dalam MetaTrader 5 untuk Pengumpulan Data Trading
- Volume Profile + Range v6.0: Indikator Penting untuk MetaTrader 5
- Indikator Open Range Breakout untuk MetaTrader 5: Strategi Trading yang Efektif
- Panduan Menggunakan Kalender Ekonomi untuk Backtesting di MetaTrader 5
- XFisher_org_v1_Vol_Supr_Zer: Indikator Cerdas untuk MetaTrader 5