目录

MT4回测报告解读 - MT4账户历史查询交易成绩单操作全解_MT4账户历史查询交易成绩单操作全解

MT4账户历史查询交易成绩单操作全解_MT4账户历史查询交易成绩单操作全解
打开MetaTrader4的界面,很多人第一反应是看图表、盯盘面,却很少留意到下方那个“账户历史”的标签页。其实要查看过去交易结果,最直接的办法就是点击底部终端窗口的“账户历史”选项卡。如果你找不到那个窗口,按住Ctrl+T就能调出终端面板,在面板底部就能看到“交易”、“账户历史”、“信号”等几个标签,点击“账户历史”即可进入。这里默认展示的是最近一段时间的交易记录,包括开仓时间、平仓时间、订单类型、手数、价格、止损止盈、手续费、库存费以及最终净利润,每一笔都清清楚楚。

核心思路与准备工作

要实现根据经济日历自动调整止损,首先得明白整个逻辑链条是怎么运转的。EA需要获取经济日历数据,判断当前时间是否有重大新闻发布,然后根据预设规则修改持仓单的止损价格。这里有个关键点,MT4自带的日历功能有限,所以我们要借助外部数据源或者用代码内置重要事件时间表。

我建议从最简单的方案入手,就是把一周内已知的重大经济事件时间预先写入EA的代码里。比如每周五晚上的美国非农数据,通常在晚上8点半(北京时间)公布,还有每月第一周的利率决议,这些时间点都是相对固定的。当然你也可以直接用MT4自带的日历控件,但那个数据更新不够及时,而且编程接口比较麻烦。

在动手写代码之前,先把MT4平台的环境配置好。打开MT4软件,点击文件菜单下的“打开数据文件夹”,找到MQL4文件夹,里面创建Experts文件夹,以后我们的EA文件就放在这里。还需要确认平台版本,我测试用的是MT4 build 1400以上版本,太老的版本可能不支持某些函数。

准备工作基本就绪后,我们还需要明确一点,这个EA不是全自动交易系统,它只负责调整止损,不会自动开仓或者平仓。所以它更像一个辅助工具,在你已经持仓的情况下,根据新闻事件帮你保护利润或限制损失。

说说我实际测试的那些土办法

资料里列过这么几条我自己试过的:(1)把MT4窗口缩到最小再恢复,这个纯粹是心理安慰没啥实质作用。(2)切换一下“市场报价”窗口的布局标签,比如从“报价”切到“图表”再切回来,这个偶尔能触发一次强制重绘好像又能管几秒用。(3)如果你是挂的服务器延迟特别高的代理或者VPN,把那玩意儿关了试试看,经常就是它拖的鬼。(4)直接在MT4里重新连接一下服务器,就是那个“文件”菜单下的“登录账户”,或者右下角那个信号图标点开重新输密码也行,这个对网络闪断那种情况有用。(5)把那些不看的品种右键删除掉,列表里留的货币对越多刷新越累,只留你最常用的几个速度明显快一点。(6)把MT4的“智能交易系统”里那些跑着的EA全停掉,有些EA下单平仓特别频繁会占资源,跟报价刷新抢内存。(7)还有最土的一招就是重启MT4软件,一切从头再加载一遍,有时比什么都管用但坚持不了太久。

那条条其实说的都不是同一个层面的东西,有的是调网络,有的是调软件,还有的就是懒人操作,但你没别的办法啊,MT4这软件就是不给一个活的刷新毫秒数让你填,不像某些专业交易平台,什么数据频率都能自己设置,MT4是老版本软件了,功能有限,它那个报价机制就绑在所谓的“Tick”数据流上,行情推送一次它显示一次,推送不了你界面怎么可能动,所以与其纠结那个刷新数字,不如找找自己网络包装好不好。

对了我这人有强迫症,看着那个价格数字停在那儿超过五秒钟心里就发毛,后来我自己给自己想了个土锤外号叫“报价迟钝症”,我一度怀疑是不是MT4软件开发商故意留这么一手,逼着你去用他们自家的新版本MT5,但我就是不爱用MT5那个界面布局,看着别扭,所以只能在这老东西身上死磕,按理说这也算不上什么技术难题,你要真从代码层面去看,那个刷新就是消息驱动事件,收到新报价就更新列表,收不到就不动,没什么可调的。

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拿到哪个品种都能用,不用每种货币对单独改代码。

我自己怎么对付这个破事

折腾这么多年,我总结了一套笨办法,反正够用。第一,搞清楚自己平台的服务器时区,然后倒推北京时间,把维护窗口标注在日历上,设个提前闹钟。第二,EA里加个时间判断,就在那个窗口前后半小时,强制不做单,躲开雷区。

第三呢,也是我最推荐的一招——用VPS挂EA。把MT4装在云服务器上,跟你的电脑断不断网没关系。VPS一般都有冗余电源和网络,平台维护它照样在线。虽然每月花个百八十块,但至少半夜不用提心吊胆爬起来看单子了。上次我电脑蓝屏重启,EA在VPS上一点没受影响,该跑跑该停停。

还有个小技巧,我顺便提一嘴。MT4右下角那个连接状态图标,绿色和灰色来回闪的时候,别不当回事。这往往是断线的前兆,这时候你手动关掉EA,比让它硬扛强。等连接稳定了再开,至少不会错过止损。止损没执行,那可不是闹着玩的,爆仓就分分钟的事。

说到底,维护时段固不固定,取决于你选的平台负不负责任。负责任的大平台,维护时间表挂在官网清清楚楚,你按规矩避开就行。小平台那就看命了,今天凌晨修这个,明天凌晨补那个,鬼知道它下次啥时候抽风。反正我是吃过亏的,那年原油负价格事件,我平台凌晨五点紧急维护,正好卡在暴跌那波,EA愣是没止损,亏了我半个月利润。

写这么多,其实就一句话:别指望平台来迁就你,自己把EA的容错机制做扎实,比啥都强。你可以在代码里加个断线重连函数,或者干脆写个定时重启脚本,凌晨自动断开重连一次,保证连接新鲜度。方法多得很,关键是你愿不愿意花时间去搞。反正我是不想再半夜被手机报警吵醒了,那滋味,谁试谁知道。

文章目录