거래 로봇을 무료로 다운로드 하는 법을 시청해보세요
당사를 Twitter에서 찾아주십시오!
당사 팬 페이지에 가입하십시오
스크립트가 흥미로우신가요?
그렇다면 링크 to it -
하셔서 다른 이들이 평가할 수 있도록 해보세요
스크립트가 마음에 드시나요? MetaTrader 5 터미널에서 시도해보십시오
Experts

Code Block for "Trailing Stop" based on current market price. (Ask / Bid) - MetaTrader 5용 expert

조회수:
43
평가:
(5)
게시됨:
MQL5 프리랜스 이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동

이 코드 블록은 손절매를 사용하거나 사용하지 않는 경우에 작동합니다.


요구 사항

  • 포지션 및 주문 작업을 할 수 있는 CTrade 클래스에 액세스하려면 "Trade.mqh "를 포함해야 합니다.

#include <Trade\Trade.mqh> // <<------------------------------------------ CTrade 클래스에 액세스하려면 이 "Trade.mqh"를 포함하세요. 

  • 원하는 대로 트레일링 거리를 조정하려면 입력 매개변수를 설정해야 합니다. 이는 필수는 아니지만 편의를 위해 필요합니다.
input double Traling_Step = 3.0;
  • CTrade 클래스에 대한 인스턴스를 정의해야합니다. 이름은 무엇이든 될 수 있습니다. OnInt 이벤트 핸들러 뒤에 붙이는 것이 좋습니다.

  • 그런 다음 현재 실행 중인 포지션이 있는지 확인하기 위해 if 문을 만들어야 합니다. 이 문은 모든 틱에 대해 Check_TrailingStop(); 함수를 호출합니다. 이는 EA가 날카롭고 부드럽게 추적해야 하기 때문에 중요합니다. 이 문이 제대로 작동하려면 이 문은 OnTick 이벤트 핸들러의 맨 위에 배치해야 합니다.
//+------------------------------------------------------------------+
//| 전문가 초기화 기능|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 타이머 생성
   EventSetTimer(60);

//---
   return(INIT_SUCCEEDED);
  }


CTrade trade; // <<------------------------------------------ "CTrade" 캘린더를 선언합니다. "trade"를 원하는 이름으로 바꿀 수 있습니다.
void OnTick()
  {
   
   if(PositionsTotal() > 0) // 실행 중인 포지션이 있는 경우 매 틱마다 후행 중지 함수를 호출합니다. 
     {
      Check_TralingStop(); 
     } 
     
       
  }

  • 나머지 작업을 수행하려면 Check_TrailingStop();( 이 경우) 이라는 사용자 정의 함수를 선언해야 합니다. 원하는 이름은 무엇이든 사용할 수 있습니다.
  • 사용자 지정 함수는 모든 오픈 포지션을 반복하여 필요한 거리만큼 추적합니다.
void Check_TralingStop()
  {
   int totalPositions = PositionsTotal();
   for(int count =0; count < totalPositions; count++)
     {
      ulong TicketNo = PositionGetTicket(count); // 포지션의 '인덱스'를 사용하여 포지션 티켓 번호를 가져옵니다.

      if(PositionSelectByTicket(TicketNo)) // 티켓 번호를 사용하여 위치를 선택합니다(이미 티켓 번호를 선택했습니다).
        {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) // 위치 유형을 확인합니다.
           {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double stopLoss  = PositionGetDouble(POSITION_SL);       // <<-------------------포지션 현재 손절매 가져오기
            double takeProfit = PositionGetDouble(POSITION_TP);
            double bidPrice  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            ulong ticket = PositionGetTicket(count);
            double trailingLevel = NormalizeDouble(bidPrice - (Traling_Step * Point()),_Digits);

            if(stopLoss < openPrice) // 손절매는 사실이 아닙니다.
              {
               if(bidPrice > openPrice && trailingLevel > openPrice) // 포지션당 한 번만 실행됩니다. 첫 번째 SL을 설정합니다.

                  trade.PositionModify(ticket,trailingLevel,takeProfit); // "CTrade.trade"를 사용하여 후행 중지 수정하기
              }


            if(bidPrice > openPrice && trailingLevel > stopLoss) // 후행 레벨이 이전 레벨보다 높은지 확인합니다.
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // "CTrade.trade"를 사용하여 후행 중지 수정하기
              }

           }
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
           {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double stopLoss  = PositionGetDouble(POSITION_SL);
            double takeProfit = PositionGetDouble(POSITION_TP);
            double bidPrice  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            double askPrice  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            ulong ticket = PositionGetTicket(count);
            double trailingLevel = NormalizeDouble(askPrice + (Traling_Step * Point()),_Digits);

            if(stopLoss < openPrice) // 손절매는 사실이 아닙니다.
              {
               if(askPrice < openPrice && trailingLevel < openPrice) // 포지션당 한 번만 실행됩니다. 첫 번째 SL을 설정합니다.

                  trade.PositionModify(ticket,trailingLevel,takeProfit); // "CTrade.trade"를 사용하여 후행 중지 수정하기
              }

            if(askPrice < openPrice && trailingLevel < stopLoss) // 후행 레벨이 이전 레벨보다 높은지 확인합니다.
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // "CTrade.trade"를 사용하여 후행 중지 수정하기
              }
           }

        }
     }
  }










    MetaQuotes Ltd에서 영어로 번역함.
    원본 코드: https://www.mql5.com/en/code/49021

    StoDiv StoDiv

    스토캐스틱 오실레이터와 프랙탈을 사용하는 전형적인 세마포어 신호 표시기입니다.

    구매판매 구매판매

    이 인디케이터는 현재 추세의 마지막 '방어선'을 보여줍니다. 추세 변화는 컬러 사각형으로, 추세 방향은 컬러 점으로 표시됩니다.

    Simple Code for Detect  A  "New Bar or New Candle " Received Simple Code for Detect A "New Bar or New Candle " Received

    이 코드 블록은 새 막대 또는 새 캔들이 수신되면 이를 감지합니다.

    울트라 스피어맨 랭크 상관관계 울트라 스피어맨 랭크 상관관계

    이 신호 추세 지표는 사용자 지정 스피어만 순위 상관관계 지표의 판독값과 여러 신호선의 추세 분석을 기반으로 합니다.