每个使用自动化交易的交易者迟早都会遇到错误代码130“止损无效”,或者遇到订单根本无法成交的情况。通常的反应是归咎于EA。但大多数情况下,EA本身没有问题,而是服务器在执行合约限制。
——这些限制在终端窗口中从未显示过:止损位、冻结位,或是你的仓位大小未遵守的最小手数步长。这些限制因交易品种和经纪商而异,且会随时变化,
。本脚本会将其打印出来。
将其加载到任何图表上。它仅读取规格信息——绝不会打开、修改或关闭任何内容,且无需启用算法交易。提供一个以逗号分隔的符号列表,或将输入留空,它便会遍历您的“市场观察”中的选定标的。
打印内容
--- XAUUSD (bid 4402.15 / ask 4402.63) --------------------- stops level 350 pts | freeze level 0 pts | EFFECTIVE band 351 pts VERDICT: a stop/pending placed 100 pts from price would be REJECTED as 'Invalid price' (band is 351 pts) buy at ask 4402.63: you asked SL 4401.63 -> nearest legal SL 4399.12 (moved out)
最后一行最有参考价值。它不仅告诉你100点的止损在这个品种上无法生效,还明确指出服务器会接受的具体止损位。
规则
有两种不同的限制条件可能会导致止损单被拒绝,而仅检查其中一种限制条件的工具,在半数经纪商处会给出错误的结果:
double MinStopDistance(const string sym) { long stops = SymbolInfoInteger(sym, SYMBOL_TRADE_STOPS_LEVEL); long freeze = SymbolInfoInteger(sym, SYMBOL_TRADE_FREEZE_LEVEL); long band = (stops > freeze ? stops : freeze) + 1; return band * SymbolInfoDouble(sym, SYMBOL_POINT); }
这四行话中蕴含着三项决定。
该数值是两个限制值中较大的那个,因为有些服务器将冻结值设为零并强制执行止损,而另一些服务器则恰恰相反。采用较大的数值,即使不知道当前所在的是哪种服务器,也能同时满足这两种情况。
增加了一分,因为许多服务器仍然会拒绝那些恰好位于等级区间边缘的等级。文档中记载的规则是“小于”,但实际实施的规则往往是“小于或等于”,而多加一分并不会造成任何损失。
结果以“PRICE”单位返回,而非点数。在构建实际止损位时,您需要的就是这个数值,它能消除“点”与“点差”之间的混淆——这种混淆在5位数交易品种中会导致十倍的误差。
在您自己的EA中使用它
第二个函数才是值得复用的。它接受你指定的止损位,并返回服务器能接受的、位于价格正确一侧的最近止损位:
double LegalStopLoss(const string sym, const bool isBuy, const double price, const double wanted) { double dist = MinStopDistance(sym); int digits = (int)SymbolInfoInteger(sym, SYMBOL_DIGITS); double sl = wanted; if(isBuy) { if(price - sl < dist) sl = price - dist; } else { if(sl - price < dist) sl = price + dist; } return NormalizeDouble(sl, digits); }
既然该停靠站原本就是合法的,且此次更新后保持不变,因此将所有停靠站都经由该站中转是安全的。将现有的计算逻辑进行封装只需一行代码:
double sl = LegalStopLoss(_Symbol, true, ask, ask - atr * 1.5);
当波动率相对于价格区间较高时,这一点尤为重要。一个在欧元兑美元上效果良好的ATR止损位,在黄金或指数交易时段行情平静时,可能会跌入价格区间内——而这恰恰是价格反转令你措手不及时,因为同样的交易策略昨天还行得通。
关于阅读输出结果的说明
点差过大并不意味着经纪商在刁难客户。这通常反映了该交易品种的定价和对冲方式,这也是为什么一个在某台服务器上运行良好的剥头皮自动交易程序,在另一台服务器上却会失效——尽管代码一行都没改。
迁移前请先进行比较。CSV导出功能默认开启,会将 `BrokerSpecs.csv` 写入 MQL5\Files 目录,每个符号占一行,其中包含交易区间、最小止损距离以及最近的合法价格水平。 在两家经纪商上运行该脚本,将生成的文件并排比较,原本可能耗费你一周时间调试的差异,现在一分钟内即可一目了然。
在调整仓位规模前请先检查保证金。保证金一栏所示数值仅适用于最小交易单位。如果该数值已接近您的可用保证金,则您的仓位规模存在一个尚未测算的上限。
股票代码必须在“行情监视器”中,且必须至少收到一个报价。如果某只股票代码未报告报价数据,请打开其图表一次,然后重新运行。
由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/76178
Session Opening Range Breakout EA
一款专家顾问,用于测量指定交易时段开盘窗口的高点/低点,随后在该区间确认突破时进行交易,采用基于风险的仓位管理,并设定每交易时段仅执行一笔交易上限。
Reverse RSI Bands
“反向RSI区间”是一种领先指标,它通过数学方法对RSI公式进行了反向推导。该指标会直接在主图表上绘制精确的目标价格区间,实时显示RSI将在何处触及您设定的超买或超卖水平。
Custom Simple Moving Average
一种两阶段自适应移动平均线(基础均线 + 二次平滑),该指标会根据斜率自动变色,并用箭头标记价格与均线的交叉点。
离散
离散技术指标由价格和交易量的变化决定。
