메타트레이더 4에서 트레일링 스탑과 매직넘버 활용하기

Mike 2021.03.30 22:17 47 0 0
첨부파일

안녕하세요, 트레이더 여러분! 오늘은 메타트레이더 4에서 트레일링 스탑을 설정하는 방법에 대해 이야기해 보려고 합니다. 트레일링 스탑은 우리의 거래를 지원해 주며, 손실을 줄이고 이미 확보한 이익을 보호하는 데 큰 도움을 줍니다.

트레일링 스탑 설정하기

먼저, 트레일링 스탑의 입력 매개변수를 설정하는 코드부터 살펴보겠습니다.

input    bool     isTrailingStop = true;  // 트레일링 스탑 활성화
input    int      trailingStart  = 15;    // 트레일링 시작 (핍)
input    int      trailingStep   = 5;     // 트레일링 스탭 (핍)

input    int      MagicNumber = 0;        // 매직 넘버

전역 변수 선언하기

// 전역 변수
double   myPoint    = 0.0;

EA 초기화 함수

이제 EA를 실행하면 OnInit() 함수가 처음으로 실행되고, 이 함수에서 입력 변수를 검증하고 초기화합니다.

int OnInit()
  {
  
   if (isTrailingStop && trailingStart <= 0){
      Alert ("매개변수가 잘못되었습니다");
      return(INIT_PARAMETERS_INCORRECT);
   }
   
   myPoint     = GetPipPoint(Symbol());
   
   return(INIT_SUCCEEDED);
  }

가격 변동 시 OnTick() 함수 실행

가격이 움직일 때마다 OnTick() 함수가 실행되어 setTrailingStop() 함수를 호출합니다.

void OnTick()
  {
//---
   setTrailingStop(MagicNumber);
   
  }

setTrailingStop() 함수 구현하기

void setTrailingStop(int magicNumber=0){
   if (isTrailingStop==false) return;
   
   int      tOrder = 0;
   string   pair = "";
   double   sl = 0.0, tp = 0.0;
   
   pair = Symbol();
   
   tOrder = OrdersTotal();
   for (int i=tOrder-1; i>=0; i--){
      bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber() == magicNumber && StringFind(OrderSymbol(), pair, 0) == 0 ){
         if (OrderType() == OP_BUY){
            if ( (Bid - (trailingStart * myPoint)) >= OrderOpenPrice()
                  && (Bid - ((trailingStart+trailingStep) * myPoint) >= OrderStopLoss() )
                )
            {
               sl = NormalizeDouble(Bid - (trailingStart * myPoint), Digits());
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){
                  Print ("#", OrderTicket(), " 손실 업데이트 실패");
               }
            }
         }
         
         if (OrderType() == OP_SELL){
            if ( (Ask + (trailingStart * myPoint)) <= OrderOpenPrice()
                  && ( (Ask + ((trailingStart+trailingStep) * myPoint) <= OrderStopLoss() ) || OrderStopLoss() == 0.0)
               )
            {
               sl = NormalizeDouble(Ask + (trailingStart * myPoint), Digits() );
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){
                  Print ("#", OrderTicket(), " 손실 업데이트 실패");
               }
            }
      } // 매직넘버 끝
   }// for 종료
}

GetPipPoint() 함수

핍 포인트를 가져오는 함수도 필요합니다.

// GetPipPoint 함수
double GetPipPoint(string pair)
{
   double point= 0.0;
   int digits = (int) MarketInfo(pair, MODE_DIGITS);
   if(digits == 2 || digits== 3) point= 0.01;
   else if(digits== 4 || digits== 5) point= 0.0001;
   return(point);
}

질문이 있으신가요?

궁금한 점이 있으시면 댓글로 남겨주세요! 또한, 저희 그룹 공유에 참여하실 수도 있습니다. t.me/codeMQL

SignalForex 앱 다운로드

저희는 SignalForex 앱도 제공하고 있습니다. 이 앱을 다운로드하여 사용하시면 더 수익성 있는 거래에 도움이 됩니다!

SignalForex 앱 다운로드하기

목록
댓글 0