DSSBressertSignAlert: Indikator Hebat untuk MetaTrader 5

Mike 2016.09.19 21:41 50 0 0
Lampiran

Hai para trader! Hari ini kita akan membincangkan tentang indikator DSSBressertSignAlert, yang merupakan alat yang sangat berguna untuk MetaTrader 5. Indikator ini menggunakan algoritma DSSBressert dan mempunyai ciri-ciri menarik seperti pemberitahuan, pengiriman email, dan notifikasi ke perangkat mobile.

Berikut adalah beberapa perubahan yang telah dibuat pada kod indikator ini untuk mengaktifkan notifikasi, mesej email, dan pemberitahuan:

  1. Parameter input baru telah diperkenalkan:
    input uint NumberofBar=1;//Bilangan bar untuk isyarat
    input bool SoundON=true; //Aktifkan notifikasi
    input uint NumberofAlerts=2;//Bilangan notifikasi
    input bool EMailON=false; //Aktifkan pengiriman isyarat melalui email
    input bool PushON=false; //Aktifkan pengiriman isyarat ke perangkat mobile
    
  2. Tiga fungsi baru telah ditambahkan di akhir kod indikator: BuySignal(), SellSignal(), dan GetStringTimeframe():
    //+------------------------------------------------------------------+
    //| Fungsi isyarat beli                                          |
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,      // nama indikator untuk mesej email dan notifikasi
                   double &BuyArrow[],        // buffer indikator dengan isyarat beli
                   const int Rates_total,     // bilangan bar semasa
                   const int Prev_calculated, // bilangan bar pada tick sebelum ini
                   const double &Close[],     // harga tutup
                   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 isyarat jual                                           |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,      // nama indikator untuk mesej email dan notifikasi
                    double &SellArrow[],       // buffer indikator dengan isyarat jual
                    const int Rates_total,     // bilangan bar semasa
                    const int Prev_calculated, // bilangan bar pada tick sebelum ini
                    const double &Close[],     // harga tutup
                    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 sebagai string                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. Beberapa panggilan kepada fungsi BuySignal() dan SellSignal() telah ditambahkan selepas kitaran pengiraan indikator dalam blok OnCalculate():
    u//---     
       BuySignal("DSSBressertSignAlert",BuyBuffer,rates_total,prev_calculated,close,spread);
       SellSignal("DSSBressertSignAlert",SellBuffer,rates_total,prev_calculated,close,spread);
    u//---
    

Di mana BuyBuffer dan SellBuffer adalah nama buffer indikator untuk menyimpan isyarat beli dan jual. Pastikan nilai kosong dalam buffer indikator adalah sama ada sifar atau EMPTY_VALUE.

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

Indikator ini menggunakan kelas perpustakaan SmoothAlgorithms.mqh (salin ke <terminal_data_folder>\MQL5\Include). Penggunaan kelas-kelas ini telah diterangkan dengan mendalam dalam artikel "Averaging Price Series for Intermediate Calculations Without Using Additional Buffers".


Fig.1. The DSSBressertSignAlert indicator on the chart

Fig.1. Indikator DSSBressertSignAlert di carta

Fig.2. The DSSBressertSignAlert indicator. Generating alerts.

Fig.2. Indikator DSSBressertSignAlert. Menghasilkan pemberitahuan.

Senarai
Komen 0