"cmt">//+----------------------------------------""> "cmt">//+----------------------------------------"">
让新闻交易轻松上手(第六部分):执行交易(3)(基础篇)
📘

让新闻交易轻松上手(第六部分):执行交易(3)(基础篇)

第 1/3 篇

用 MQL5 把新闻单子自动挂出去

新闻行情最怕手慢,MT5 里用脚本直接发单比手动点快得多。下面这段 MQL5 演示了如何在指定价位下一笔限价单,省掉人工在报价窗口找按钮的时间。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 在指定价位挂限价买单                                          |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void PlaceLimitBuy(class="type">class="kw">double price, class="type">class="kw">double lot)
  {
   class="type">MqlTradeRequest request={class="num">0};
   class="type">MqlTradeResult result={class="num">0};
   request.action=TRADE_ACTION_PENDING;   class=class="str">"cmt">// 动作类型:挂单
   request.symbol=Symbol();               class=class="str">"cmt">// 当前图表品种
   request.volume=lot;                    class=class="str">"cmt">// 手数由参数传入
   request.price=price;                   class=class="str">"cmt">// 挂单价格
   request.type=ORDER_TYPE_BUY_LIMIT;     class=class="str">"cmt">// 限价买
   request.type_filling=ORDER_FILLING_FOK;class=class="str">"cmt">// 成交方式:FOK
   OrderSend(request,result);             class=class="str">"cmt">// 发送交易请求
  }
代码逐行拆解:先清零结构体避免脏数据;action 设成 TRADE_ACTION_PENDING 表示这不是市价单而是待成交挂单;symbol 取当前图表品种,写脚本时不用硬编字符串;volume 和 price 由外部传入,方便小布这类工具按新闻波动带动态算;type 用 ORDER_TYPE_BUY_LIMIT 明确限价买;type_filling 选 FOK 是新闻流动性瞬变时避免部分成交的常用做法。 外汇与贵金属属高风险品种,挂单可能在跳空时直接越过价位成交或滑点放大,上面脚本只解决‘发单’这一步,不保证成交价等于预期。开 MT5 按 F4 编译这段,改 Symbol() 为你盯的 XAUUSD 或 EURUSD,手动传个离市价 10 点的 price 跑一次,验证发送逻辑比读文档快。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 在指定价位挂限价买单                                          |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void PlaceLimitBuy(class="type">class="kw">double price, class="type">class="kw">double lot)
  {
   class="type">MqlTradeRequest request={class="num">0};
   class="type">MqlTradeResult result={class="num">0};
   request.action=TRADE_ACTION_PENDING;   class=class="str">"cmt">// 动作类型:挂单
   request.symbol=Symbol();               class=class="str">"cmt">// 当前图表品种
   request.volume=lot;                    class=class="str">"cmt">// 手数由参数传入
   request.price=price;                   class=class="str">"cmt">// 挂单价格
   request.type=ORDER_TYPE_BUY_LIMIT;     class=class="str">"cmt">// 限价买
   request.type_filling=ORDER_FILLING_FOK;class=class="str">"cmt">// 成交方式:FOK
   OrderSend(request,result);             class=class="str">"cmt">// 发送交易请求
  }

「给数据库和EA补上事件视图与筛选入口」

这一节要动两块地方:存储数据库和智能交易系统(EA)的输入菜单。数据库这边会加几个视图,把 MQL5 经济日历里每个独特事件的最近一次发生日期、以及下一次预计发生日期直接算出来并落表。用户跑程序时不用自己翻日历,就能同时看到过去事件和待发事件的时间点。 EA 输入菜单会扩出两块:新闻筛选条件,以及止损单入场方式的选择。这样交易者可以按事件类型过滤,再决定用突破挂单还是其他止损单逻辑进场。 EA 主代码会复用本系列第四部分讲过的性能提升写法、以及第五部分里管滑点和开止损单的那段。直接调旧函数,能压住策略测试器里的运行耗时,避免在逐根回测时重复计算。外汇与贵金属新闻行情跳空频繁,这类改进只降低计算开销,不消除事件风险。

