Laman utama Indikator Teknikal Siaran

WeightOscillator_Alert: Indikator Trend untuk MetaTrader 5 dengan Pemberitahuan

Lampiran
17091.zip (24.09 KB, Muat turun 0 kali)

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
    input uint NumberofBar=1;                    //Bilangan bar untuk menghasilkan isyarat
    input bool SoundON=true;                     //Aktifkan pemberitahuan bunyi
    input uint NumberofAlerts=2;                 //Bilangan pemberitahuan
    input bool EMailON=false;                    //Aktifkan penghantaran emel isyarat
    input bool 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
                   const int Rates_total,     // jumlah bar semasa
                   const int Prev_calculated, // jumlah bar pada tick sebelumnya
                   const double &Close[],     // harga tutup
                   const int &Spread[])       // spread
      {
    //---
       static uint 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;
          double Ask=Close[index];
          double Bid=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
                    const int Rates_total,     // jumlah bar semasa
                    const int Prev_calculated, // jumlah bar pada tick sebelumnya
                    const double &Close[],     // harga tutup
                    const int &Spread[])       // spread
      {
    //---
       static uint 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;
          double Ask=Close[index];
          double Bid=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

    Siaran berkaitan

Komen (0)