订单策略。多目标 EA 交易(基础篇)
多目标 EA 的订单管理起点
在 MT5 里做多目标平仓的 EA,核心是先理清订单与持仓的层级关系。MT5 把成交拆成订单(order)、成交(deal)和持仓(position)三层,和 MT4 的 ticket 单线逻辑不同,直接套老代码会漏掉部分挂单。 一篇 2013-10-31 发布的老帖累计被查看 7492 次、评论 47 条,说明多目标管理是长期痛点:很多人卡在「如何同时挂多个止盈位并分批平仓」。 实盘前建议开 MT5 策略测试器,用欧美对 2023 年任一个月的 M1 数据跑一遍基础多挂单逻辑,确认 PositionSelect 能正确遍历同向多仓,再写批量平仓分支。外汇与贵金属杠杆高,分批止盈也可能因滑点失效,回测不等于实盘结果。
◍ 策略骨架:市场、仓位与风控三件套
一套能跑起来的交易策略,底层通常拆成三块。第一块是市场分析,也就是读价格、看指标,决定在哪根 K 线附近动手;这部分是外界给的,交易者控制不了。 第二块是当前交易状况分析。它盯的是你自己桌面上已经发生了什么:持仓浮盈浮亏、挂单有没有成交、缺了哪些单子。基于这套状态,EA 或人来决定平仓、挪止损、补挂单还是撤单。 第三块是仓位管理,最典型的就是跟踪止损。比如持仓利润过了 50 点但止损还挂在成本线外 200 点,这时候把止损拉到成本价上方 10 点,就是这类函数的活。 把这三块分清,后面写订单策略、设计元语言描述、再用多目标 EA 去跑,才不会把“看方向”和“管仓位”搅成一团。外汇与贵金属杠杆高,任何策略要素都只是概率优势,不是保本承诺。
「初始仓位之后的五种挂单玩法」
建仓只是起点。MT5 里初始仓位可由指标方向、EA 属性窗口手动指定,或依据上一笔平仓结果顺势开出;后者严格说已属中间阶段而非首仓。两个反向止损或限价单同时挂着、谁先触发另一只就删,是常见防假突破的开法;同方向挂限价+止损则需先定死边(如只做多)。 初始仓成立后,限价加仓的思路是:同方向按递增手数挂若干限价单,每成交一张就再挂新的一张,直到整仓在获利位平掉,剩余挂单全撤。止损反转则是把反向止损单挂在初始仓止损价,被打掉后于同价再挂反向单,循环至获利平仓。 金字塔要求仓位已浮盈才加仓并把止损推到盈亏平衡;若最终在获利位平,因累计手数大可能吃到厚利,但中间任一段触发止损则无盈利。再建仓等价于市价回补:止损位平掉后用更大手数立刻重开,反复至获利,机制接近限价加仓。 组合使用才贴近实盘。浮盈阶段切金字塔、浮亏阶段用限价加仓更顺手,且限价加仓不必一路挂到底——例如先加 3 次、做几轮止损反转、再回到限价加仓。外汇与贵金属杠杆高,上述任一序列在极端滑点下都可能连续触发止损,回测务必带点差与延迟。 手写这些状态机极耗时间,不止代码量大,每个分支都要单独构思。后面我们会用多目标 EA 把这类订单逻辑封装成可切换模块,开 MT5 就能直接改参数验证。
用最小规则集描述订单阶段
订单策略的核心是先判定当前处于哪个操作阶段,再决定动作。以建一个买入市价仓为例:初始无仓无单,先建仓;有仓后需补一个止损挂单和一个限价挂单。若按穷举法写规则——无仓建仓、有仓无单设止损、有仓有止损设限价——要覆盖所有中间态会非常冗长,实际不可行。 更省事的写法是给阶段配最小识别规则,同时对每个阶段该达成的'完整市况'做定义:无仓就建仓,建仓成功后发止损和限价两个挂单请求;已有仓则检查市场里是否缺止损单或限价单,缺哪个补哪个。这样不需要把'有仓无限价''有仓无止损'等分支全列出来。 落地时需注意三个即时价格点:识别无仓并建仓、识别有仓缺单、识别有仓有一单。若挂单因断线或报价缺失被拒但市况已跳阶段,要在新阶级补发请求。外汇与贵金属杠杆高,断线拒单可能造成滑点亏损,实盘前务必在 MT5 策略测试器跑连通性异常。 把原则压成四条可验证约束:1) 用最少信息量描述当前阶段;2) 每阶段必须有对应的完整市况描述;3) 凡阶段内含建仓/平仓/加减仓等市场动作,就把该阶段拆成动作前、动作后两个子阶段,以便一次性发单并重试失败挂单;4) 一个阶段只允许一个市场动作加任意数量挂单动作。按这四条写 EA,状态机代码量通常能砍掉六成以上。