보조지표 게시글

초보자 경고 지표 - MetaTrader 5에서 활용하기

첨부파일
16448.zip (3.75 KB, 다운로드 0회)

저자: EarnForex

초보자 경고 지표는 현재 추세의 극대값과 극소값을 표시하여 지지와 저항 포인트로 활용할 수 있습니다. 이 지표는 현재 추세의 채널을 파악하는 데 유용합니다. 또한 알림 기능이 있어 이메일과 모바일 기기로 푸시 알림을 보낼 수 있습니다.

이 지표는 특정 기간을 사용하여 최소값과 최대값을 찾아 점으로 표시하는 간단한 지표입니다.

알림, 이메일 메시지 및 푸시 알림 기능을 구현하기 위해 다음과 같은 변경 사항이 지표 코드에 적용되었습니다:

  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[],        // 매수 신호가 있는 지표 버퍼
                   const int Rates_total,     // 현재 바 수
                   const int Prev_calculated, // 이전 틱의 바 수
                   const double &Close[],     // 종가
                   const int &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 신호 
     Ask=",Ask,"
     Bid=",Bid,"
     currtime=",text,"
     Symbol=",Symbol()," Period=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": BUY 신호 알림","BUY 신호 at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": BUY 신호 at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
         }
    
    //---
      }
    //+------------------------------------------------------------------+
    //| 매도 신호 함수                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,      // 이메일 및 푸시 메시지를 위한 지표 이름 텍스트
                    double &SellArrow[],       // 매도 신호가 있는 지표 버퍼
                    const int Rates_total,     // 현재 바 수
                    const int Prev_calculated, // 이전 틱의 바 수
                    const double &Close[],     // 종가
                    const int &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 신호 
     Ask=",Ask,"
     Bid=",Bid,"
     currtime=",text,"
     Symbol=",Symbol()," Period=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": SELL 신호 알림","SELL 신호 at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": SELL 신호 at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  시간대를 문자열로 가져오기                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. OnCalculate() 블록에서 BuySignal() 및 SellSignal() 함수 호출 추가:
    //---     
       BuySignal("BeginnerAlert",BuyBuffer,rates_total,prev_calculated,Close,spread);
       SellSignal("BeginnerAlert",SellBuffer,rates_total,prev_calculated,Close,spread);
    //--- 
    

여기서 BuyBuffer와 SellBuffer는 매수 및 매도 신호를 저장하기 위한 지표 버퍼의 이름입니다. 지표 버퍼의 비어 있는 값은 0 또는 EMPTY_VALUE로 설정해야 합니다.

이 지표는 원래 MQL4로 작성되었으며, 2008년 9월 3일 코드 베이스에 처음 게시되었습니다.

그림1. 차트에서의 BeginnerAlert 지표

그림1. 차트에서의 BeginnerAlert 지표

그림2. BeginnerAlert 지표의 알림 생성

그림2. BeginnerAlert 지표의 알림 생성

연관 포스트

댓글 (0)