◍ 新闻过滤的两种配置入口

MT5 内置的新闻模块给了两套筛选逻辑:一套按宏观属性切,一套按事件 ID 切。前者适合做品种层面的事件暴露管理,后者适合盯具体那几条你真正在乎的发布。 按属性切的配置文件里,可控制的维度有五个:日历重要性、事件频率、事件行业、事件类型、事件货币。比如只留「高」重要性的美元货币事件,就能在 EA 或脚本里屏蔽掉低噪声明。 按 ID 切的自定义配置文件更硬核:每个输入项最多填 14 个事件 ID,直接定位到具体经济数据发布,不靠分类猜。外汇与贵金属受新闻跳空影响明显,高杠杆下风险放大,用前先在策略测试器里跑一遍事件触发逻辑。

三种新闻交易入场方式怎么选

EA 把新闻交易的入场拆成三种方式,核心区别在「要不要提前知道事件影响力」和「挂单缓冲怎么留」。 市价成交最直白:新闻事件必须有预估影响力,方向提前定好,数据一出直接市价买或卖。这种方式没有挂单缓冲,滑点风险完全暴露给行情。 止损订单(双向突破)适合不想赌方向的场景:事件前同时挂 buy stop 和 sell stop,价格偏差(偏差值)给 EA 留缓冲空间来摆放挂单。一旦某一侧触发,另一侧由 EA 自动删除。以非农为例,挂好双向止损单后,买止损触发成交,卖止损立刻撤掉,全程不依赖影响力预判。 单一止损订单是双向的精简版:只挂一个方向的止损单,但两个前提缺一不可——事件必须有影响力预判(定方向),且必须设价格偏差供 EA 摆放挂单。外汇与贵金属新闻行情跳空频繁,三种方式均属高风险操作,实盘前建议在 MT5 策略测试器用历史新闻日期回放验证滑点表现。

「新闻模块的数据结构与取数逻辑」

在 News.mqh 里,CNews 类之外先铺了三层基础:NewsSelection 枚举给用户在下单 EA 输入里挑新闻配置文件,myNewsSelection 存当前选择;CustomEvent 结构体带 useEvents 开关和 CEvent1~CEvent5 五组事件 ID,用来做自定义筛选;CalendarComponents 枚举则管经济日历的表与视图,近期新增了 RecentEventInfo_View 与 UpcomingEventInfo_View 两个值。 GetCalendar(CalendarData &Data[]) 负责从 NEWS_DATABASE_FILE 读库,按 myNewsSelection 分流 SQL:选自定义事件就 JOIN MQL5Calendar 与 TimeSchedule 按 EventIds 过滤;选新闻设置就按重要性、频率、行业、类型、货币筛。查询失败会打印错误和那条 SQL,方便你直接抄进 SQLite 客户端排错。 EconomicDetailsMemory 是内存取数的核心。ImpactRequired 为 true 时,SQL 要算过去 24 个月内预测值对先前值(大于/小于/等于)趋势相近的历史事件影响力,并分配给当日与下一事件;为 false 时只取当日加其后 60 天内的下一事件。NewsTime[] 数组随 DatabaseReadBind 每行动态 ArrayResize 扩 1,不是预分配。 EconomicNextEvent 用 TimeTradeServer() 比 EventDate,从 CalendarArray 里挑最早的未来事件写进 UpcomingNews;isEvent 则以 SecondsPreEvent 为提前阈值、加 59 秒为上界,用 CTime.TimeIsInRange 判断窗口内是否有事件,命中就通过引用回写 Name / Importance / Code。 构造器 CNews::CNews(void) 把 AutoDST、Record、TimeSchedule、MQL5Calendar 等表的 DROP/CREATE/INSERT,以及 Calendar_AU、Calendar_UK 等视图和 OnlyOne_AutoDST 之类触发器一次性初始化。你开 MT5 新建 EA 引这个头文件,断点跟一遍构造器,就能看到库文件怎么被建起来。

