EA 遥控方法(基础篇)
📘

EA 遥控方法(基础篇)

第 1/3 篇

◍ 用 EA 在 MT5 里遥控图表对象

在 MetaTrader 5 里,EA 不只是下单工具,也能通过代码直接操控图表上的对象,实现类似“遥控”的效果。2018 年 11 月 28 日有一篇示例帖被查看 5924 次、评论 15 条,说明这类玩法在实盘社群里一直有需求。 核心思路是:EA 在 OnTick 或自定义事件里调用 ObjectCreate / ObjectSetInteger 等函数,动态画线、改标签、移动箭头。这样你人不在电脑前,策略逻辑也能在图表上留下可视痕迹,或者把信号推给另一个监听 EA。 外汇与贵金属杠杆高、滑点跳空频繁,这类遥控对象只负责“显示与标记”,真正下单仍需独立风控,不能因图上信号自动重仓。读者可开 MT5 新建一个 EA,把下面片段塞进 OnTick 验证对象是否随 tick 移动。

MQL5 / C++
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 就会以新属性重启。外汇与贵金属波动剧烈、杠杆高风险大,改模板前建议在模拟盘先验证。

MQL5 / C++
<span class="tag">&lt;<span class="title">chart</span>&gt;</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">&lt;<span class="title">expert</span>&gt;</span>
name=ExpertMACD
path=Experts\Advisors\ExpertMACD.ex5
expertmode=class="num">0
<span class="tag">&lt;<span class="title">inputs</span>&gt;</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">&lt;/<span class="title">inputs</span>&gt;</span>
<span class="tag">&lt;/<span class="title">expert</span>&gt;</span>
<span class="tag">&lt;<span class="title">window</span>&gt;</span>
height=class="num">162.766545
objects=class="num">103
<span class="tag">&lt;<span class="title">indicator</span>&gt;</span>
name=Main
........
<span class="tag">&lt;/<span class="title">indicator</span>&gt;</span>
<span class="tag">&lt;<span class="title">object</span>&gt;</span>
.......
<span class="tag">&lt;/<span class="title">object</span>&gt;</span>
<span class="tag">&lt;<span class="title">object</span>&gt;</span>
........
<span class="tag">&lt;/<span class="title">object</span>&gt;</span>
........
........
<span class="tag">&lt;<span class="title">object</span>&gt;</span>
........
<span class="tag">&lt;/<span class="title">object</span>&gt;</span>
<span class="tag">&lt;/<span class="title">window</span>&gt;</span>
<span class="tag">&lt;<span class="title">window</span>&gt;</span>
height=class="num">50.000000
objects=class="num">0
<span class="tag">&lt;<span class="title">indicator</span>&gt;</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">&lt;<span class="title">graph</span>&gt;</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">&lt;/<span class="title">graph</span>&gt;</span>
<span class="tag">&lt;<span class="title">graph</span>&gt;</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">&lt;/<span class="title">graph</span>&gt;</span>
fast_ema=class="num">12
slow_ema=class="num">24
macd_sma=class="num">9
<span class="tag">&lt;/<span class="title">indicator</span>&gt;</span>
<span class="tag">&lt;/<span class="title">window</span>&gt;</span>
<span class="tag">&lt;/<span class="title">chart</span>&gt;</span>

常见问题

把 EA 设计成读取模板文件里的开关标记,手机改模板另存,电脑端 EA 定时扫模板即可自动停单。
用全局命令管理器骨架,一个 EA 写指令到公共对象,另一个 EA 读对象执行,避免直接互相调用。
可以,小布盯盘已内置模板遥控诊断,打开品种页就能看 EA 状态并下开关指令,不用你自己改文件。
EA 默认隔离在各自图表周期,需靠模板文件或全局对象中转,才能跨图表共享遥控信息。
能,EA 循环读模板里的方向参数,改文件保存后下一 tick 就会按新参数过滤信号,无需重启。