订单策略。多目标 EA 交易·进阶篇
(2/3)· 从识别订单到描述策略,多数EA卡在第二步——不会把挂单逻辑写成可复用的规则
用注释给订单打最短标签
在 MT5 里区分自己下的单子和经纪商动过的单子,最轻量的办法是往订单注释里塞一个短标识符。但注释字段长度受限,部分交易商还会往里追加自己的内容,若空间不够,你写的部分可能被截断。 实测中,把标识符压到最多 4 个字符最稳:比如 1~2 个数字,或一个字母配 1~2 个数字。关键是在末尾拼一个 '=' 号——目前没见过哪家交易商在自己的注入内容里用这个符号,拿它当分隔锚点就不会和券商文本混在一起。 下面两个函数直接能拷进 EA 用:GetID 从注释里截出 '=' 之前的子串作为 ID;FitsID 判断某条注释是否以指定 ID 加 '=' 开头,用来筛选属于自己的仓位。外汇与贵金属杠杆高,误判订单归属可能触发重复开仓,上线前务必在策略测试器里用真实点差回放验证。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| 从aComment字符串中获取标识符的函数 | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">class="kw">string GetID(class="type">class="kw">string aComment) { class="type">int p =StringFind(aComment,"=",class="num">0); class=class="str">"cmt">// 确定分隔符的位置 class="type">class="kw">string id=StringSubstr(aComment,class="num">0,p); class=class="str">"cmt">// 获取分隔符前的子字符串 class="kw">return(id); } class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| 检查已设置标识符的备注 | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool FitsID(class="type">class="kw">string aID,class="type">class="kw">string aComment) { class="kw">return(StringFind(aComment,aID+"=",class="num">0)==class="num">0); } class=class="str">"cmt">//+------------------------------------------------------------------+
「用一行文本驱动 MT5 下单逻辑」
把订单策略写成纯文本文件,再在 EA 属性里挂上文件名,就能让 MQL5 按行解析执行,避免运行时做多余计算。每行对应一个系统阶段,用竖线 '|' 切出左右两域:左域写阶段识别规则,右域写动作列表,多项用分号 ';' 隔开,右侧 '#' 之后是注释。 识别域靠交易数据访问指令拿仓位、挂单、上一笔交易的信息。比如 Buy(M1) 表示市场里得存在一个标识符为 M1 的买入仓位;Buy(M1,StopLossInPoints)>=0 则是在检查该仓位止损点数非负。对照符支持 >=、<=、==、!=、>、<,右侧可写数字、Var1~Var20 变量,数字或变量后加 'p' 表示乘上 _Point 点值,也允许 X1*X2+X3*X4 这类算式。 动作域覆盖建仓、平仓、挂单、改单及管理函数。Buy(ID,Lot,StopLoss,TakeProfit) 开买仓,SellStop(ID,Lot,Price,StopLoss,TakeProfit) 挂卖损单,TrailingStop 与 BreakEven 的参数在 EA 属性窗定。参数可用常量、变量或现有仓位字段,甚至套用算式。 下面这段可直接塞进策略文本验证:左域 Nothing 命中市场无仓位无挂单,右域开一个标识符 M1、1 手、无止损无获利的买仓。第二行是带负号的算式组合,用作识别条件的复合表达,读者可在 MT5 自建 EA 加载后观察解析是否报错。外汇与贵金属杠杆高,文本逻辑错误可能瞬间触发非预期下单,务必先在模拟盘跑通。
Nothing | Buy(M1,class="num">1,class="num">0,class="num">0) class="macro">#If there is no position or order in the market, open a Buy position, mark it with "М1", lot class="num">1, no Stop Loss, no Take Profit. -BuyStop(BS1,StopLossInPoints)*-SellLimit(SL1,StopLossInPoints)+-SellStop(SS1,StopLossInPoints)*-BuyLimit(SL1,StopLossInPoints)
◍ 三种订单编排的元程序落地
用元语言写策略,核心是把交易过程拆成带阶段标识的状态机。标识符里别碰 +、-、* 这类符号,纯数字最稳,后续写注释和排错都省事。EA 属性窗口定好方向后,初始仓由用户设定,加仓逻辑靠限价单递推。 限价加仓那套规则里,最多连加 5 次,但盘面同时只容 3 张限价单。每张新单的挂价都锚在上一单 OpenPrice 减 Var2p,且必须前一单先挂成才能挂下一张——按市场价反推挂单位置会丢单。阶段 7 和 14 触发时,最后一张单要给止损(Buy(6) 改止损到 OpenPrice-Var4p)。外汇和贵金属波动快,这种链式挂单在滑点行情可能断环,实盘前务必在 MT5 策略测试器跑一遍。 止损反转的做法不同:开局双向各挂一张 Stop,最多反转 5 次。阶段 4 里 Buy(1) 成交后立刻 Delete(1) 清掉另侧旧单,再挂 SellStop(2) 于 Buy(1,StopLossValue)。仓位在获利位平掉而挂单还在时,阶段 14–23 逐个 Delete 对应标识符回到初始态。 金字塔加仓靠指标信号起手,盈利达 Var3 点才加下一层,且每层止损推到自身开仓价(盈亏平衡)。阶段 1 的获利先宽挂 Ask+Var2p*6,之后逐层收窄到 *5、*4、*3。贵金属隔夜跳空可能让止损移动来不及成交,属高风险情形。
从双向金字塔到信号驱动的收尾逻辑
金字塔加仓的卖出侧与买入侧完全镜像:阶段 12 起以 Sell(1,1,Bid+Var1p,Bid-Var2p*6) 开局,每触发一次 Var3 盈利阈值就反向加一层,止损间距按 Var2p 的倍数逐层收缩(*6、*5、*4…*1),直到第 6 层 Modify 把止损推到开仓价。外汇与贵金属杠杆高,这种反向金字塔在单边反转时可能快速吞噬浮盈,MT5 策略测试器里把 Var2、Var3 拆开跑一遍才知本地品种是否扛得住。 再建仓元程序换了一套思路:开局同时挂 BuyLimit 与 SellLimit 各一张,谁先成交另一张立刻 Delete。若上笔 EA 交易亏损,按原方向以翻倍手数续建——阶段 8 到 15 的手序为 2、4、8、16,亏损序列里仓位指数扩张,账户回撤可能陡增。Var1 控制挂单偏离市价点数,Var2 是止损、Var3 是获利,三个参数直接决定触发频率。 最后三组极简程序把重心移到信号本身。表 9 只用 SignalOpenBuy/Sell 配合 NoTradeOnBar 过滤同根 K 线重复开仓,平仓交给 SignalClose 系列;表 10 在持单阶段挂 TrailingStop,表 11 改用 BreakEven。三者性能图(图 9–11)显示信号类逻辑曲线更平滑,但实盘里信号闪烁会造成滑点损耗,建议把 NoTradeOnBar 改成更严的成交间隔再上贵金属。