你有一个交易策略,在脑子里跑了上百遍,手动复盘也验证过了。均线交叉配合RSI过滤,加上固定止损止盈,逻辑很清晰。但你打开MetaEditor,对着空白的代码编辑器发了十分钟呆——MQL5的语法像天书,OnTick()里该写什么完全没头绪。
这个场景太常见了。好消息是,2025年之后,你不用再从零啃MQL5文档了。ChatGPT和Claude这类AI工具,可以帮你把自然语言描述的策略翻译成可运行的MQL5代码。不是完美的代码,但至少是一个能跑的起点。
AI到底能帮你做什么?
先说清楚AI擅长什么,别抱不切实际的期望。
生成代码框架。 你告诉AI"我要一个基于双均线交叉的EA,带RSI过滤,固定手数0.1手,止损50点,止盈100点",它能在30秒内给你一个完整的EA框架。OnInit()、OnTick()、OnDeinit()都帮你搭好,指标调用、下单逻辑、止损止盈全写进去。
解释MQL5函数。 iMA()的参数是什么意思?CTrade类怎么用?PositionGetTicket()和PositionSelect()有什么区别?直接问AI,它的解释比官方文档友好十倍。你甚至可以把一段看不懂的代码贴给它,让它逐行解释。
调试错误。 编译报错"'OrderSend' - no one of the overloads can be applied to the function call",你可能要花半小时查文档。把报错信息和代码贴给AI,它通常能在几秒内告诉你哪个参数传错了。
MQL4代码转MQL5。 你手头有一个老的MQL4 EA,想迁移到MT5上。MQL4的OrderSend()、OrderClose()在MQL5里完全不同,手动改写工作量很大。AI可以帮你把大部分代码自动转换过来。
优化代码结构。 你写了一坨意大利面条一样的代码,全堆在OnTick()里。AI可以帮你拆成独立的函数,加上注释,变得可读可维护。
AI做不了什么?
这部分比上面更重要,请认真看。
AI不能连接实盘市场。 它生成的代码可能在语法上没问题,但它从来没有真正运行过这段代码。它不知道你的经纪商点差是多少,不知道实盘的滑点情况,不知道你的VPS延迟有多高。代码能编译通过和代码能赚钱,是两件完全不同的事。
AI不能保证策略盈利。 你让AI写一个"能赚钱的EA",它会给你一个看起来很合理的策略。但"看起来合理"和"回测盈利"之间隔着一条鸿沟,"回测盈利"和"实盘盈利"之间又隔着另一条鸿沟。AI不懂市场,它只懂代码。
AI不能替代回测。 这一点怎么强调都不过分。AI写出来的每一行代码,你都必须在MT5的策略测试器里跑过才算数。至少用5年以上的历史数据,选"每个报价基于真实报价"模式,检查回测报告里的盈利因子、最大回撤、夏普比率。
AI会编造不存在的函数。 这是大语言模型的通病,叫"幻觉"。它可能很自信地写出一个MQL5里根本不存在的函数名,或者把MQL4的函数用在MQL5里。你不能无脑复制粘贴。
怎么一步步用AI写EA?
直接说"帮我写一个EA"是最糟糕的提示方式。你会得到一个很笼统的模板,离你的实际需求差得远。正确的做法是把策略拆成模块,一个一个来。
第一步:把策略拆成模块
任何一个交易策略都可以拆成四个核心模块:
- 入场逻辑:什么条件满足了才开仓?
- 出场逻辑:什么条件满足了才平仓?止损止盈怎么设?
- 仓位管理:每次下多少手?固定手数还是按账户百分比?
- 过滤条件:什么时候不交易?有没有时间过滤、趋势过滤、波动率过滤?
先在纸上把这四个模块的规则写清楚。用数字,别用模糊的描述。"均线金叉买入"太模糊了,"20周期EMA上穿50周期EMA时,在下一根K线开盘价买入"才是AI能理解的精确描述。
第二步:用自然语言描述每个模块
以一个具体的MA交叉+RSI过滤策略为例,你可以这样描述给AI:
入场模块:
- 多头入场:20周期EMA上穿50周期EMA,且RSI(14)在40-65之间,在当前K线收盘后的下一个tick开多单
- 空头入场:20周期EMA下穿50周期EMA,且RSI(14)在35-60之间,在当前K线收盘后的下一个tick开空单
- 只在H1时间框架上交易EUR/USD
出场模块:
- 止损:50点固定止损
- 止盈:100点固定止盈
- 移动止损:当盈利超过30点后,启动20点的追踪止损
仓位管理:
- 固定手数0.1手
- 同一时间最多持有1个订单
过滤条件:
- 只在伦敦时段(服务器时间08:00-16:00)交易
- 周五下午15:00之后不开新仓
第三步:让AI逐模块生成代码
先要入场逻辑的代码。给AI的提示可以这样写:
用MQL5写一个函数,检测20周期EMA是否上穿50周期EMA。使用iMA()获取指标handle,用CopyBuffer()获取指标值。返回1表示多头信号,返回-1表示空头信号,返回0表示无信号。请使用MQL5的标准写法,不要用MQL4的函数。
注意最后一句话——"不要用MQL4的函数"。这个提醒非常重要,后面会详细说。
拿到入场逻辑的代码后,再分别要RSI过滤函数、下单函数、移动止损函数。每个函数单独测试,确认编译通过,再把它们组合到OnTick()里。
第四步:审查、组合、测试
AI给你的代码不是成品,是半成品。你需要做三件事:
-
检查编译。 把代码贴到MetaEditor里,按F7编译。有报错就把错误信息发回给AI,让它修。通常2-3轮就能编译通过。
-
视觉测试。 在MT5策略测试器里选"可视化模式",看EA在图表上是不是按照你的逻辑在开平仓。均线交叉的时候开仓了没有?RSI超出范围的时候跳过了没有?追踪止损生效了没有?
-
完整回测。 用至少5年的历史数据做完整回测。看四个关键指标:总净利润、最大回撤、盈利因子(大于1.5比较理想)、交易次数(太少说明样本不够)。
实战演示:MA交叉策略的关键代码
用上面的策略,AI生成的入场检测函数大致长这样:
int CheckEntrySignal()
{
int handleFast = iMA(_Symbol, PERIOD_H1, 20, 0, MODE_EMA, PRICE_CLOSE);
int handleSlow = iMA(_Symbol, PERIOD_H1, 50, 0, MODE_EMA, PRICE_CLOSE);
int handleRSI = iMA(_Symbol, PERIOD_H1, 14, 0, MODE_EMA, PRICE_CLOSE);
double fastMA[2], slowMA[2], rsi[1];
CopyBuffer(handleFast, 0, 0, 2, fastMA);
CopyBuffer(handleSlow, 0, 0, 2, slowMA);
CopyBuffer(handleRSI, 0, 0, 1, rsi);
ArraySetAsSeries(fastMA, true);
ArraySetAsSeries(slowMA, true);
ArraySetAsSeries(rsi, true);
// 金叉:快线从下方穿越慢线
if(fastMA[1] < slowMA[1] && fastMA[0] > slowMA[0])
{
if(rsi[0] > 40 && rsi[0] < 65)
return 1; // 多头信号
}
// 死叉:快线从上方穿越慢线
if(fastMA[1] > slowMA[1] && fastMA[0] < slowMA[0])
{
if(rsi[0] > 35 && rsi[0] < 60)
return -1; // 空头信号
}
return 0; // 无信号
}
等一下——你发现问题了吗?
RSI的指标handle用了iMA()函数,这是错的。RSI应该用iRSI()。这恰好就是AI常犯的错误之一。正确的写法应该是:
int handleRSI = iRSI(_Symbol, PERIOD_H1, 14, PRICE_CLOSE);
还有一个问题:每次OnTick()调用都会重新创建指标handle,这会严重拖慢EA速度。正确做法是把handle的创建放到OnInit()里,只创建一次。
int handleFast, handleSlow, handleRSI;
int OnInit()
{
handleFast = iMA(_Symbol, PERIOD_H1, 20, 0, MODE_EMA, PRICE_CLOSE);
handleSlow = iMA(_Symbol, PERIOD_H1, 50, 0, MODE_EMA, PRICE_CLOSE);
handleRSI = iRSI(_Symbol, PERIOD_H1, 14, PRICE_CLOSE);
if(handleFast == INVALID_HANDLE || handleSlow == INVALID_HANDLE || handleRSI == INVALID_HANDLE)
{
Print("指标创建失败!");
return INIT_FAILED;
}
return INIT_SUCCEEDED;
}
这就是为什么你不能完全信任AI生成的代码。它给你省了80%的时间,但剩下的20%需要你自己检查。
怎么写出更好的提示?
给AI的提示越具体,出来的代码越能用。几个关键点:
明确说MQL5。 不要只说"帮我写个EA"。AI可能默认用MQL4语法。每次都说清楚"使用MQL5语法"。
指定具体参数。 不要说"用均线",要说"20周期EMA,应用于收盘价,H1时间框架"。不要说"设个止损",要说"固定止损50个点,用CTrade类的PositionModify()方法设置"。
指定下单方式。 MQL5下单要用CTrade类还是直接用OrderSend()填MqlTradeRequest结构体?两种都能用,但代码完全不同。建议指定用CTrade类,代码更简洁也更不容易出错。
说明错误处理方式。 告诉AI"下单失败时打印错误代码和错误描述,并在10秒后重试一次"。不加这个要求,AI通常会忽略错误处理,而实盘中下单失败是家常便饭。
给出完整的上下文。 如果你让AI写移动止损函数,把你已有的全局变量列表、CTrade对象的名字、持仓判断方式一起告诉它。上下文越完整,代码越容易和你已有的部分衔接。
AI写MQL5代码常犯的错误
这些坑你几乎一定会遇到,提前知道能省很多时间。
用了MQL4的函数
最高频的错误。AI经常写出OrderSend()、OrderClose()、OrderModify()这些MQL4函数。MQL5里不能这样用。MQL5的下单要用CTrade类或者直接构造MqlTradeRequest结构体。如果你看到代码里有OrderSend(Symbol(), OP_BUY, ...)这种写法,那百分之百是MQL4的。
MQL4里的OP_BUY、OP_SELL在MQL5里对应的是ORDER_TYPE_BUY和ORDER_TYPE_SELL。很多AI会搞混。
没有处理错误
AI生成的代码经常是"理想路径"——假设每一步都成功。现实中,CopyBuffer()可能返回的数据不够、下单可能被经纪商拒绝、持仓可能在你检查到执行之间被止损平掉。每一个关键操作后面都应该检查返回值。
// 错误的写法
CopyBuffer(handleFast, 0, 0, 2, fastMA);
// 正确的写法
if(CopyBuffer(handleFast, 0, 0, 2, fastMA) < 2)
{
Print("获取均线数据失败");
return;
}
ArraySetAsSeries()的遗漏
CopyBuffer()拿到的数组默认是时间正序排列的——索引0是最老的数据。你通常需要索引0是最新的数据。忘了调用ArraySetAsSeries()设为倒序,交叉判断的方向就会完全反过来。这个错误特别阴险,因为代码能编译通过,EA也会交易,但方向是反的。
每个tick都创建指标handle
上面已经说过了。iMA()、iRSI()这些函数应该在OnInit()里调用一次,把返回的handle存在全局变量里。在OnTick()里只调用CopyBuffer()获取最新数据。
没有控制交易频率
AI生成的EA经常在每个tick都检查信号并下单。如果信号条件持续满足(比如均线交叉后好几根K线都是金叉状态),EA会不停地开仓。你需要加一个标记变量,记录当前K线是否已经发过信号,或者检查是否已有持仓。
怎么用AI把MQL4代码转到MQL5?
如果你手头有一个MQL4写的EA,想迁移到MT5,AI能帮不少忙。但不要指望一次性转换完美。
推荐的做法是分块转换。把MQL4代码按功能拆成几段,每次给AI一段,并附上说明:
这是一段MQL4代码,功能是检测MACD柱状图方向并下单。请转换成MQL5代码。注意以下变化:
- OrderSend()改用CTrade类
- OP_BUY改为ORDER_TYPE_BUY
- iMACD()改为创建handle再用CopyBuffer()
- 删除RefreshRates()调用(MQL5里不需要)
- MarketInfo()改用SymbolInfoDouble()
把已知的差异列给AI,比让AI自己去猜效果好得多。
MQL4到MQL5转换中最大的变化是订单系统。MQL4用OrderSend()直接发单,MQL5用的是交易请求结构体。MQL4的OrderSelect()遍历订单用序号,MQL5要区分"持仓"(Positions)和"挂单"(Orders),遍历方式完全不同。这部分逻辑比较复杂,建议让AI先给你解释MQL5的持仓管理体系,理解了概念再转换代码。
什么时候该找人类程序员?
AI不是万能的。这几种情况下,花钱请一个有经验的MQL5程序员更划算:
策略逻辑非常复杂。 比如多品种对冲、多时间框架联动、需要读取外部数据源或者自定义指标嵌套。AI处理简单到中等复杂度的策略没问题,但超过四五个模块联动的复杂系统,AI生成的代码整合起来bug会很多。
需要DLL调用或网络通信。 EA需要调用外部DLL、通过WebRequest发送信号到Telegram、或者和数据库交互,这些功能的坑比较多,AI经常在权限设置和内存管理上出错。
你完全看不懂代码。 如果AI生成的代码你一行都读不懂,改不了,测试发现问题也不知道怎么修,那AI对你来说就不是工具,是黑箱。黑箱EA上实盘是很危险的。这种情况要么花时间学基础的MQL5知识,要么直接找程序员定制。
性能要求很高。 高频剥头皮EA对执行速度要求极高。AI生成的代码通常不会做性能优化,可能有冗余的循环和不必要的指标重算。毫秒级别的延迟差异在剥头皮策略里能决定盈亏。
找MQL5程序员的渠道,MQL5官方社区的Freelance板块是最靠谱的。上面有评分和历史项目展示,价格从50美元到2000美元不等,取决于策略复杂度。
常见问题
AI生成的EA可以直接上实盘吗?
绝对不行。AI生成的代码必须经过三个步骤:编译检查、策略测试器回测、模拟盘运行至少2-4周。回测结果不理想就打回去修改。模拟盘没问题了再上最小手数的实盘验证。跳过任何一步都是拿真金白银赌运气。
ChatGPT和Claude哪个写MQL5更好?
各有所长。ChatGPT在代码生成量和速度上有优势,Claude在代码逻辑的准确性和上下文理解上表现更稳定。实际用下来,两个都会犯MQL4/MQL5混用的错误。建议两个都试试,对比输出结果,取各自的长处。不要只依赖一个。
不会编程,完全看不懂代码怎么办?
至少学一点MQL5的基础知识。你不需要从零写EA,但你需要能读懂变量声明、if判断、for循环和函数调用。推荐看MQL5官方文档的入门教程,大概花一个周末就能掌握基本的读代码能力。这个投入非常值得——它决定了你是在"使用工具"还是在"盲目信任"。
AI能帮我优化EA参数吗?
能给建议,但不能替代真正的参数优化。你可以问AI"RSI周期设14好还是21好",它会给你一些通用的分析。但真正有效的参数优化必须在MT5策略测试器里用遗传算法跑。AI不知道你交易的品种特性、你的经纪商点差和你的资金规模,这些都影响最优参数的选择。
用AI写的EA有版权问题吗?
目前法律上还没有明确的定论。主流观点是,AI辅助生成的代码,版权归使用者(也就是你)。但如果你的提示里包含了别人EA的代码片段让AI改写,可能涉及原始代码的版权。用AI从零生成的代码,通常不会有版权争议。
AI不会把你变成MQL5专家,但它能把"完全不会写代码"到"有一个能跑的EA初版"的时间从几周压缩到几天。关键是你得知道怎么拆解策略、怎么写清楚提示、怎么检查代码。工具再好,判断力还是你自己的。如果你正在探索EA自动交易的更多可能性,FXTool外汇工具库整理了不少实用资源,值得翻一翻。