|
|
本帖最后由 duckwolf 于 2026-3-29 18:05 编辑
基于 MT5 平台的趋势跟踪交易策略程序(EA)
发布日期:2026-03-29 | 作者:MT5 交易员
════════════════════════════
策略概述
════════════════════════════
本 EA 基于 MT5STP API 开发,结合移动平均线(MA)、平均方向性运动指标(ADX)及风险控制逻辑,适用于国内股票/期货量化交易。
核心功能:
✅ 趋势判断
✅ 信号生成
✅ 自动下单
✅ 止损止盈
✅ 仓位管理
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
════════════════════════════
策略逻辑说明
════════════════════════════
1. 趋势判断
使用 8 周期简单移动平均线(MA8) 判断价格趋势:
• 价格在 MA8 上方 → 多头趋势
• 价格在 MA8 下方 → 空头趋势
2. 趋势强度过滤
使用 8 周期 ADX 指标(平均方向性运动)确保仅在趋势明显时交易:
• ADX > 22 → 趋势明显,可交易
• ADX ≤ 22 → 趋势不明,观望
3. 交易信号
| 信号类型 | 触发条件 | | 买入 | MA8 向上拐头 + 价格收在 MA8 上方 + ADX>22 | | 卖出 | MA8 向下拐头 + 价格收在 MA8 下方 + ADX>22 |
4. 风险控制
• 固定止损: 30 点
• 固定止盈: 100 点(盈亏比 1:3.3)
• 单品种仓位限制: 10%
• 防重复开仓: 避免同方向重复建仓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
════════════════════════════
完整代码(MQL5 EA 程序)
════════════════════════════
[code=mql5]//+------------------------------------------------------------------+
//| TrendEA.mq5
//| Copyright 2026, MetaQuotes Software Corp.
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, Quant Strategy Demo"
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
// 输入参数(用户可配置)
input int MA_Period = 8; // MA 周期
input int ADX_Period = 8; // ADX 周期
input double StopLoss_Points = 30; // 止损点数
input double TakeProfit_Points = 100; // 止盈点数
input double MaxPositionRatio = 0.1; // 单品种最大仓位比例(10%)
input int MagicNumber = 55555; // 订单魔术码
// 指标句柄
int ma_handle; // MA 指标句柄
int adx_handle; // ADX 指标句柄
// 交易类(MT5STP API)
#include <Trade/Trade.mqh>
CTrade trade; // 实例化交易类
//+------------------------------------------------------------------+
//| 初始化函数:EA 加载时执行
//+------------------------------------------------------------------+
int OnInit()
{
// 设置交易类参数
trade.LogLevel(LOG_LEVEL_ALL); // 输出所有日志
trade.SetAsyncMode(true); // 异步报单
// 获取指标句柄
ma_handle = iMA(_Symbol, _Period, MA_Period, 0, MODE_SMA, PRICE_CLOSE);
adx_handle = iADX(_Symbol, _Period, ADX_Period);
// 检查指标句柄有效性
if(ma_handle == INVALID_HANDLE || adx_handle == INVALID_HANDLE)
{
Print("指标初始化失败!错误码:", GetLastError());
return(INIT_FAILED);
}
Print("EA 初始化成功!MA 周期=", MA_Period, ",ADX 周期=", ADX_Period);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 反初始化函数:EA 卸载时执行
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(ma_handle != INVALID_HANDLE) IndicatorRelease(ma_handle);
if(adx_handle != INVALID_HANDLE) IndicatorRelease(adx_handle);
Print("EA 已卸载,原因:", reason);
}
//+------------------------------------------------------------------+
//| 主逻辑函数:每 tick 执行
//+------------------------------------------------------------------+
void OnTick()
{
// 1. 检查新 K 线
static datetime last_bar_time = 0;
datetime current_bar_time = iTime(_Symbol, _Period, 0);
if(last_bar_time == current_bar_time) return;
last_bar_time = current_bar_time;
// 2. 获取指标数据
double ma_value[2], adx_value[1];
CopyBuffer(ma_handle, 0, 0, 2, ma_value);
CopyBuffer(adx_handle, 0, 0, 1, adx_value);
double current_price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
// 3. 检查数据有效性
if(ma_value[0] == 0 || ma_value[1] == 0 || adx_value[0] == 0)
{
Print("指标数据获取失败!");
return;
}
// 4. 判断趋势方向与强度
bool is_long_trend = (current_price > ma_value[0]) && (ma_value[0] > ma_value[1]);
bool is_short_trend = (current_price < ma_value[0]) && (ma_value[0] < ma_value[1]);
bool is_strong_trend = (adx_value[0] > 22);
// 5. 检查当前持仓
bool has_long_position = false, has_short_position = false;
for(int i=0; i<PositionsTotal(); i++)
{
ulong ticket = PositionGetTicket(i);
if(PositionSelectByTicket(ticket) && PositionGetInteger(POSITION_MAGIC) == MagicNumber)
{
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) has_long_position = true;
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) has_short_position = true;
}
}
// 6. 执行交易逻辑
// 6.1 买入信号
if(is_long_trend && is_strong_trend && !has_long_position)
{
double lot_size = CalculateLotSize();
if(lot_size > 0)
{
trade.Buy(lot_size, _Symbol, 0, current_price - StopLoss_Points*_Point,
current_price + TakeProfit_Points*_Point, "TrendEA_Buy");
Print("买入信号:价格=", current_price, ",仓位=", lot_size);
}
}
// 6.2 卖出信号
if(is_short_trend && is_strong_trend && !has_short_position)
{
double lot_size = CalculateLotSize();
if(lot_size > 0)
{
trade.Sell(lot_size, _Symbol, 0, current_price + StopLoss_Points*_Point,
current_price - TakeProfit_Points*_Point, "TrendEA_Sell");
Print("卖出信号:价格=", current_price, ",仓位=", lot_size);
}
}
}
//+------------------------------------------------------------------+
//| 计算仓位大小
//+------------------------------------------------------------------+
double CalculateLotSize()
{
double account_balance = AccountInfoDouble(ACCOUNT_BALANCE);
double risk_amount = account_balance * MaxPositionRatio;
double lot_step = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
double min_lot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double max_lot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double lot = NormalizeDouble(risk_amount / 100000, 2);
lot = MathMax(lot, min_lot);
lot = MathMin(lot, max_lot);
lot = NormalizeDouble(lot / lot_step, 0) * lot_step;
return(lot);
}
//+------------------------------------------------------------------+
//| 错误处理
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
const MqlTradeRequest& request,
const MqlTradeResult& result)
{
if(result.retcode != TRADE_RETCODE_DONE)
Print("交易失败:", result.comment, ",错误码:", result.retcode);
}
//+------------------------------------------------------------------+[/code]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
════════════════════════════
代码核心模块说明
════════════════════════════
1. 初始化与指标加载
• 使用 iMA 和 iADX 获取移动平均线和 ADX 指标句柄
• 交易类 CTrade 配置异步报单和日志级别
2. 趋势判断逻辑
• MA 方向: 比较当前与前一根 K 线的 MA 值
• 价格位置: 当前价格与 MA 值的相对位置
• 趋势强度: ADX 值>22
3. 交易执行与风险控制
• 仓位计算: CalculateLotSize 基于账户资金的 10%
• 止损止盈: 30 点止损、100 点止盈(盈亏比 1:3.3)
• 防重复开仓: 遍历持仓检查同魔术码的持仓
4. MT5STP API 适配
• 使用 CTrade::Buy/Sell 方法
• 底层调用 PositionOpen 实现异步报单
• 兼容 MT5STP 扩展的命名空间与枚举
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
════════════════════════════
使用说明
════════════════════════════
1️⃣ 加载 EA: 将代码保存为 TrendEA.mq5,在 MT5"导航器"中编译后拖拽至目标图表
2️⃣ 参数配置: 在 EA 属性面板调整:
• MA_Period(默认 8)
• ADX_Period(默认 8)
• StopLoss_Points(默认 30 点)
• TakeProfit_Points(默认 100 点)
• MaxPositionRatio(默认 10%)
3️⃣ 实盘/模拟: 连接 MT5 交易账户,通过"策略测试器"回测后实盘
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
════════════════════════════
注意事项
════════════════════════════
⚠️ 数据质量: 确保 MT5 已加载品种的完整历史数据
⚠️ 合规性: 国内股票交易需遵守 T+1 规则,EA 中可加入"当日平仓限制"
⚠️ 优化建议: 结合移动止损功能,动态跟踪止损位
⚠️ 风险提示: 本策略仅供学习参考,实盘需谨慎测试
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
════════════════════════════
总结
════════════════════════════
该程序严格遵循 MT5STP API 规范 和 风险控制逻辑,可直接作为国内股票/期货量化交易的起点策略。
策略特点:
✅ 逻辑简单清晰,易于理解
✅ 趋势过滤,避免震荡亏损
✅ 严格风控,固定止损止盈
✅ 仓位管理,避免过度暴露
欢迎交流讨论,共同优化策略!
#MT5 #量化交易 #趋势跟踪 #EA 策略 #MQL5 #MA #ADX
|
|