BykovTrendAlert: 메타트레이더 5를 위한 신호 지표

Mike 2017.01.18 18:49 66 0 0
첨부파일

작성자: Ramdass - 변환 전용

BykovTrend 세마포어 신호 지표는 알림 기능이 포함되어 있어, 이메일과 모바일 기기로 푸시 알림을 보낼 수 있습니다.

이 지표의 코드에 알림, 이메일 메시지 및 푸시 알림을 구현하기 위해 다음과 같은 수정이 이루어졌습니다:

  1. 새로운 입력 매개변수 추가
    input uint Bar갯수=1;// 신호를 위한 바 갯수
    input bool 소리알림=true; // 알림 활성화
    input uint 알림갯수=2;// 알림 갯수
    input bool 이메일알림=false; // 신호 이메일 전송 활성화
    input bool 푸시알림=false; // 모바일 기기로 신호 전송 활성화
    
  2. 지표 코드 끝에 세 개의 새로운 함수 추가: BuySignal(), SellSignal() 및 GetStringTimeframe()
    //+------------------------------------------------------------------+
    //| 매수 신호 함수                                            |
    //+------------------------------------------------------------------+
    void BuySignal(string 신호이름,      // 이메일 및 푸시 메시지를 위한 지표 이름 텍스트
                   double &매수화살표[],        // 매수 신호가 있는 지표 버퍼
                   const int 현재바갯수,     // 현재 바 갯수
                   const int 이전계산갯수, // 이전 틱의 바 갯수
                   const double &종가[],     // 종가
                   const int &스프레드[])       // 스프레드
      {
    //---
       static uint 카운터=0;
       if(현재바갯수!=이전계산갯수) 카운터=0;
    
       bool 매수신호=false;
       bool 시리즈테스트=ArrayGetAsSeries(매수화살표);
       int 인덱스;
       if(시리즈테스트) 인덱스=int(Bar갯수);
       else 인덱스=현재바갯수-int(Bar갯수)-1;
       if(NormalizeDouble(매수화살표[인덱스],_Digits) && 매수화살표[인덱스]!=EMPTY_VALUE) 매수신호=true;
       if(매수신호 && 카운터<=알림갯수)
         {
          카운터++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string 텍스트=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          시리즈테스트=ArrayGetAsSeries(종가);
          if(시리즈테스트) 인덱스=int(Bar갯수);
          else 인덱스=현재바갯수-int(Bar갯수)-1;
          double 매도호가=종가[인덱스];
          double 매수호가=종가[인덱스];
          시리즈테스트=ArrayGetAsSeries(스프레드);
          if(시리즈테스트) 인덱스=int(Bar갯수);
          else 인덱스=현재바갯수-int(Bar갯수)-1;
          매수호가+=스프레드[인덱스];
          string s매도호가=DoubleToString(매도호가,_Digits);
          string s매수호가=DoubleToString(매수호가,_Digits);
          string s기간=GetStringTimeframe(ChartPeriod());
          if(소리알림) Alert("BUY 신호 
     매도호가=",매도호가,"
     매수호가=",매수호가,"
     현재시간=",텍스트,"
     심볼=",Symbol()," 기간=",s기간);
          if(이메일알림) SendMail(신호이름+": BUY 신호 알림","BUY 신호 at 매도호가="+s매도호가+", 매수호가="+s매수호가+", Date="+텍스트+" 심볼="+Symbol()+" 기간="+s기간);
          if(푸시알림) SendNotification(신호이름+": BUY 신호 at 매도호가="+s매도호가+", 매수호가="+s매수호가+", Date="+텍스트+" 심볼="+Symbol()+" 기간="+s기간);
         }
    
    //---
      }
    //+------------------------------------------------------------------+
    //| 매도 신호 함수                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string 신호이름,      // 이메일 및 푸시 메시지를 위한 지표 이름 텍스트
                    double &매도화살표[],       // 매도 신호가 있는 지표 버퍼
                    const int 현재바갯수,     // 현재 바 갯수
                    const int 이전계산갯수, // 이전 틱의 바 갯수
                    const double &종가[],     // 종가
                    const int &스프레드[])       // 스프레드
      {
    //---
       static uint 카운터=0;
       if(현재바갯수!=이전계산갯수) 카운터=0;
    
       bool 매도신호=false;
       bool 시리즈테스트=ArrayGetAsSeries(매도화살표);
       int 인덱스;
       if(시리즈테스트) 인덱스=int(Bar갯수);
       else 인덱스=현재바갯수-int(Bar갯수)-1;
       if(NormalizeDouble(매도화살표[인덱스],_Digits) && 매도화살표[인덱스]!=EMPTY_VALUE) 매도신호=true;
       if(매도신호 && 카운터<=알림갯수)
         {
          카운터++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string 텍스트=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          시리즈테스트=ArrayGetAsSeries(종가);
          if(시리즈테스트) 인덱스=int(Bar갯수);
          else 인덱스=현재바갯수-int(Bar갯수)-1;
          double 매도호가=종가[인덱스];
          double 매수호가=종가[인덱스];
          시리즈테스트=ArrayGetAsSeries(스프레드);
          if(시리즈테스트) 인덱스=int(Bar갯수);
          else 인덱스=현재바갯수-int(Bar갯수)-1;
          매수호가+=스프레드[인덱스];
          string s매도호가=DoubleToString(매도호가,_Digits);
          string s매수호가=DoubleToString(매수호가,_Digits);
          string s기간=GetStringTimeframe(ChartPeriod());
          if(소리알림) Alert("SELL 신호 
     매도호가=",매도호가,"
     매수호가=",매수호가,"
     현재시간=",텍스트,"
     심볼=",Symbol()," 기간=",s기간);
          if(이메일알림) SendMail(신호이름+": SELL 신호 알림","SELL 신호 at 매도호가="+s매도호가+", 매수호가="+s매수호가+", Date="+텍스트+" 심볼="+Symbol()+" 기간="+s기간);
          if(푸시알림) SendNotification(신호이름+": SELL 신호 at 매도호가="+s매도호가+", 매수호가="+s매수호가+", Date="+텍스트+" 심볼="+Symbol()+" 기간="+s기간);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  문자열로서 시간 프레임 가져오기                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES 기간)
      {
    //----
       return(StringSubstr(EnumToString(기간),7,-1));
    //----
      }
    
  3. 지표 계산 주기 후 BuySignal() 및 SellSignal() 함수에 호출 추가
    //---     
       BuySignal("BykovTrendAlert",매수버퍼,현재바갯수,이전계산갯수,종가,스프레드);
       SellSignal("BykovTrendAlert",매도버퍼,현재바갯수,이전계산갯수,종가,스프레드);
    //--- 
    

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

지표 코드의 OnCalculate() 블록에서는 BuySignal() 및 SellSignal() 함수의 호출이 단 한 번만 사용될 것이라고 가정하고 있습니다.

이 지표는 최초로 MQL4에 구현되어 2007년 9월 28일에 코드 베이스에 게시되었습니다.

그림1. 차트에 표시된 BykovTrendAlert 지표

그림1. 차트에 표시된 BykovTrendAlert 지표


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

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

목록
댓글 0