시스템트레이딩 게시글

MetaTrader 5를 위한 효율적인 EA 사용법

첨부파일
18294.zip (1.98 KB, 다운로드 0회)

아이디어 저자: ef91 (관련 논의의 시작 )

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;
         }
    //---
      }
    

    연관 포스트

    댓글 (0)