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