目录

MT4正版下载 - MT4回测点差自定义设置实测方法_两种执行方式在实战中的适用场景

MT4回测点差自定义设置实测方法_两种执行方式在实战中的适用场景
接触MT4时间不短的朋友应该都清楚,回测功能在策略验证里占据着重要位置。但很多人跑完回测后总感觉结果跟实盘对不上,其中点差设置就是最容易被忽略的一个环节。有人觉得回测里的点差是平台固定死的,也有人认为点差只能按默认值来跑,这些看法其实都不太准确。今天这篇文章就专门来聊聊MT4回测中点差到底能不能自己改,以及具体怎么操作才能让回测数据更贴合真实交易环境。

回测点差的默认机制到底怎么回事

MT4自带的策略测试器在运行回测时,点差数据并不是直接写在软件界面上的。它默认使用的是当前所连接服务器提供的实时点差快照,这个快照会在回测开始的瞬间被读取并固定下来。也就是说,如果你连着的是欧美账户,回测时用的可能就是欧美账户当时显示的浮动点差;如果连的是模拟服务器,那点差就是模拟盘上的数值。

正因为这个机制,很多人在不同时间跑同一个EA,得到的结果会相差不少。早上跑和晚上跑,点差不同,回测结果自然不同。尤其是那些做短线或者剥头皮的策略,对点差的敏感度极高,哪怕只是零点几个点的差异,最终盈亏曲线都会出现明显变化。所以搞清楚这个默认机制,是理解点差自定义的第一步。

还有个容易被忽视的细节是,MT4回测默认使用的点差其实还跟图表周期有关。如果你在M1周期上跑回测,系统会优先使用当前报价的实时点差;但如果你在H4或者D1周期上跑,系统可能会自动采用该品种历史点差的平均值。这种隐性的处理方式,往往让新手摸不着头脑,甚至误以为回测点差根本无法控制。

两种执行方式在实战中的适用场景

先说说立即执行。我个人的习惯是,在行情比较平稳、点差正常的时候,用立即执行比较多。因为这时候买卖价差很小,你用市价单进场,成本基本可控。比如黄金在1800美元附近横盘整理,你判断它马上要向上突破,这时候直接点“买入”并选择立即执行,就能以当前价格快速进场,抓住时机。如果这时候你用挂单,等到价格突破后再触发,可能行情已经冲上去一段了,你的入场成本就高了。

挂单执行在特定场景下则显得尤为重要。比如你晚上要睡觉,但看准了某个关键支撑位在1.0950附近,你打算等价格跌到那里再买入。这时候你不可能整夜盯盘,挂单就派上用场了。你设置一个Buy Limit单,价格到了1.0950就自动买入,价格没到就一直挂着。第二天醒来,单子可能已经成交了,而且成交价基本就在你设定的位置附近。这其实就是把交易计划交给系统去执行,省心又省力。

不过要注意,挂单执行有个隐含风险:如果你的止损设置得不合理,而挂单触发后行情瞬间反向冲击,可能还没等你反应过来,止损就被打掉了。我有个朋友做原油,挂了个Sell Limit在80.5,结果行情冲到80.5触发后立刻暴跌,他本来想顺势做空,结果止损设在81.2,行情先反抽到81.3把他扫掉,然后又继续跌。这种“先扫损再走方向”的情况,在挂单交易里特别常见,所以挂单的止损位置一定要留足缓冲空间。

另外,对于日内短线交易者来说,立即执行几乎是唯一的选择。因为短线讲究的是快进快出,价格稍纵即逝,你不可能等挂单慢慢触发。而中长线交易者或者波段交易者,挂单执行反而更实用,因为他们的交易频率低,对入场精度要求高,挂单能帮他们锁定理想价位。说到底,这两种方式没有优劣之分,关键是你要清楚自己的交易风格和策略需求。

EA代码框架与关键函数实现

其实这个EA不需要太复杂的结构,一个主函数OnTick()里判断是否有新订单产生就够了。最简单粗暴的方式是监控交易历史,当检测到有新的开仓订单出现时,立刻读取它的开仓价,然后计算止损价并调用OrderModify函数修改止损。但这个方法有个问题,就是市价单成交后你可能来不及修改,价格已经动了,导致止损价不准确。更靠谱的办法是在开仓的时候就带上止损,也就是直接用OrderSend发送带止损的订单。

如果你非要采用“先开仓后修改”的方式,那也要尽量缩短中间的时间差。具体做法是:在OrderSend成功后的下一行代码立刻获取订单信息并修改止损。因为MQL4是单线程执行,这段代码几乎瞬间完成,价格滑点的影响可以忽略不计。但要注意,OrderModify函数要求订单必须是被选中的状态,而且不能修改已经平仓的订单,所以每次操作前都要用OrderSelect检查订单类型和状态。

下面我写一个简化版的代码逻辑供你参考。首先定义输入参数,然后写一个自定义函数CalculateStopLoss(price, direction)返回止损价。
在主函数里,用OrderSend发送订单时,直接调用这个函数计算止损。如果OrderSend返回的订单号小于0,说明下单失败,用Print输出错误代码。如果成功,就用OrderSelect选中该订单,再输出实际设置的止损值,方便你核对。

代码里还有一个细节,就是针对不同交易品种的小数点位数。比如EURUSD是5位数报价,止损价要NormalizeDouble到5位,而USDJPY是3位数,要保留到3位。你可以用MarketInfo(Symbol(), MODE_DIGITS)动态获取位数,然后自动做归一化处理。这样EA拿到哪个品种都能用,不用每种货币对单独改代码。

手机端接收通知的配置与常见故障排查

手机端MT4的配置相对简单,但也有一些容易踩坑的地方。打开手机MT4,进入设置,找到“通知”选项,确保“推送通知”开关是打开的。同时检查一下手机系统的通知设置,确保MT4应用没有被系统拦截通知。在iPhone上,要去“设置”里的“通知”找到MT4应用,确保允许通知;在安卓手机上,不同品牌的设置路径略有差异,但大致都是在“应用管理”里找到MT4,然后开启通知权限。

如果你的手机MT4之前登录过其他账户,那接收通知的时候可能会串线。建议在手机MT4上只保留一个常用的交易账户,避免多个账户之间推送混乱。我自己就遇到过这种情况,VPS上的账户和手机上的账户不是同一个,结果VPS上触发的通知推到了另一个账户关联的设备上,搞得我一头雾水。

排查故障的时候,先看VPS上的MT4右下角的状态栏,有没有显示连接正常。如果显示连接断开,那推送肯定发不出去。再看手机端的MT4,试着手动发送一条测试通知,如果测试通知能收到,说明链路是通的,问题出在触发条件设置上。如果测试通知也收不到,那就要检查MetaQuotes ID是否正确,或者重新生成一个ID试试。

还有一个容易忽略的点,MT4的通知功能在某些网络环境下会被屏蔽。比如你所在的国家或地区对MetaQuotes服务器有限制,那推送消息就可能无法送达。这种情况比较棘手,可能需要使用VPN或者更换手机的网络环境才能解决。不过这种情况比较少见,大部分时候问题还是出在配置上。

文章目录