Halo trader! Kali ini kita akan membahas tentang PPO_SignAlert, sebuah indikator yang dirancang khusus untuk MetaTrader 5. Indikator ini menggunakan sinyal semaphore yang berbasis pada rate of price change yang halus secara relatif dan dilengkapi dengan fitur notifikasi, pengiriman email, serta push-notifikasi ke perangkat mobile kamu.
Berikut adalah beberapa perubahan yang telah dilakukan pada kode indikator ini untuk mengimplementasikan fitur-fitur tersebut:
- Penambahan parameter input baru:
input uint NumberofBar=1;//Jumlah bar untuk sinyal input bool SoundON=true; //Aktifkan notifikasi suara input uint NumberofAlerts=2;//Jumlah notifikasi input bool EMailON=false; //Aktifkan pengiriman sinyal via email input bool PushON=false; //Aktifkan pengiriman sinyal ke perangkat mobile
- Penambahan tiga fungsi baru di akhir kode indikator: BuySignal(), SellSignal(), dan GetStringTimeframe()
//+------------------------------------------------------------------+ //| Fungsi sinyal beli | //+------------------------------------------------------------------+ void BuySignal(string SignalSirname, // nama indikator untuk pesan email dan push double &BuyArrow[], // buffer indikator untuk 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("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } u//--- } //+------------------------------------------------------------------+ //| Fungsi sinyal jual | //+------------------------------------------------------------------+ void SellSignal(string SignalSirname, // nama indikator untuk pesan email dan push double &SellArrow[], // buffer indikator untuk 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("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } u//--- } //+------------------------------------------------------------------+ //| Mendapatkan timeframe dalam bentuk string | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- Menambahkan beberapa panggilan ke fungsi BuySignal() dan SellSignal() setelah siklus perhitungan indikator dalam blok OnCalculate()
u//--- BuySignal("PPO_Sign",BuyBuffer,rates_total,prev_calculated,close,spread); SellSignal("PPO_Sign",SellBuffer,rates_total,prev_calculated,close,spread); u//---
Di mana BuyBuffer dan SellBuffer adalah nama buffer indikator untuk menyimpan sinyal beli dan jual. Pastikan nilai kosong dalam buffer indikator diatur ke nol atau EMPTY_VALUE.
Indikator ini menggunakan kelas dari pustaka SmoothAlgorithms.mqh (salin ke <folder_data_terminal>\MQL5\Include). Penggunaan kelas ini telah dijelaskan secara mendetail dalam artikel "Averaging Price Series for Intermediate Calculations Without Using Additional Buffers".
Awalnya, indikator ini ditulis dalam MQL4 dan pertama kali dipublikasikan di Code Base pada 08.03.2008.

Gambar.1. Indikator PPO_SignAlert di chart
Gambar.2. Indikator PPO_SignAlert. Menghasilkan notifikasi.
Postingan terkait
- Indikator Open Range Breakout untuk MetaTrader 5: Strategi Trading yang Efektif
- Volume Profile + Range v6.0: Indikator Penting untuk MetaTrader 5
- iSpread: Indikator Spread untuk Pair Trading di MetaTrader 5
- Panduan Lengkap Menggunakan Indikator METRO_Stochastic_HTF_Signal di MetaTrader 5
- Panduan Menggunakan Kalender Ekonomi untuk Backtesting di MetaTrader 5
