Mac运行MT4 - MT4电脑版历史行情数据恢复操作全流程_TimeHour结合其他时间函数的进阶过滤技巧

OrderComment函数的基本用法
OrderComment是MQL4中用来获取订单注释的标准函数,它返回的是字符串类型的数据。调用方式特别简单,在选中订单之后直接写OrderComment()就能拿到当前选中订单的注释内容。不过这里有个关键点需要特别注意,这个函数必须和OrderSelect配合使用,因为MQL4的所有订单操作都是基于当前选中订单的。
举个最简单的例子,假设我想查看账户里最后一笔订单的注释,代码就得这么写:先调用OrderSelect选择最后一笔订单,然后直接用OrderComment()读取注释。这个函数不需要任何参数,返回的就是订单注释的字符串。如果你在MT4的终端窗口里看到过订单的注释列,那OrderComment读取的内容就是那一列的数据。
实际使用的时候有个小坑得提醒大家,OrderComment返回的字符串有时候会带一些额外的字符。比如通过某些桥接软件下的单,注释里可能会自动加上前缀或者后缀。我在测试的时候就遇到过这种情况,明明自己写的注释是"EA_Test_01",结果读出来变成了"Test_EA_Test_01"。所以如果要拿注释做条件判断,最好先用StringFind或者StringSubstr处理一下。
另外还要注意编码的问题。MT4的注释支持Unicode字符,但如果你在旧版本的MT4上运行,可能会遇到中文注释显示乱码的情况。我建议在写注释的时候尽量用英文或者数字,这样兼容性会好很多。实在要用中文的话,记得在代码里加个字符编码转换的处理。
一步步操作将趋势线延长到未来
第一步,用鼠标左键单击你画好的那条趋势线,这时候线两端会出现两个白色的小方块,表示你已经选中了它。然后右键点击这条线,在弹出的菜单里选择“属性”或者“F8”快捷键调出对象属性窗口。如果你的MT4是中文版,那菜单里显示的就是“属性”两个字,英文版则是“Properties”。
进入属性窗口后,你会看到好几个选项卡,分别是“常用”、“线”、“参数”等等。这时候你要切换到的选项卡名称是“参数”,因为趋势线的延伸设置就藏在这里。在“参数”选项卡里,你会看到“射线”这个复选框,勾上它之后,趋势线就会从起点开始无限延伸出去。但这里有个细节要注意,勾选“射线”后,线只会往一个方向延长,具体是向左还是向右,取决于你画线时的起点和终点位置。
实操中我发现,如果你画线时是从左往右画的,那射线会向右延伸,正好覆盖未来区域。但如果是从右往左画的,射线就会向左延伸,反而跑到过去的历史区域去了。所以如果你发现延长方向不对,最简单的办法就是重新画线,确保起点在左边,终点在右边。还有个更直接的方式,在“参数”选项卡里找到“射线”选项旁边的方向设置,手动调整延长的方向。
利用EA实现全自动更新挂单价格
要真正实现“每天自动跟随前日高点”的效果,就需要借助EA的力量。其实逻辑非常清晰:在EA的OnTick函数里,先判断是否到了新的一天,如果是,就删除之前的挂单,然后取当前图表时间周期为日线(或者用iHigh(Symbol(), PERIOD_D1, 1)函数直接读取昨天日K线的最高价),再在当前价格加上一个固定偏移量,最后用OrderSend函数挂一个新的Buy Stop单。
听起来是不是不算太复杂?对,核心代码可能就二三十行。我给个简单的伪代码思路:先用iTime(Symbol(), PERIOD_D1, 0)获取今天开盘时间,如果这个时间发生变化,说明新的一天开始了,这时候先调用OrderDelete函数删掉所有旧挂单,然后用iHigh函数拿到前日最高价,再加上你设定的点数值,最后OrderSend挂单。如此循环,每天都自动更新。
但这里有几个坑必须提醒大家。第一个坑是时区问题,MT4服务器的时间通常不是北京时间,所以“新的一天”的判定要以服务器时间为准,否则可能在你还在睡觉的时候EA就已经更新了挂单。第二个坑是挂单距离限制,有些经纪商会规定挂单价格不能离当前市价太远或太近,如果你设置的触发价距离现价太远,下单会报错,需要先检查经纪商的交易规则。
第三个坑是EA的实时监控机制。如果你把EA加载到图表上,它只在MT4运行且图表打开的状态下才会工作。如果你关闭了MT4或者删除了图表上的EA,挂单依然存在,但EA不会再更新后续的挂单价格。所以最好把MT4设置为开机自启动,并保证网络稳定。
TimeHour结合其他时间函数的进阶过滤技巧
仅仅用TimeHour控制小时级别的过滤其实还不够精细,因为有些EA需要精确到分钟级别。比如你想让EA在每个小时的第15分钟到第30分钟之间执行交易,这时候单纯用TimeHour就无能为力了。解决办法是配合TimeMinute函数一起使用。先获取当前小时数,再获取当前分钟数,然后组合判断。代码思路是:int hour = TimeHour(TimeCurrent()); int minute = TimeMinute(TimeCurrent()); if(hour >= 8 && hour < 20 && minute >= 15 && minute < 30)。这样就能实现精确到分钟的时间窗口控制。
还有一种进阶玩法是利用TimeHour来判断当前是上午还是下午,然后结合不同的交易策略。比如上午时段趋势不明显,可以只运行震荡策略,下午时段波动加大,就切换成趋势跟踪策略。这种逻辑在编写时,可以先判断hour < 12作为上午条件,然后根据这个条件选择不同的开仓逻辑。说实话,这种策略切换机制在实盘中确实能提升整体收益稳定性,不过前提是你对市场节奏有足够深的把握。
另外,有些EA需要根据服务器时间来自动调整过滤参数。比如夏令时和冬令时切换时,服务器时间会变化一个小时,如果你在代码里写死了交易时段,那到了夏令时就会整体偏移一小时。解决办法是建立一个时间偏移量变量,让用户可以手动调整。或者更智能一点,用Month函数判断当前月份,自动调整时段范围。虽然这样会增加代码复杂度,但对于长期运行的EA来说,这种细节处理能避免很多不必要的麻烦。
最后想提醒的是,TimeHour函数虽然简单,但使用时一定要考虑经纪商的服务器时区是否与你的本地时区一致。很多新手写EA时直接用本地时间测试,到实盘就对不上号了。建议在EA初始化时,用TimeGMTOffset函数获取时区偏移量,然后在过滤条件中加上这个偏移量做校正。这样一来,不管你在哪个时区运行EA,时间过滤条件都能保持准确。