MT4多开 - MT4报价窗口品种排序按涨跌幅设置技巧_编写EA核心代码片段

默认报价窗口的排序限制
打开MT4的报价窗口,你看到的通常是品种名称、卖价、买价、点差这几列。有些版本可能还有“最后时间”或者“最高/最低”列,但绝对没有涨跌幅这一项。很多新手会习惯性地点一下列标题,比如点“卖价”就能按价格排序,点“点差”就能按点差大小排。但当你试图找涨跌幅时,会发现根本没这个选项。这不是你版本的问题,而是MT4设计上就没把涨跌幅当做一个基础字段放在报价窗口里。说白了,它把涨跌幅这种计算后的数据,留给了图表窗口的指标或者自定义脚本去处理。
有人可能会说,那我在图表上看K线不就行了?但如果你同时盯着几十个品种,一个个切换图表看涨跌幅,效率实在太低。报价窗口的优势在于能一览无余,一眼扫过去就知道哪个品种今天波动大。所以,想让报价窗口按涨跌幅排序,本质上不是点一个现成的按钮,而是需要你手动添加一个“涨跌幅”列。这听起来有点绕,但操作起来其实就几步,关键是找对地方。
我刚开始用MT4时,也以为这个功能被阉割了,查了半天资料才发现,原来MT4的报价窗口支持自定义列。只不过这个自定义入口藏得很深,不在右键菜单里,也不在“工具”选项里,而是在一个叫“市场报价”的图表窗口里。你需要在图表上右键,选“属性”,然后找到“常用”选项卡下的“显示”部分,里面有个“涨跌幅”的勾选项。勾上之后,报价窗口才会多出这一列。这设计确实反直觉,但习惯了就好。
勾上之后,报价窗口的列标题里就会出现“涨跌幅”三个字。这时候,你直接点击这个列标题,品种就会按照涨跌幅从大到小排列,再点一次就是从小到大。跟其他列排序的逻辑完全一样。不过需要注意的是,这个涨跌幅计算的是当前价格相对于前一天收盘价的百分比变化,不是相对于开盘价或者当天的最高最低。所以如果你习惯看日内涨跌,这个数据是准确的。
编写EA核心代码片段
在MT4的MetaEditor中新建一个EA文件,首先定义外部参数,方便调整通道周期和偏差值。比如设置input int period=20和input double deviation=2.0。然后在init函数中初始化指标句柄,用iBands函数绑定当前图表。在OnTick函数里,用CopyBuffer复制最新三个柱的上下轨数据到数组,再获取当前卖价和买价。
关键判断部分这样写:如果卖价大于等于上轨值且上轨未被触发过,则执行Alert("价格触及上轨"),同时将上轨标记设为true。同理,如果买价小于等于下轨值且下轨未被触发过,则触发下轨警报。这里要特别注意,使用卖价对上轨、买价对下轨,因为做空时看卖价,做多时看买价,这样更贴合实际交易。
我还加入了一个重置逻辑:当价格回到通道内部一定距离后,比如距离上下轨超过0.5倍ATR时,重置两个标记。这样价格再次触碰边界时又能重新报警。说实话,这个重置距离需要根据品种的波动率调整,黄金和欧美货币对肯定不一样。我通常用iATR函数计算当前波动率,然后乘以一个系数。
最后别忘了在deinit函数里释放指标句柄,否则EA运行久了会消耗内存。代码写完后,编译成ex4文件,拖到图表上就能运行。第一次测试时,建议先用模拟账户观察几个小时,确保警报触发的时机和频率符合预期。我遇到过因为点差导致价格刚触即离的情况,后来加了5个点的缓冲区间才解决。
实现跨品种信号判断与交易执行
数据拿到手之后,最关键的是怎么用这些数据来做交易决策。比如你想做一个简单的套利策略:当EURUSD和GBPUSD的价差超过某个阈值时,同时开多空两个方向的单子。这时候你需要在EA里实时计算两个品种的价差,并且确保两个品种的订单能同步执行。MQL4的OrderSend函数可以指定品种,所以你完全可以在一个EA里给EURUSD下买单,给GBPUSD下卖单。但要注意,如果你的账户是美元账户,而交易品种是黄金或原油,点值和保证金计算会不同,MT4需要提前用MarketInfo获取点值信息来调整手数。
信号判断的逻辑我建议写在单独的函数里,比如CheckSignal(),它返回一个结构体,里面包含要交易的品种、方向、手数等信息。
这样主循环里的代码就很清晰,只需要调用这个函数然后根据结果执行订单。另外,多品种监控时很容易出现重复开仓的问题。比如你监控了三个品种,每个品种都满足条件,结果EA在同一根K线里下了三单,这可能不是你想要的。所以一定要加个开仓限制,比如每个品种只能有一个持仓,或者整体持仓数量上限。用OrdersTotal函数遍历所有订单,检查每个订单的品种和魔术号,就能避免混乱。
实际测试中我发现,多品种EA的回测是个大坑。MT4的策略测试器一次只能回测一个品种,如果你要测试跨品种策略,得自己写脚本模拟多个品种的历史数据。我通常的做法是先把所有品种的1分钟数据导出为CSV,然后在MQL4里用FileOpen读取这些文件,模拟实时报价。虽然麻烦,但这是目前最可靠的方法。如果你只做简单的价格对比,比如用iClose("EURUSD",PERIOD_M1,0)和iClose("GBPUSD",PERIOD_M1,0)在回测时也能工作,因为测试器会同时加载这两个品种的历史数据,但前提是你在测试设置里把这两个品种都添加到“观察列表”中,否则iClose会返回0。
使用第三方工具或脚本自动备份
对于那些每天都做很多模拟交易的人来说,手动备份实在太麻烦了。这时候可以考虑用一些第三方工具或者自己写个脚本来实现自动备份。MT4支持MQL4语言,你可以写一个简单的脚本,在每次关闭平台时自动把交易记录导出到指定文件夹。网上有很多现成的代码,稍微改改就能用。
我自己就写了一个小脚本,每次平台关闭时自动把历史记录保存成CSV文件,并按日期命名。代码其实很简单,主要用到“HistorySelect”和“HistoryDealsTotal”这两个函数来遍历历史订单。然后把订单信息写入文件,大概也就几十行代码。如果你不会编程,也可以去MQL4社区论坛找现成的,很多热心网友都分享过类似工具。
另外还有一些第三方软件,比如“MT4 History Exporter”或者“Forex History Manager”,专门用来备份MT4交易记录。这些工具通常有图形界面,操作起来比脚本更直观。不过使用前要小心,尽量从官方渠道下载,避免感染病毒。我见过有人下载来路不明的工具,结果电脑被植入了木马,那损失可就大了。
说实话,对于大多数新手来说,最简单的办法还是定期手动导出CSV文件。虽然麻烦一点,但胜在安全可靠。毕竟模拟交易记录主要是用来复盘学习的,没必要搞得太复杂。只要养成每周或者每月备份一次的习惯,基本就不会丢数据了。我自己现在就是每周五收盘后导出一次,然后存到云盘里,已经坚持了好几年,从来没丢过记录。