手把手构建MQL5新闻交易EA
用OOP与CSV日历实现自动新闻动能交易
什么是新闻交易与本文目标
新闻交易者是指依据宏观经济报告如GDP、非农、消费者信心等数据决定买卖的交易者。这类数据常引发货币对剧烈波动,甚至成为趋势反转催化剂。本文目标不是给你一个稳赚的圣杯,而是提供一套可运行的技术基础:用MQL5面向对象编程(OOP)构建一个读取新闻日历、并用动量指标在新闻窗口反应式下单的EA。原文为2014年MetaQuotes译介的进阶教程,今天仍具教学价值。
系统核心理念很简单:新闻时间附近若价格出现强加速(动量偏离基准值),就假定短期会反抽而下反向单。EA依赖两方面:一是iMomentum动量指标衡量影响;二是用MQL5文件函数把自选新闻日历存为CSV加载进内存。全部采用OOP,便于扩展与维护。
EA的面向对象框架设计
我们把EA想象成有生命的生物,拆成几个部分:CBrain(大脑/只读存储器式中心)、CEvolution(进化/状态机)、CTechIndicators(指标容器)、CNewsContainer(新闻报纸)。CNewsWatcher是主控类,在OnTick里调用这些组件。CBrain持有止损、止盈、手数与新闻容器,是整个系统的ROM中心。
这种分解的好处是职责单一:指标只管算动量,新闻容器只管载入CSV,大脑只管参数与容器,Watcher只管择时下单。后续你想换数据源或加过滤,只需改对应类,不影响主逻辑。
CNewsWatcher* NW = new CNewsWatcher(StopLoss,TakeProfit,LotSize,CsvFile);
int OnInit(void)
{
NW.Init();
NW.GetTechIndicators().GetMomentum().SetHandler(Symbol(), Period, 13, PRICE_CLOSE);
return(0);
}
void OnTick()
{
SymbolInfoTick(_Symbol, tick);
NW.GetTechIndicators().GetMomentum().UpdateBuffer(2);
NW.OnTick(tick.ask,tick.bid);
}
技术指标与新闻的OOP封装
CTechIndicators是一个容器,内部持有CMomentum。CMomentum是对iMomentum的包装:用iMomentum拿到句柄,数组以时间序列存放缓冲区。这样主程序不直接调内置函数,而是通过GetMomentum().UpdateBuffer()统一更新。标准库已提供部分指标类,但自己包一层更贴合设计。
CNewsContainer则是“报纸”:构造时读CSV,用CArrayObj把多条CNew对象存内存。CNew是单条新闻模型,含国家、发布时间、事件名。SetNews方法用CFileTxt读data_folder\MQL5\FILES\下的CSV。注意CSV首行是Country;Time;Event。
class CNew : public CObject
{
protected:
string m_country;
datetime m_time_release;
string m_name;
public:
CNew(string country,datetime time_release,string name);
string GetCountry(void);
datetime GetTimeRelease(void);
string GetName(void);
};
核心交易逻辑与反应式下单
在CNewsWatcher::OnTick中,先取当前新闻CNew* currentNew = GetBrain().GetNewsContainer().GetCurrentNew()。用TimeGMT窗口(如前后600秒)判断是否进入新闻监听区。若无持仓且动量缓冲>100.10则状态设SELL,<99.90则BUY,随后索引+1跳过该新闻。有持仓则DO_NOTHING,让原有单跑止盈止损。
这是一种反向均值假设:强势上扬后卖,强势下行后买。原文明确说可改进,仅提供基础。现实中同时间多新闻需在CSV分行写,EA只处理一条就跳到下一条,且持仓时忽略新新闻,所以回测真实数据仅触发三次操作。
if(timeHasCome && momentumBuffer[0] > 100.10)
{
GetEvolution().SetStatus(SELL);
GetBrain().GetNewsContainer().SetCurrentIndex(indexCurrentNew+1);
}
else if(timeHasCome && momentumBuffer[0] < 99.90)
{
GetEvolution().SetStatus(BUY);
GetBrain().GetNewsContainer().SetCurrentIndex(indexCurrentNew+1);
}
文件结构与安装步骤
附件含Enums.mqh、CBrain.mqh、CEvolution.mqh、CMomentum.mqh、CNew.mqh、CNewsContainer.mqh、CNewsWatcher.mqh、CTechIndicators.mqh、ExpertNewsWatcher.mq5及news_watcher.txt。安装:建MQL5\Include\Mine存Enums;建MQL5\Experts\NewsWatcher存其余mqh与mq5;把txt改名csv放Files。编译后正常回测。
- 创建Include\Mine并放Enums.mqh
- 创建Experts\NewsWatcher并放7个mqh与mq5
- news_watcher.txt重命名为.csv放入Files
- MetaEditor编译ExpertNewsWatcher
- 策略测试器选M1与对应参数回测
回测参数与数据准备
原文输入:Period=PERIOD_M1,StopLoss=400点,TakeProfit=600点,LotSize=0.01,CsvFile=news_watcher.csv。先用伪数据(动量值标注的假新闻)看可控环境行为,再用DailyFX真实数据。真实数据同时间多条新闻要分行,否则漏处理。
Country;Time;Event USD;2013.07.15 12:30:00;USD Advance Retail Sales (JUN) and others USD;2013.07.16 12:30:00;USD Several Consumer Price Indexes
常见错误与对比其他方案
错误1:文件报错5002,全是路径或扩展名不对。错误2:同分钟多新闻只触发一次,需CSV拆分。错误3:动量周期写死13,未随品种波动调整。对比直接调iMomentum裸写EA,OOP版虽代码多但可复用;对比MQL5信号跟单,本方案自主可控但需维护日历。与MT4相比,MQL5有标准库CArrayObj和FileTxt,MT4需自己写文件解析。