MQL4包络线EA触发止损后违规重复开仓问题咨询
包络线EA止损后重复开仓问题修复
问题描述
交易策略基于包络线指标:
- 买入:K线收盘价收于包络线上方
- 卖出:K线收盘价收于包络线下方
当前EA能按规则开仓,但订单触发止损后,会立刻重新开仓,没有再次校验是否满足开仓规则——因为止损触发后OrdersTotal()变为0,EA直接根据之前的信号下单,忽略了当前K线是否还符合包络线条件。
修复方案
核心思路:强化开仓条件,确保只有当无活跃订单且当前已完成K线确实满足包络线规则时才开仓,同时增加订单归属检查避免干扰其他EA订单。
修改后的代码
//+------------------------------------------------------------------+ //| 包络线交易EA | //| Copyright 2018, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ input double 止损点数=50.0; // 止损(点数) input double 止盈点数=100.0; // 止盈(点数) //+------------------------------------------------------------------+ //| 检查是否存在本EA的活跃订单 | //+------------------------------------------------------------------+ bool HasActiveOrder() { for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { // 检查订单是否属于当前品种、当前EA(魔术号设为0,可按需修改) if(OrderSymbol() == _Symbol && OrderMagicNumber() == 0) { if(OrderType() == OP_BUY || OrderType() == OP_SELL) { return true; } } } } return false; } //+------------------------------------------------------------------+ //| 每Tick执行逻辑 | //+------------------------------------------------------------------+ void OnTick() { string 信号=""; // 获取包络线上下轨:品种、周期、14周期SMA、收盘价、偏差0.10、最新K线 double 下轨=iEnvelopes(_Symbol,_Period,14,MODE_SMA,0,PRICE_CLOSE,0.10,MODE_LOWER,0); double 上轨=iEnvelopes(_Symbol,_Period,14,MODE_SMA,0,PRICE_CLOSE,0.10,MODE_UPPER,0); // 基于前一根已完成K线的收盘价判断信号 if(Close[1]<下轨) { 信号="做空"; } if(Close[1]>上轨) { 信号="做多"; } // 开仓条件:无本EA活跃订单 + 信号有效 if(信号=="做空" && !HasActiveOrder()) { // 发送做空订单 double 做空止损=Bid+止损点数*_Point; double 做空止盈=Bid-止盈点数*_Point; OrderSend(_Symbol,OP_SELL,0.10,Bid,3,做空止损,做空止盈,NULL,0,0,Red); } if(信号=="做多" && !HasActiveOrder()) { // 发送做多订单 double 做多止损=Ask-止损点数*_Point; double 做多止盈=Ask+止盈点数*_Point; OrderSend(_Symbol,OP_BUY,0.10,Ask,3,做多止损,做多止盈,NULL,0,0,Green); } // 图表注释 Comment("BLZ 交易EA"); } //+------------------------------------------------------------------+
关键改动说明
新增
HasActiveOrder()函数:- 遍历所有订单,仅判断当前品种、对应魔术号的活跃订单,避免和其他EA的订单冲突
- 替代原代码的
OrdersTotal()==0,精准判断本EA是否有持仓
开仓条件优化:
- 只有当
!HasActiveOrder()(无本EA活跃订单)且信号有效时才开仓 - 信号基于
Close[1](已完成的前一根K线),避免用未完成的当前K线收盘价导致信号反复变化
- 只有当
避免止损后立即开仓:
- 止损触发后,只有当下一根K线完成并满足包络线规则时,才会生成新信号并开仓,完全符合原策略逻辑
内容的提问来源于stack exchange,提问作者Why So Serious
相关产品推荐
相关产品推荐

