Beranda Indikator Teknis Postingan

PPO_SignAlert: Indikator Canggih untuk MetaTrader 5

Lampiran
16108.zip (22.04 KB, Unduh 0 kali)

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:

  1. 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
    
  2. 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));
    //----
      }
  3. 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.1. Indikator PPO_SignAlert di chart

Gambar.2. Indikator PPO_SignAlert. Menghasilkan notifikasi.

Gambar.2. Indikator PPO_SignAlert. Menghasilkan notifikasi.

Postingan terkait

Komentar (0)