首页 系统交易 帖子

MetaTrader 5 专家顾问使用指南

附件
18294.zip (1.98 KB, 下载 0次)

创意作者: ef91 ()

MQL5 代码作者: Vladimir Karputov.

这个 EA 会等待止盈(TP)或止损(SL)被触发,然后在相反的方向开仓。在发送交易请求之前,它会检查账户余额是否足够。通过 OnTradeTransaction 函数来监控交易。

举个例子,当我们有一个已经开启的买单(Buy)时,一旦止盈或止损被触发,就会开启一个新的卖单(Sell)。接着,止盈或止损触发后,会再次开启一个买单。

交易完成情况会通过 OnTradeTransaction 进行监控:

//+------------------------------------------------------------------+
//| 交易事务函数                                        |
//+------------------------------------------------------------------+
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;
           }
        }
    }
  }

    在发送订单之前检查交易量(以买单为例):

    //+------------------------------------------------------------------+
    //| 开启买单                                                |
    //+------------------------------------------------------------------+
    void OpenBuy(double sl,double tp)
      {
       sl=m_symbol.NormalizePrice(sl);
       tp=m_symbol.NormalizePrice(tp);
    
    //--- 在发送订单之前检查交易量,以避免“资金不足”的错误 (CTrade)
       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("买入 -> 失败. 结果代码: ",m_trade.ResultRetcode(),
                     ", 结果描述: ",m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                   Print("买入 -> 成功. 结果代码: ",m_trade.ResultRetcode(),
                     ", 结果描述: ",m_trade.ResultRetcodeDescription());
                  }
               }
             else
               {
                Print("买入 -> 失败. 结果代码: ",m_trade.ResultRetcode(),
                      ", 结果描述: ",m_trade.ResultRetcodeDescription());
               }
            }
          else
            {
             m_is_trade=false;
            }
        }
       else
         {
          m_is_trade=false;
        }
    //---
      }

    相关帖子

    评论 (0)