DefiRWA

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 25|回复: 0

基于 MT5 平台的趋势跟踪交易策略程序(EA)

[复制链接]

301

主题

312

帖子

1083

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1083
发表于 2026-3-29 18:00:54 | 显示全部楼层 |阅读模式
本帖最后由 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. 初始化与指标加载
• 使用 iMAiADX 获取移动平均线和 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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|货物清仓|Archiver|手机版|小黑屋|倒数|舒尔特|好邻卡|RWA+DeFi|融资计划|内购渠道|MoltList|Web4

GMT+8, 2026-4-20 14:13 , Processed in 0.063647 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.