ASCtrendAlert - ตัวช่วยแจ้งสัญญาณซื้อขายใน MetaTrader 5

Mike 2017.01.20 01:38 15 0 0
ไฟล์แนบ

ASCtrend เป็นตัวช่วยในการส่งสัญญาณซื้อขาย พร้อมระบบแจ้งเตือนผ่านอีเมลและการแจ้งเตือนบนมือถือ

ในบทความนี้เราจะพูดถึงการปรับปรุงโค้ดของตัวชี้วัดเพื่อเพิ่มฟีเจอร์แจ้งเตือนทั้งในรูปแบบเสียง อีเมล และการแจ้งเตือนผ่านมือถือ

การเปลี่ยนแปลงในโค้ดตัวชี้วัด

  1. เพิ่มพารามิเตอร์ใหม่ในโค้ดตัวชี้วัด:
    input uint NumberofBar=1;//จำนวนแท่งที่ใช้สำหรับสัญญาณ
    input bool SoundON=true; //เปิดใช้งานการแจ้งเตือนเสียง
    input uint NumberofAlerts=2;//จำนวนการแจ้งเตือน
    input bool EMailON=false; //เปิดใช้งานการส่งอีเมล
    input bool PushON=false; //เปิดใช้งานการส่งการแจ้งเตือนบนมือถือ
    
  2. เพิ่มฟังก์ชันใหม่สามตัวในตอนท้ายของโค้ดตัวชี้วัด: BuySignal(), SellSignal() และ GetStringTimeframe()
    //+------------------------------------------------------------------+
    //| ฟังก์ชันสัญญาณซื้อ                                               |
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,      //ชื่อของตัวชี้วัดสำหรับข้อความในอีเมลและการแจ้งเตือน
                   double &BuyArrow[],        //Buffer สำหรับสัญญาณซื้อ
                   const int Rates_total,     //จำนวนแท่งในปัจจุบัน
                   const int Prev_calculated, //จำนวนแท่งในรอบก่อนหน้า
                   const double &Close[],     //ราคาใกล้เคียง
                   const int &Spread[])       // Spread
      {
    //---
       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);
         }
    
    //---
      }
    //+------------------------------------------------------------------+
    //| ฟังก์ชันสัญญาณขาย                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,      //ชื่อของตัวชี้วัดสำหรับข้อความในอีเมลและการแจ้งเตือน
                    double &SellArrow[],       //Buffer สำหรับสัญญาณขาย
                    const int Rates_total,     //จำนวนแท่งในปัจจุบัน
                    const int Prev_calculated, //จำนวนแท่งในรอบก่อนหน้า
                    const double &Close[],     //ราคาใกล้เคียง
                    const int &Spread[])       // Spread
      {
    //---
       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);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  ฟังก์ชันเพื่อดึงเวลาที่เป็นสตริง                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. เพิ่มการเรียกใช้ฟังก์ชัน BuySignal() และ SellSignal() หลังจากรอบการคำนวณในบล็อก OnCalculate()
    //---
    BuySignal("ASCtrend",BuyBuffer,rates_total,prev_calculated,close,spread);
    SellSignal("ASCtrend",SellBuffer,rates_total,prev_calculated,close,spread);
    //---

โดยที่ BuyBuffer และ SellBuffer คือชื่อของ Buffer ที่ใช้เก็บสัญญาณซื้อและขาย ซึ่งค่าที่ใช้ควรเป็น 0 หรือ EMPTY_VALUE สำหรับค่าที่ว่างเปล่า

นอกจากนี้ เราจะใช้การเรียกใช้ฟังก์ชัน BuySignal() และ SellSignal() เพียงครั้งเดียวในบล็อก OnCalculate() ของโค้ดตัวชี้วัด

Fig.1. ASCtrendAlert indicator on the chart

Fig.1. ตัวชี้วัด ASCtrendAlert บนกราฟ


Fig.2. BykovTrendAlert indicator. Generating alerts

Fig.2. ตัวชี้วัด BykovTrendAlert. การสร้างการแจ้งเตือน

รายการ
ความคิดเห็น 0