Laman utama Indikator Teknikal Siaran

ColorXdinMA_Alert: Indikator Trend untuk MetaTrader 5 dengan Notifikasi

Lampiran
17111.zip (22.91 KB, Muat turun 0 kali)

Penulis Asli: dimeon

Hai traders! Hari ini kita akan bincangkan tentang indikator ColorXdinMA yang menarik ini. Ia merupakan indikator purata bergerak (moving average) yang dilengkapi dengan fungsi notifikasi. Dengan ColorXdinMA, anda boleh menerima amaran melalui email dan notifikasi push ke peranti mudah alih anda.

Berikut adalah beberapa perubahan yang telah dilakukan pada kod indikator untuk mengimplementasikan fungsi notifikasi ini:

  1. Enumeration untuk pilihan penghasilan isyarat indikator telah dinyatakan pada skop global sebelum pembolehubah input dinyatakan.
    //+----------------------------------------------------+
    //| Enumeration untuk 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 notifikasi
    input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Mod penghasilan isyarat
    input uint NumberofBar=1;                    //Bilangan bar untuk menghasilkan isyarat
    input bool SoundON=true;                     //Aktifkan notifikasi suara
    input uint NumberofAlerts=2;                 //Bilangan notifikasi
    input bool EMailON=false;                    //Aktifkan pengiriman email untuk isyarat
    input bool PushON=false;                     //Aktifkan penghantaran isyarat ke peranti mudah alih
  3. Ditambah tiga fungsi baru di akhir kod indikator: BuySignal(), SellSignal() dan GetStringTimeframe()
    //+------------------------------------------------------------------+
    //| Fungsi isyarat beli                                             |
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,// teks nama indikator untuk email dan notifikasi
                   double &ColorArray[],// buffer indeks warna
                   int ColorIndex,// indeks warna dalam buffer untuk menghasilkan isyarat
                   const int Rates_total,     // bilangan bar semasa
                   const int Prev_calculated, // bilangan 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," waktu semasa=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": ISYARAT BELI ALERT","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," waktu semasa=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": Isyarat Up Trend ALERT","ISYARAT BELI 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,// teks nama indikator untuk email dan notifikasi
                    double &ColorArray[],       // buffer indeks warna
                    int ColorIndex,             // indeks warna dalam buffer untuk menghasilkan isyarat
                    const int Rates_total,     // bilangan bar semasa
                    const int Prev_calculated, // bilangan 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," waktu semasa=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": ISYARAT JUAL ALERT","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," waktu semasa=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": Isyarat Down Trend ALERT","ISYARAT JUAL 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. Ditambah beberapa panggilan kepada fungsi BuySignal() dan SellSignal() selepas kitaran pengiraan indikator dalam blok OnCalculate()
    //---    
       BuySignal("ColorXdinMA_Alert",ColorXdinMA,1,rates_total,prev_calculated,close,spread);
       SellSignal("ColorXdinMA_Alert",ColorXdinMA,2,rates_total,prev_calculated,close,spread);
    //--- 

Di mana ColorXdinMA adalah nama buffer indeks warna untuk menyimpan warna indikator. Nilai 1 dan 2 adalah nombor warna dalam buffer ini, di mana purata bergerak menaik atau menurun, masing-masing.

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

Indikator ini menggunakan kelas dari pustaka SmoothAlgorithms.mqh (salin ke <terminal_data_folder>\MQL5\Include). Penggunaan kelas ini telah diterangkan dengan mendalam dalam artikel "Rata-rata Siri Harga untuk Pengiraan Sementara Tanpa Menggunakan Buffer Tambahan".

Fig1. Indikator ColorXdinMA_Alert pada carta

Fig1. Indikator ColorXdinMA_Alert pada carta

Fig.2. Indikator ColorXdinMA_Alert. Menghasilkan notifikasi untuk isyarat breakout

Fig.2. Indikator ColorXdinMA_Alert. Menghasilkan notifikasi untuk isyarat breakout

Fig.3. Indikator ColorXdinMA_Alert. Menghasilkan notifikasi untuk isyarat trend

Fig.3. Indikator ColorXdinMA_Alert. Menghasilkan notifikasi untuk isyarat trend

Siaran berkaitan

Komen (0)