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

MQL4中positions变量值无法更新问题求助

问题分析与解决

核心问题原因

你的positions变量始终为0,大概率是**OrderSend下单失败**,导致positions++/positions--代码根本没执行;另外代码结构也存在细节问题,影响变量状态更新:

  • 未检查OrderSend返回值:MQL4中OrderSend下单成功返回正订单号,失败返回-1。如果因账户余额不足、滑点超限、交易时段限制等原因下单失败,后续的positions增减操作不会触发,变量自然保持0。
  • 多余代码嵌套:OnTick内多套了一层无意义的大括号,虽不影响逻辑,但降低可读性,建议移除。
  • 持仓同步风险:即使下单成功,若存在手动平仓、其他EA干预平仓的情况,positions会和实际持仓脱节,但当前变量始终为0的问题优先由下单失败导致。

修复后的代码示例

void OnTick()
{
    double stoch = iStochastic(NULL, 0, 14, 3, 3, 0, 1, 0, 0);
    int number_of_order = OrdersTotal();
    static int positions = 0;

    // 无持仓时尝试开仓
    if(number_of_order == 0)
    {
        if(stoch <= 20)
        {
            int purchase_order = OrderSend(_Symbol, OP_BUY, 0.01, Ask, 0, 0, 0, NULL, 0, 0, clrNONE);
            // 仅下单成功时更新positions
            if(purchase_order > 0)
            {
                positions++;
            }
            else
            {
                // 输出错误码排查问题
                Alert("多单下单失败,错误码:", GetLastError());
            }
        }
        else if(stoch >= 80)
        {
            int sales_order = OrderSend(_Symbol, OP_SELL, 0.01, Bid, 0, 0, 0, NULL, 0, 0, clrNONE);
            // 仅下单成功时更新positions
            if(sales_order > 0)
            {
                positions--;
            }
            else
            {
                Alert("空单下单失败,错误码:", GetLastError());
            }
        }
    }

    Alert(positions);

    // 平多单逻辑
    if(stoch > 70 && positions == 1)
    {
        Close_Trade();
        positions--;
    }
    // 平空单逻辑
    if(stoch < 30 && positions == -1)
    {
        Close_Trade();
        positions++;
    }
}
//+------------------------------------------------------------------+

额外建议

  • 用GetLastError()获取OrderSend失败的错误码,可精准排查问题(比如错误码131代表无效止损,2代表账户资金不足)。
  • 为避免positions与实际持仓脱节,建议在OnTick开头主动同步持仓状态:
    // 同步实际持仓到positions变量
    positions = 0;
    for(int i=0; i<OrdersTotal(); i++)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == _Symbol)
        {
            if(OrderType() == OP_BUY) positions++;
            else if(OrderType() == OP_SELL) positions--;
        }
    }
    
    这样即使有外部操作改变持仓,positions也能保持准确。

内容的提问来源于stack exchange,提问作者Rafał

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:35:21