You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");
}
//+------------------------------------------------------------------+

关键改动说明

  1. 新增HasActiveOrder()函数:

    • 遍历所有订单,仅判断当前品种、对应魔术号的活跃订单,避免和其他EA的订单冲突
    • 替代原代码的OrdersTotal()==0,精准判断本EA是否有持仓
  2. 开仓条件优化:

    • 只有当!HasActiveOrder()(无本EA活跃订单)且信号有效时才开仓
    • 信号基于Close[1](已完成的前一根K线),避免用未完成的当前K线收盘价导致信号反复变化
  3. 避免止损后立即开仓:

    • 止损触发后,只有当下一根K线完成并满足包络线规则时,才会生成新信号并开仓,完全符合原策略逻辑

内容的提问来源于stack exchange,提问作者Why So Serious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:31:02