iWPRSignAlert: Penunjuk Hebat untuk MetaTrader 5

Mike 2016.07.20 23:43 33 0 0
Lampiran

iWPRSignAlert adalah indikator yang menggunakan isyarat panah semaphore berdasarkan osilator Williams’ Percent Range klasik. Ia berfungsi untuk memberi amaran apabila harga memasuki kawasan terlebih beli atau terlebih jual, dengan ciri-ciri seperti pemberitahuan, penghantaran emel, dan notifikasi ke perangkat mudah alih.

Bagi meningkatkan fungsi pemberitahuan dalam indikator ini, beberapa perubahan telah dilakukan pada kod indikator:

  1. Diperkenalkan parameter input baru:
    inputuint NumberofBar=1;//Bilangan bar untuk isyaratinputbool SoundON=true;//Aktifkan amaraninputuint NumberofAlerts=2;//Bilangan amaraninputbool EMailON=false;//Aktifkan penghantaran emel isyaratinputbool PushON=false;//Aktifkan penghantaran isyarat ke perangkat mudah alih
  2. Menambah tiga fungsi baru di akhir kod indikator: BuySignal(), SellSignal(), dan GetStringTimeframe()
    //+------------------------------------------------------------------+//| Fungsi isyarat beli                                            |//+------------------------------------------------------------------+void BuySignal(string SignalSirname,      // nama indikator untuk emel dan notifikasi
                   double &BuyArrow[],        // buffer indikator dengan isyarat beli
                   constint Rates_total,     // bilangan bar semasa
                   constint Prev_calculated, // bilangan 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(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;
          doubleAsk=Close[index];
          doubleBid=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);
         }
    
    //---
      }
    //+------------------------------------------------------------------+//| Fungsi isyarat jual                                             |//+------------------------------------------------------------------+void SellSignal(string SignalSirname,      // nama indikator untuk emel dan notifikasi
                    double &SellArrow[],       // buffer indikator dengan isyarat jual
                    constint Rates_total,     // bilangan bar semasa
                    constint Prev_calculated, // bilangan 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(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;
          doubleAsk=Close[index];
          doubleBid=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);
         }
    //---
      }
    //+------------------------------------------------------------------+//| Mendapatkan timeframe dalam bentuk string                        |//+------------------------------------------------------------------+string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. Menambah beberapa panggilan kepada fungsi BuySignal() dan SellSignal() selepas pengiraan indikator dalam blok OnCalculate()
    BuySignal("iWPRSign",BuyBuffer,rates_total,prev_calculated,close,spread);
        SellSignal("iWPRSign",SellBuffer,rates_total,prev_calculated,close,spread);
    

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

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

Fig.1. Penunjuk iWPRSignAlert

Fig.1. Penunjuk iWPRSignAlert di carta

Fig.2. Penunjuk iWPRSignAlert menjana amaran

Fig.2. Penunjuk iWPRSignAlert. Menjana amaran.

Senarai
Komen 0