MT5编译EA时出现'OrderSend'参数数量错误的求助
MT5 EA编译报错'OrderSend' - wrong parameters count的解决方法
问题根源
你遇到的编译错误是因为MT5的OrderSend()函数参数结构、顺序和MT4完全不同,你沿用了MT4的调用格式,导致参数数量和顺序不匹配;同时你的止损止盈计算逻辑错误,直接计算的是百分比数值而非对应的价格水平,就算参数修正后也无法正常下单。
修正步骤
调整
OrderSend()的参数顺序与数量
MT5的OrderSend()要求严格的参数顺序,核心必填参数包括:交易品种、订单类型、交易量、开仓价格、滑点、止损限价(市价单填0)、止损价格、止盈价格、到期时间(市价单填0)、注释、魔术号、订单颜色、操作类型(填""即可)。修正止损止盈的价格计算逻辑
你之前的计算方式得到的是百分比对应的数值,而非实际价格。正确的做法是根据当前报价和风险比例计算出价格水平:
- 做多止损 = 当前买价 - (当前买价 * 风险比例 / 100)
- 做多止盈 = 当前买价 + (当前买价 * 盈利比例 / 100)
- 做空止损 = 当前卖价 + (当前卖价 * 风险比例 / 100)
- 做空止盈 = 当前卖价 - (当前卖价 * 盈利比例 / 100)
同时要用NormalizeDouble()确保价格符合品种的精度要求。
修正后的完整代码
input double Risk = 10.0; // 止损比例(10%) input double Reward = 30.0; // 止盈比例(30% - 1:3风险回报比) double contractSize = 1.0; // 初始交易量 void OnStart() { if (Period() != PERIOD_M5) // 检查是否为M5周期 { Print("本EA仅适用于5分钟(M5)图表,请切换到M5周期后使用。"); return; } if (!PositionSelect("XAUUSD")) // 检查是否持有XAUUSD仓位 { double ask = SymbolInfoDouble("XAUUSD", SYMBOL_ASK); double bid = SymbolInfoDouble("XAUUSD", SYMBOL_BID); int digits = SymbolInfoInteger("XAUUSD", SYMBOL_DIGITS); // 计算做多的止损和止盈价格 double buySL = NormalizeDouble(ask - (ask * Risk / 100.0), digits); double buyTP = NormalizeDouble(ask + (ask * Reward / 100.0), digits); // 计算做空的止损和止盈价格 double sellSL = NormalizeDouble(bid + (bid * Risk / 100.0), digits); double sellTP = NormalizeDouble(bid - (bid * Reward / 100.0), digits); // 发送做多市价单 OrderSend("XAUUSD", ORDER_TYPE_BUY, contractSize, ask, 10, 0, buySL, buyTP, 0, "Buy Order", 0, clrBlue, ""); // 发送做空市价单 OrderSend("XAUUSD", ORDER_TYPE_SELL, contractSize, bid, 10, 0, sellSL, sellTP, 0, "Sell Order", 0, clrRed, ""); } } void OnTick() { // 如需tick事件逻辑请在此添加 } void OnTimer() { // 如需定时器逻辑请在此添加 } void OnTrade() { if (PositionsTotal() == 0) // 检查所有仓位是否已平仓 { OnStart(); // 平仓后重新开仓 } }
额外说明
- 如果你使用的是MT5 Build 1380及以上版本,推荐使用
OrderSendAsync()异步下单函数,性能更优,参数格式与OrderSend()一致。 - 魔术号(代码中第11个参数
0)建议设置为唯一值,方便区分不同EA的订单。
内容的提问来源于stack exchange,提问作者e46996
相关产品推荐
相关产品推荐

