MQL5 코드 저자: Vladimir Karputov.
이 EA는 TP(테이크 프로핏)나 SL(스톱 로스)가 발동되면 반대 방향으로 포지션을 열어줍니다. 거래 요청을 보내기 전에 잔고가 충분한지를 체크합니다. 이 과정은 OnTradeTransaction 함수에서 처리됩니다.
예를 들어, 현재 Buy 포지션이 열려 있는 경우, TP나 SL이 발동되면 새로운 Sell 포지션이 열립니다. 이후 TP나 SL이 발동되면 다시 새로운 Buy 포지션이 열리게 됩니다.
거래 종료는 OnTradeTransaction에서 모니터링됩니다:
//+------------------------------------------------------------------+ //| TradeTransaction 함수 | //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { //--- 거래 유형을 열거형 값으로 가져오기 ENUM_TRADE_TRANSACTION_TYPE type=trans.type; //--- 거래가 기록에 추가된 결과인지 확인 if(type==TRADE_TRANSACTION_DEAL_ADD) { long deal_entry =0; long deal_type =0; string deal_symbol =""; long deal_magic =0; long deal_time =0; if(HistoryDealSelect(trans.deal)) { deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY); deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE); deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL); deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC); deal_time=HistoryDealGetInteger(trans.deal,DEAL_TIME); } else return; if(deal_symbol==m_symbol.Name() && deal_magic==m_magic) { if(deal_entry==DEAL_ENTRY_OUT) { if(deal_type==DEAL_TYPE_BUY || deal_type==DEAL_TYPE_SELL) { if(deal_type==DEAL_TYPE_BUY) m_close_pos_type=POSITION_TYPE_SELL; else if(deal_type==DEAL_TYPE_SELL) m_close_pos_type=POSITION_TYPE_BUY; else return; m_is_trade=true; } } else if(deal_entry==DEAL_ENTRY_IN) { m_is_trade=false; } } } }
OrderSend 전에 거래량을 체크하세요 (Buy 포지션 개설을 예로 들면):
//+------------------------------------------------------------------+ //| Buy 포지션 열기 | //+------------------------------------------------------------------+ void OpenBuy(double sl,double tp) { sl=m_symbol.NormalizePrice(sl); tp=m_symbol.NormalizePrice(tp); //--- OrderSend 전에 거래량을 체크하여 "잔고 부족" 오류 방지 double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),InpLots,m_symbol.Ask(),ORDER_TYPE_BUY); if(check_volume_lot!=0.0) { if(check_volume_lot>=InpLots) { if(m_trade.Buy(InpLots,NULL,m_symbol.Ask(),sl,tp)) { if(m_trade.ResultDeal()==0) { Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", 설명: ",m_trade.ResultRetcodeDescription()); } else { Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(), ", 설명: ",m_trade.ResultRetcodeDescription()); } } else { Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", 설명: ",m_trade.ResultRetcodeDescription()); } } else { m_is_trade=false; } } else { m_is_trade=false; } //--- }