MetaTrader 5 中的出价/要价(Bid/Ask)点差分析·综合运用
(3/3)· 从即时报价回测到剥头皮止损设定,看清宣称点差与实际点差的二倍鸿沟
◍ 用 Tick 区间切分还原每根 K 线的真实点差
在自定义指标里,当前未走完的 K 线不适合做统计,但可以把已声明的点差先写进缓冲区:把终端返回的标准化点差乘上 _Point,得到以报价单位计的真实点差,存到 DeclaredSpreadBuf 末位。函数最后返回 rates_total,让下一轮 OnCalculate 拿到已处理柱数,避免重复计算。 要还原某根已收盘 K 线区间内的买卖盘跳动,可用 CopyTicksRange 拉取信息类 tick。下面这段调用只取 bid/ask 变化(COPY_TICKS_INFO),起止时间用上一根和当前根的开盘时间乘 1000 转成毫秒传入,覆盖整段区间。外汇与贵金属点差随流动性跳动,实盘环境高风险,回测与实时值可能偏差明显,请以 MT5 本地验证为准。
class=class="str">"cmt">//don&class="macro">#x27;t do stats for incomplete current bar, but can do DeclaredSpread if it has a value DeclaredSpreadBuf[rates_total-class="num">1]=(spread[rates_total-class="num">1]*_Point); class=class="str">"cmt">//--- class="kw">return value of prev_calculated for next call class="kw">return(rates_total); } ticks=CopyTicksRange(_Symbol, tickBuf, COPY_TICKS_INFO, class=class="str">"cmt">// Only bid and ask changes are required time[i-class="num">1]*class="num">1000, class=class="str">"cmt">// Start time of previous bar time[i ]*class="num">1000 class=class="str">"cmt">// End time of previous bar );
「冷门货币对的历史报价怎么灌进本地库」
做跨币种相关性排查时,常会碰到平时不交易的货币对。MT5 默认不加载这些品种,直接读本地报价库会返回空。 先在「查看 → 品种符号」里双击目标货币,把它挂到市场观察列表,这一步只是让终端认识这个符号,并不等于有了数据。 接着进该品种的即时报价窗口,切到「即时报价」选项卡。第一个日期菜单往前拉约 30 天(覆盖一个月左右的区间),第二个日期菜单设成明天,确认后终端会把这段区间的逐笔报价写进本地即时报价数据库。外汇与贵金属杠杆高、滑点突发,灌数据时注意服务器时区与品种交易时段错位可能导致缺口。 灌完别急着跑脚本,用 SymbolInfoTick 或本地文件确认有 Tick 落地,再去做回测才靠谱。
别急着下结论
点差不是静态标签,而是随流动性、时段和单笔成交量实时变形的东西。作者建议优先挑与美元直挂的 EURUSD、GBPUSD、USDJPY、USDCHF、USDCAD,理由是同类里整体点差最低;但这只是平均视角,2014 年 USDJPY 曾连续半年价差放到 2012–13 年的 2~3 倍,那时根本没法做。 MT4 拿不到即时报价,这套买卖点差统计只能在 MT5 跑,想复现就装 BidAskSpreadStats 脚本自己采数据。评论里有人提到价格叠加:单笔量越大成交价越差,机构都是按周按季度拆单建仓,散户更该避开美盘重叠外的稀薄流动性。 外汇和贵金属杠杆高,点差一扩成本就失控。经纪商广告写的点差别全信,真要下单前先在 MT5 看一眼实时买卖价差,不合理就空仓——这不是保守,是算过账后的选择。