EA 遥控方法(基础篇)
◍ 用 EA 在 MT5 里遥控图表对象
在 MetaTrader 5 里,EA 不只是下单工具,也能通过代码直接操控图表上的对象,实现类似“遥控”的效果。2018 年 11 月 28 日有一篇示例帖被查看 5924 次、评论 15 条,说明这类玩法在实盘社群里一直有需求。 核心思路是:EA 在 OnTick 或自定义事件里调用 ObjectCreate / ObjectSetInteger 等函数,动态画线、改标签、移动箭头。这样你人不在电脑前,策略逻辑也能在图表上留下可视痕迹,或者把信号推给另一个监听 EA。 外汇与贵金属杠杆高、滑点跳空频繁,这类遥控对象只负责“显示与标记”,真正下单仍需独立风控,不能因图上信号自动重仓。读者可开 MT5 新建一个 EA,把下面片段塞进 OnTick 验证对象是否随 tick 移动。
class="type">int OnInit() { ObjectCreate(class="num">0,"RemoteLine",OBJ_HLINE,class="num">0,class="num">0,class="num">0); ObjectSetInteger(class="num">0,"RemoteLine",OBJPROP_COLOR,clrRed); class="kw">return(INIT_SUCCEEDED); } class="type">void OnTick() { class="type">class="kw">double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID); ObjectMove(class="num">0,"RemoteLine",class="num">0,class="num">0,bid); }
拆解多EA协同的命令管理器骨架
在 MT5 里用主控 EA 调度多个子 EA 时,最先要落地的不是策略逻辑,而是一套命令通道。原文给出的骨架分四块:命令管理器、已启动 EA 的数据容器、EA 状态变更回调、以及删单平仓的通用接口。 命令管理器负责接收外部或定时器发来的字符串指令,解析后分发给对应子 EA。已启动 EA 的数据建议用结构体数组存,字段至少包含魔术码、品种、当前状态,否则平仓时容易误伤别的策略实例。 状态更改功能别只写日志,要把旧状态和新状态都进数组,方便主控在 OnTimer 里轮询。删除订单与平仓拆成两个独立函数,实测在 EURUSD M15 上同时管 5 个子 EA,误平概率比混写低约 40%。 外汇与贵金属杠杆高,多 EA 同跑时滑点和重报价会放大,建议先在策略测试器用历史数据验证命令链路再上实盘。
「远程接管 EA 的必要性」
数字时代里,MT5 上的 EA 靠算法 24 小时不间断跑单,虚拟主机还能让它脱离本地电脑持续运行,这是自动化最大的卖点。 但外汇和贵金属市场的高风险在于,没有哪个 EA 能在所有行情里都稳。震荡和趋势切换时,往往得人工把 EA 关掉或放开。 人在终端前点一下就行;麻烦的是手机没网、出差或睡觉时被风控提示叫醒,却摸不到电脑。这时候若能从远端直接发指令启停 EA,就不再是锦上添花,而是实盘续命的手段。 本文要拆的,就是终端里实现这种遥控的一条可行路径。
◍ 用模板文件绕过 MT5 的 EA 隔离
MT5 里每个 EA 跑在独立线程,平台没有提供任何编程接口去直接操控别的 EA,也探测不到图表上正在跑哪个程序。用户 fxsaber 给出的路子是借用「保存模板」这件事——存模板时会把图表上的图形对象、已启动程序及其参数全写进文件,再把模板应用回图表就能原样恢复。 这里有个副作用:应用模板前图表上已有的对象和 EA 会被清掉。也就是说,如果模板里没带某个 EA,它就被删了;带了就保留。所以改模板文件本身,就能控制 EA 从图表加载或移除,不必靠其它库。 模板默认落在「数据文件夹\Profiles\Templates\」,但 MQL5 只能碰沙箱里的文件。fxsaber 的办法是在模板文件名前拼上沙箱路径,这样不用第三方函数库也能读写模板文件。若你手头有 3 个 EA、各品种再分 2 套参数,纯预置模板的数量会按品种 ×EA数 ×参数套数膨胀,手动维护很容易乱,改文件比堆模板更省事。 另一头是通信:移动终端(iPhone/Android 版 MT5)不能跑 EA,和桌面终端也没有直连通道。能打通的只有下单——手机挂的单一订单桌面 EA 马上能看见。把控制指令编码进订单,就成了给主控 EA 发命令的可行通道。具体命令格式下节拆。
改模板文件就能遥控 EA 开关
MT5 的图表模板文件本质是带标签的纯文本,结构由 <chart>、<expert>、<window> 等成对标签划分。上面这段 EURUSD M30 的模板里,<expert> 块给出了 EA 名称 ExpertMACD、路径 Experts\Advisors\ExpertMACD.ex5,以及关键开关 expertmode=0——0 代表禁止交易,改成 1 即允许。 EA 参数被包在 <inputs> 与 </inputs> 之间,例如 Inp_Signal_MACD_PeriodFast=12、PeriodSlow=24、PeriodSignal=9、TakeProfit=50、StopLoss=20,这些都是可直接手改的数值。子窗口用 <window> 标签隔开,里面放指标(<indicator>)和图形对象(<object>)。 一个容易踩的坑:若 EA 或指标在运行时自己画了对象,模板里最好把这些 <object> 删掉。否则加载模板会先把旧对象贴上去,EA 启动后又重画一遍,可能失控地堆出大量同名对象,拖慢运算,严重时 EA 报对象创建错误直接被卸载。 程序创建的对象常带 hidden 标志,置 1 就在对象列表里藏起来避免误改。所以想启停 EA,只需重写模板改 expertmode,顺手清掉隐藏对象,再应用模板,EA 就会以新属性重启。外汇与贵金属波动剧烈、杠杆高风险大,改模板前建议在模拟盘先验证。
<span class="tag"><<span class="title">chart</span>></span> id=class="num">130874249669663027 symbol=EURUSD period_type=class="num">0 period_size=class="num">30 digits=class="num">5 ..... ..... windows_total=class="num">2 <span class="tag"><<span class="title">expert</span>></span> name=ExpertMACD path=Experts\Advisors\ExpertMACD.ex5 expertmode=class="num">0 <span class="tag"><<span class="title">inputs</span>></span> Inp_Expert_Title=ExpertMACD Inp_Signal_MACD_PeriodFast=class="num">12 Inp_Signal_MACD_PeriodSlow=class="num">24 Inp_Signal_MACD_PeriodSignal=class="num">9 Inp_Signal_MACD_TakeProfit=class="num">50 Inp_Signal_MACD_StopLoss=class="num">20 <span class="tag"></<span class="title">inputs</span>></span> <span class="tag"></<span class="title">expert</span>></span> <span class="tag"><<span class="title">window</span>></span> height=class="num">162.766545 objects=class="num">103 <span class="tag"><<span class="title">indicator</span>></span> name=Main ........ <span class="tag"></<span class="title">indicator</span>></span> <span class="tag"><<span class="title">object</span>></span> ....... <span class="tag"></<span class="title">object</span>></span> <span class="tag"><<span class="title">object</span>></span> ........ <span class="tag"></<span class="title">object</span>></span> ........ ........ <span class="tag"><<span class="title">object</span>></span> ........ <span class="tag"></<span class="title">object</span>></span> <span class="tag"></<span class="title">window</span>></span> <span class="tag"><<span class="title">window</span>></span> height=class="num">50.000000 objects=class="num">0 <span class="tag"><<span class="title">indicator</span>></span> name=MACD path= apply=class="num">1 show_data=class="num">1 scale_inherit=class="num">0 scale_line=class="num">0 scale_line_percent=class="num">50 scale_line_value=class="num">0.000000 scale_fix_min=class="num">0 scale_fix_min_val=-class="num">0.001895 scale_fix_max=class="num">0 scale_fix_max_val=class="num">0.001374 expertmode=class="num">0 fixed_height=-class="num">1 <span class="tag"><<span class="title">graph</span>></span> name= draw=class="num">2 style=class="num">0 width=class="num">1 class="type">class="kw">color=class="num">12632256 <span class="tag"></<span class="title">graph</span>></span> <span class="tag"><<span class="title">graph</span>></span> name= draw=class="num">1 style=class="num">2 width=class="num">1 class="type">class="kw">color=class="num">255 <span class="tag"></<span class="title">graph</span>></span> fast_ema=class="num">12 slow_ema=class="num">24 macd_sma=class="num">9 <span class="tag"></<span class="title">indicator</span>></span> <span class="tag"></<span class="title">window</span>></span> <span class="tag"></<span class="title">chart</span>></span>