◍ 用 SQL 视图把财经日历切成可盯的薄片

日历数据落库后,如果直接全表扫,盯盘时根本分不清哪些事离当前价格近。原文里把夏令时切换和日历组件分别建了 SQL 视图,按重要性、货币、日期三个轴做结构化,相当于在 MT5 后台先替你过滤了一遍噪声。 以 Calendar_AU 为例,它从 MQL5Calendar、Record、TimeSchedule 三张表拉数据,用 CASE 把澳洲时区日期 DST_AU 和当前日期 R.Date 比,标成「昨天 / 今天 / 明天」,WHERE 只留前后各一天的事件,ORDER BY DST_AU 升序。这样你打开视图,看到的就只是未来 24 小时 + 过去 24 小时内的澳系事件。 日期格式是个坑:原始 DST_ 列存的是 '2024.09.23' 这种点号串,REPLACE(Time, '.', '-') 转成 '2024-09-23' 才能进 DATE() 比较。重要性字段也带前缀,REPLACE(MC.EVENTIMPORTANCE,'CALENDAR_IMPORTANCE_','') 剥掉后得到 HIGH / MODERATE / LOW,方便你按等级排盯盘优先级。 Event Info 视图用 SELECT DISTINCT 去重,并自定义排序:HIGH 赋 1、MODERATE 赋 2、LOW 赋 3、其余赋 4,国家升序、行业降序。Recent Event Dates 和 Upcoming Event Dates 两个视图则用 CTE 先取唯一事件,再分别用子查询 LIMIT 1 抓最近一次或下一次发生时间,strftime('%w', ...) 把日期转成星期几。 实盘接这套结构时,外汇和贵金属事件受央行发言影响跳空频繁,属于高风险品类;视图只解决「看什么」,入场仍要结合价格行为确认。把这四个视图挂到你的本地库,MT5 每次跑完日历同步,直接查 Calendar_US 就能知道接下来一天美元系事件排布。

MQL5 / C++
CREATE VIEW IF NOT EXISTS Calendar_AU AS
SELECT
  C.Eventid,
  C.Eventname,
  C.Country,
  CASE
    WHEN T.DST_AU < R.Date THEN &class="macro">#x27;Yesterday&class="macro">#x27;
    WHEN T.DST_AU = R.Date THEN &class="macro">#x27;Today&class="macro">#x27;
    WHEN T.DST_AU > R.Date THEN &class="macro">#x27;Tomorrow&class="macro">#x27;
  END AS EventDay,
  C.EventCurrency,
  REPLACE(C.EventImportance,&class="macro">#x27;CALENDAR_IMPORTANCE_&class="macro">#x27;,&class="macro">#x27;&class="macro">#x27;) AS Importance
FROM MQL5Calendar C, Record R
INNER JOIN TimeSchedule T ON C.ID = T.ID
WHERE DATE(REPLACE(T.DST_AU,&class="macro">#x27;.&class="macro">#x27;,&class="macro">#x27;-&class="macro">#x27;)) BETWEEN DATE(REPLACE(R.Date,&class="macro">#x27;.&class="macro">#x27;,&class="macro">#x27;-&class="macro">#x27;),&class="macro">#x27;-class="num">1 day&class="macro">#x27;) AND DATE(REPLACE(R.Date,&class="macro">#x27;.&class="macro">#x27;,&class="macro">#x27;-&class="macro">#x27;),&class="macro">#x27;+class="num">1 day&class="macro">#x27;)
ORDER BY T.DST_AU ASC;

常见问题

围绕「让新闻交易轻松上手(第六部分):执行交易(3)(基础篇)」,文章拆解了6个关键环节,帮助读者把方法真正落地。
按文中顺序推进即可:用 MQL5 把新闻单子自动挂出去、给数据库和EA补上事件视图与筛选入口、新闻过滤的两种配置入口 等。
先在小样本上验证再上真实盘;参数别盲调,先看基线表现再迭代。
小布盯盘的 AIGC 已内置类似诊断,打开对应品种页即可看到结构化结论,把重复劳动交给它。