트레일링 스톱(Trailing Stop)은 우리의 트레이딩을 지원하여 손실을 최소화하고 수익을 확보하는 데 큰 도움이 됩니다. 이를 통해 우리는 항상 자동으로 거래를 안전하게 유지할 수 있습니다.
코드는 입력된 트레일링 스톱 매개변수를 정의하는 것부터 시작합니다.
input bool isTrailingStop = true; //트레일링 스톱 input int trailingStart = 15; //트레일링 시작 (핍) input int trailingStep = 5 //트레일링 스텝 (핍) input int MagicNumber = 0; //매직 넘버
글로벌 변수 설정
//글로벌 변수 double myPoint = 0.0;
이 EA를 실행하면 OnInit() 함수가 처음으로 실행되며, 이 함수에서 입력 변수를 검증하고 초기화합니다.
int OnInit() { if (isTrailingStop && trailingStart <= 0){ Alert ("파라미터가 잘못되었습니다."); return(INIT_PARAMETERS_INCORRECT); } myPoint = GetPipPoint(Symbol()); return(INIT_SUCCEEDED); }
가격 움직임이 발생할 때마다 이 EA가 연결된 차트에서 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(), " SL 업데이트 실패"); } } } 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(), " SL 업데이트 실패"); } } } } //매직넘버 조건 종료 }//루프 종료 }
기타 필요한 기본 함수는 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 앱도 제공하고 있습니다. 이 앱을 다운로드하여 사용하시면 더욱 수익성 있는 트레이딩을 지원받을 수 있습니다.