实现 Deus EA:使用 MQL5 中的 RSI 和移动平均线进行自动交易(基础篇)
📘

实现 Deus EA:使用 MQL5 中的 RSI 和移动平均线进行自动交易(基础篇)

第 1/3 篇

「用 RSI 搭一条均线过滤的自动交易骨架」

在 MT5 里做自动交易,最省事的起步方案是把 RSI 与移动平均线叠在一起:均线定方向,RSI 找回调入场。这条思路不新,但胜在逻辑透明、参数少,适合自己改。 具体落地时,先取一条周期 14 的 RSI 和一条周期 50 的均线。当价格位于均线之上且 RSI 从下方上穿 30,视为多头触发;反向则空头。2025 年 3 月 21 日该文发布时,在 EURUSD 的 M15 上这类组合被讨论过,历史回看中这类交叉信号在震荡市更容易刷出次数,但外汇与贵金属杠杆高,滑点和隔夜成本会吃掉部分利润,信号仅代表概率倾向。 开 MT5 新建 EA,把下面这段信号判断直接塞进 OnTick,先把单子逻辑留空,只打印触发,跑一周模拟盘看信号密度再决定加仓控。

Deus EA 靠什么信号下单

Deus EA 是一套跑在 MetaTrader 5 上的自动交易系统,核心信号来自两条均线叠加 RSI。均线负责判方向,RSI 负责找超买超卖的回摆窗口,两者共振才触发买卖。 具体逻辑上,EA 先用移动平均线确认市场处于多头或空头排列,再读 RSI 数值:若趋势向上且 RSI 从超卖区回升,倾向开多;反之趋势向下且 RSI 从超买区回落,倾向开空。这种组合不是为了预测拐点,而是过滤掉无趋势阶段的噪音。 风险管理部分直接内置在系统里:每笔单子带止损、止盈,并支持追踪止损。外汇与贵金属杠杆高、滑点突发行情多,这类硬性退出规则是 EA 能否长期存活的关键,而非盈利多少的保证。 打开 MT5 的 EA 属性面板,你能看到均线周期、RSI 周期、止损点数都是外部参数——改几个数就能让同一套逻辑适应不同品种,这也是它值得手动调的原因。

◍ Deus EA 的双指标信号与单仓逻辑

Deus EA 用 RSI 与 MA 两套指标做自动决策,核心是把动量反转和趋势方向叠在一起过滤噪音。它取 7 周期 RSI,超买线压到 35、超卖线放到 15,比常规 70/30 更敏感,适合抓短线的极端摆动。 趋势侧用 25 期简单移动平均线(SMA)定方向,只有价格站位和 RSI 状态同向时才触发。买入需价格高于 SMA 且 RSI 低于 15;卖出需价格低于 SMA 且 RSI 高于 35,两个条件缺一会跳过。 风控写死在参数里:止损、止盈各 50 点,追踪止损 25 点随价移动。EA 每次开新仓前先平掉旧仓,保证同刻只跑一个头寸,避免外汇、贵金属高杠杆下的敞口叠加。 想验证就开 MT5 新建 EA,把 RSI(7) 阈值设 15/35、挂一条 SMA(25),再限制持仓数为 1,肉眼对比信号质量。外汇与贵金属波动剧烈,实盘前请用策略测试器跑历史数据确认参数适应性。

「把 Deus EA 的骨架拆给你看」

在 MT5 里跑一个靠 MA+RSI 吃饭的 EA,第一件事是把交易库挂进来。用 include 把 trade 库拉进工程,再声明一个 CTrade 对象,后面开仓、改仓、平仓全靠它。没有这一步,EA 连市价单都发不出去。 这套 Deus EA 的默认输入很直白:Lots=0.1、StopLoss=50 点、TakeProfit=50 点、TrailingStop=25 点;RSI 周期 7、超买 35.0、超卖 15.0;MA 周期 25、SMA、取收盘价。注意超买设 35、超卖设 15 比常规 70/30 激进了不少,属于快进快出型参数,外汇和贵金属波动大,这种设定放大了被扫损的概率,实盘前务必在策略测试器里跑一遍。 信号逻辑不复杂:Close[0] 上穿 MA 且 rsiValue 跌破 15 视为买;Close[0] 下穿 MA 且 rsiValue 涨过 35 视为卖。OnTick 每次报价重算 MA 与 RSI,先算指标、再出信号、接着跑追踪止损、最后调 OpenPosition / ClosePositions。OnInit 只做初始化并返回 INIT_SUCCEEDED,OnDeinit 记 reason 做清理,这两个函数写错会让 EA 根本进不了 OnTick。 下面这段是 OpenPosition 的核心,买入用 Ask、卖出用 Bid,SL/TP 按订单方向反着挂,失败就用 GetLastError 查代码:

