WeightOscillator_Alert: Indikator Trend untuk MetaTrader 5 dengan Pemberitahuan

Mike 2017.01.26 18:26 142 0 0
Lampiran

Indikator WeightOscillator merupakan alat trend yang sangat berguna, lengkap dengan fungsi pemberitahuan yang mampu menghantar emel serta notifikasi terus ke telefon pintar anda.

Berikut adalah perubahan yang telah dilakukan pada kod indikator untuk menambah baik fungsi pemberitahuan, emel dan notifikasi:

  1. Pengenalan enum untuk pilihan penghasilan isyarat indikator ditetapkan di skop global sebelum pembolehubah input ditentukan.
    //+----------------------------------------------------+
    //| Pengenalan pilihan penghasilan isyarat   |
    //+----------------------------------------------------+
    enum ENUM_SIGNAL_MODE
      {
       MODE_SIGNAL,  //Isyarat breakout
       MODE_TREND    //Isyarat breakout dan trend
      };
  2. Parameter input baru diperkenalkan
    //---- Pembolehubah input untuk pemberitahuan
    input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Mod penghasilan isyarat
    inputuint NumberofBar=1;                    //Bilangan bar untuk menghasilkan isyarat
    inputbool SoundON=true;                     //Aktifkan pemberitahuan bunyi
    inputuint NumberofAlerts=2;                 //Bilangan pemberitahuan
    inputbool EMailON=false;                    //Aktifkan penghantaran emel isyarat
    inputbool PushON=false;                     //Aktifkan penghantaran isyarat ke peranti mudah alih
  3. Tiga fungsi baru ditambah di hujung kod indikator: BuySignal(), SellSignal() dan GetStringTimeframe()
    //+------------------------------------------------------------------+
    //| Fungsi isyarat beli                                              |
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,// nama indikator untuk emel dan notifikasi
                   double &ColorArray[],// buffer indeks warna
                   int ColorIndex,// indeks warna dalam buffer untuk menghasilkan isyarat
                   constint Rates_total,     // jumlah bar semasa
                   constint Prev_calculated, // jumlah bar pada tick sebelumnya
                   constdouble &Close[],     // harga tutup
                   constint &Spread[])       // spread
      {
    //---
       staticuint counter=0;
       if(Rates_total!=Prev_calculated) counter=0;

       bool BuySignal=false;
       bool SeriesTest=ArrayGetAsSeries(ColorArray);
       int index,index1;
       if(SeriesTest)
         {
          index=int(NumberofBar);
          index1=index+1;
         }
       else
         {
          index=Rates_total-int(NumberofBar)-1;
          index1=index-1;
         }
       if(SignMode==MODE_SIGNAL)
         {
          if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) BuySignal=true;
         }
       else
         {
          if(ColorArray[index]==ColorIndex) 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;
          doubleAsk=Close[index];
          doubleBid=Close[index];
          SeriesTest=ArrayGetAsSeries(Spread);
          if(SeriesTest) index=int(NumberofBar);
          else index=Rates_total-int(NumberofBar)-1;
          Bid+=_Point*Spread[index];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriod=GetStringTimeframe(ChartPeriod());
          if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
            {
             if(SoundON) Alert("ISYARAT BELI Ask=",Ask," Bid=",Bid," masa sekarang=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": Isyarat BELI telah dihantar","ISYARAT BELI pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
             if(PushON) SendNotification(SignalSirname+": ISYARAT BELI pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
        }
          else
            {
             if(SoundON) Alert("Isyarat Up Trend Ask=",Ask," Bid=",Bid," masa sekarang=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": Isyarat Up Trend telah dihantar","ISYARAT Up Trend pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
             if(PushON) SendNotification(SignalSirname+": Isyarat Up Trend pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
        }
         }

    //---
      }
    //+------------------------------------------------------------------+
    //| Fungsi isyarat jual                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,// nama indikator untuk emel dan notifikasi
                    double &ColorArray[],       // buffer indeks warna
                    int ColorIndex,             // indeks warna dalam buffer untuk menghasilkan isyarat
                    constint Rates_total,     // jumlah bar semasa
                    constint Prev_calculated, // jumlah bar pada tick sebelumnya
                    constdouble &Close[],     // harga tutup
                    constint &Spread[])       // spread
      {
    //---
       staticuint counter=0;
       if(Rates_total!=Prev_calculated) counter=0;

       bool SellSignal=false;
       bool SeriesTest=ArrayGetAsSeries(ColorArray);
       int index,index1;
       if(SeriesTest)
         {
          index=int(NumberofBar);
          index1=index+1;
         }
       else
         {
          index=Rates_total-int(NumberofBar)-1;
          index1=index-1;
         }

       if(SignMode==MODE_SIGNAL)
         {
          if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) SellSignal=true;
         }
       else
         {
          if(ColorArray[index]==ColorIndex) 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;
          doubleAsk=Close[index];
          doubleBid=Close[index];
          SeriesTest=ArrayGetAsSeries(Spread);
          if(SeriesTest) index=int(NumberofBar);
          else index=Rates_total-int(NumberofBar)-1;
          Bid+=_Point*Spread[index];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriod=GetStringTimeframe(ChartPeriod());
          if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
            {
             if(SoundON) Alert("ISYARAT JUAL Ask=",Ask," Bid=",Bid," masa sekarang=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": Isyarat JUAL telah dihantar","ISYARAT JUAL pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
             if(PushON) SendNotification(SignalSirname+": ISYARAT JUAL pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
            }
          else
            {
             if(SoundON) Alert("Isyarat Down Trend Ask=",Ask," Bid=",Bid," masa sekarang=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": Isyarat Down Trend telah dihantar","ISYARAT Down Trend pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
             if(PushON) SendNotification(SignalSirname+": Isyarat Down Trend pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
            }
         }
    //---
      }
    //+------------------------------------------------------------------+
    //| Mendapatkan tempoh masa sebagai string |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
  4. Beberapa panggilan kepada fungsi BuySignal() dan SellSignal() ditambah selepas kitaran pengiraan indikator dalam blok OnCalculate()
    //---    
       BuySignal("WeightOscillator_Alert",ColorBuffer,0,rates_total,prev_calculated,close,spread);
       SellSignal("WeightOscillator_Alert",ColorBuffer,4,rates_total,prev_calculated,close,spread);
    //---  

    Di mana ColorBuffer ialah nama buffer indeks warna untuk menyimpan warna indikator. Nilai 0 dan 4 adalah nombor warna dalam buffer ini, di mana osilator berada dalam kawasan terlebih beli dan terlebih jual, masing-masing.

    Diharapkan hanya satu panggilan kepada fungsi BuySignal() dan SellSignal() akan digunakan dalam blok OnCalculate() kod indikator.

    Indikator ini menggunakan kelas dalam perpustakaan SmoothAlgorithms.mqh (salin ke <terminal_data_folder>\MQL5\Include). Penggunaan kelas ini telah diterangkan secara terperinci dalam artikel "Rata-rata siri harga untuk pengiraan sementara tanpa menggunakan buffer tambahan".

    Fig1. Indikator WeightOscillator_Alert pada carta

    Fig1. Indikator WeightOscillator_Alert pada carta

    Fig.3. Indikator WeightOscillator_Alert. Menghasilkan pemberitahuan untuk isyarat trend

    Fig.2. Indikator WeightOscillator_Alert. Menghasilkan pemberitahuan untuk isyarat breakout

    Fig.3. Indikator WeightOscillator_Alert. Menghasilkan pemberitahuan untuk isyarat trend

    Fig.3. Indikator WeightOscillator_Alert. Menghasilkan pemberitahuan untuk isyarat trend

Senarai
Komen 0