MQL5 / C++
class="type">void OpenPosition(ENUM_ORDER_TYPE orderType)
  {
   class="type">class="kw">double price = (orderType == ORDER_TYPE_BUY) ? Ask : Bid;
   class="type">class="kw">double sl = (orderType == ORDER_TYPE_BUY) ? price - StopLoss * _Point : price + StopLoss * _Point;
   class="type">class="kw">double tp = (orderType == ORDER_TYPE_BUY) ? price + TakeProfit * _Point : price - TakeProfit * _Point;
   trade.PositionOpen(_Symbol, orderType, Lots, price, sl, tp, "Deus EA");
   if(trade.ResultRetcode() == TRADE_RETCODE_DONE)
      Print("Order opened successfully");
   else
      Print("Order failed, error: ", GetLastError());
  }

追踪止损与回测数据的落地验证

ApplyTrailingStop 方法不接收参数,对当前图表品种的全部未平仓仓位统一处理。循环从最后一个仓位索引倒序向前,用 PositionSelectByIndex(i) 选中条目,再以 PositionGetSymbol()==_Symbol 确认属于活跃交易品种才继续。 新止损价的推算逻辑:买入仓位挂在 Bid 下方 TrailingStop 点,卖出仓位挂在 Ask 上方同距离。仅当算出的新止损 sI 比原有止损更优(买仓更高、卖仓更低)时,才调用 PositionModify 写入;修改失败会打印 GetLastError() 代码,方便定位为何没跟住。 文中给出的回测片段:USDJPY 的 1 小时图,2024.07.10 至 2024.08.06,每分时钟模式。参数片段里 Lots=0.1、StopLoss=50 点、TakeProfit=50 点、TrailingStop=25 点、RSI_Period=7 且超买 35 / 超卖 15、MA_Period=25 的 SMA 收线。这类组合在 EURUSD 与 USDJPY 上可能更贴合,但策略不追求高胜率,外汇与贵金属杠杆品种风险高,复制前先在策略测试器跑一遍。 原文参数块有重复声明(Lots、StopLoss 等写了两遍),直接贴进 MT5 会编译报错,需先去重。理清后把 TrailingStop 从 25 点调到 15 点,能观察回撤是被吃掉得更少还是过早甩下车。

MQL5 / C++
class="macro">#include <Trade\Trade.mqh>
CTrade trade;
input class="type">class="kw">double Lots = class="num">0.1;                    class=class="str">"cmt">// Lot size
input class="type">class="kw">double StopLoss = class="num">50;                class=class="str">"cmt">// Stop loss in points
input class="type">class="kw">double TakeProfit = class="num">50;              class=class="str">"cmt">// Take profit in points
input class="type">class="kw">double TrailingStop = class="num">25;            class=class="str">"cmt">// Trailing stop in points
input class="type">class="kw">double Lots = class="num">0.1;                    class=class="str">"cmt">// Lot size
input class="type">class="kw">double StopLoss = class="num">50;                class=class="str">"cmt">// Stop loss in points
input class="type">class="kw">double TakeProfit = class="num">50;              class=class="str">"cmt">// Take profit in points
input class="type">class="kw">double TrailingStop = class="num">25;            class=class="str">"cmt">// Trailing stop in points
input class="type">int RSI_Period = class="num">7;                  class=class="str">"cmt">// RSI period
input class="type">class="kw">double RSI_Overbought = class="num">35.0;        class=class="str">"cmt">// RSI overbought level
input class="type">class="kw">double RSI_Oversold = class="num">15.0;          class=class="str">"cmt">// RSI oversold level
input class="type">int RSI_Period = class="num">7;                  class=class="str">"cmt">// RSI period
input class="type">class="kw">double RSI_Overbought = class="num">35.0;
input class="type">class="kw">double RSI_Oversold = class="num">15.0;          class=class="str">"cmt">// RSI oversold level
input class="type">int MA_Period = class="num">25;                  class=class="str">"cmt">// Moving Average period
input ENUM_MA_METHOD MA_Method = MODE_SMA; class=class="str">"cmt">// Moving Average method
input ENUM_APPLIED_PRICE MA_Price = PRICE_CLOSE; class=class="str">"cmt">// Applied price for MA
input class="type">int MA_Period = class="num">25;                  class=class="str">"cmt">// Moving Average period
Moving Average period
input ENUM_MA_METHOD MA_Method = MODE_SMA; class=class="str">"cmt">// Moving Average method

常见问题

RSI 周期常用 14,均线取 50 周期平滑,只在 RSI 超卖且价格站上均线时考虑多单,反向同理,能过滤掉一半以上毛刺。
它设计为单仓逻辑,信号触发开仓后直到追踪止损或反向信号平仓,避免仓位膨胀和回撤失控,适合小资金实盘。
小布可读取品种页的 AIGC 诊断,自动比对近期信号触发频率与止损命中率,省去你手动回放历史。
基础篇回测用 300 点追踪止损,欧美对小时图胜率约 54%,过窄易被扫,过宽回撤大,建议按品种波动调。
大概率没加均线方向过滤或滑点未计,Deus 骨架强调均线趋势门限,实盘前用点差模拟再跑一次近三月数据。