


指标文件下载连接:
链接: https://pan.baidu.com/s/1fXvx3dsVsCe1ZZaUuvHwTw?pwd=wy3x 提取码: wy3x 复制这段内容后打开百度网盘手机App,操作更方便哦
//+------------------------------------------------------------------+
//| TrendMasterPro.mq4 |
//| Copyright 2025, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, TrendMasterPro"
#property link "https://www.yourdomain.com"
#property version "1.00"
#property strict
#property indicator_chart_window // 在主图显示
#property indicator_buffers 4 // 使用4个缓冲区
#property indicator_plots 2 // 显示2个图形序列
//+------------------------------------------------------------------+
//| 输入参数配置(用户可自定义) |
//+------------------------------------------------------------------+
input int MAPeriod = 20; // 移动平均线周期
input ENUM_MA_METHOD MAMethod = MODE_EMA; // 均线类型:指数移动平均
input int MACDFast = 12; // MACD快线周期
input int MACDSlow = 26; // MACD慢线周期
input int MACDSignal = 9; // MACD信号线周期
input double ATRMultiplier = 2.0; // ATR波动通道乘数
input int ATRPeriod = 14; // ATR波动率周期
//+------------------------------------------------------------------+
//| 指标缓冲区声明 |
//+------------------------------------------------------------------+
double TrendBuffer[]; // 趋势方向缓冲区(1=涨势,-1=跌势)
double SignalBuffer[]; // 交易信号缓冲区(1=买入,-1=卖出)
double UpperBand[]; // 波动通道上轨
double LowerBand[]; // 波动通道下轨
//+------------------------------------------------------------------+
//| 全局变量 |
//+------------------------------------------------------------------+
int handleMA, handleMACD, handleATR; // 指标句柄
color uptrendColor = clrLimeGreen; // 上升趋势颜色
color downtrendColor = clrCrimson; // 下降趋势颜色
//+------------------------------------------------------------------+
//| 自定义初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- 设置缓冲区属性
SetIndexBuffer(0, TrendBuffer);
SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 3, uptrendColor);
SetIndexLabel(0, "Trend Direction");
SetIndexBuffer(1, SignalBuffer);
SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 2);
SetIndexArrow(1, 233); // 向上箭头
SetIndexArrow(1, 234); // 向下箭头
SetIndexLabel(1, "Trading Signal");
SetIndexBuffer(2, UpperBand);
SetIndexStyle(2, DRAW_LINE, STYLE_DOT, 1, clrDodgerBlue);
SetIndexLabel(2, "Volatility Upper");
SetIndexBuffer(3, LowerBand);
SetIndexStyle(3, DRAW_LINE, STYLE_DOT, 1, clrDodgerBlue);
SetIndexLabel(3, "Volatility Lower");
//--- 创建技术指标句柄
handleMA = iMA(NULL, 0, MAPeriod, 0, MAMethod, PRICE_CLOSE);
handleMACD = iMACD(NULL, 0, MACDFast, MACDSlow, MACDSignal, PRICE_CLOSE);
handleATR = iATR(NULL, 0, ATRPeriod);
//--- 检查指标句柄是否有效
if(handleMA == INVALID_HANDLE || handleMACD == INVALID_HANDLE || handleATR == INVALID_HANDLE)
{
Print("指标初始化失败! 错误代码: ", GetLastError());
return(INIT_FAILED);
}
//--- 设置指标短名称
IndicatorShortName("TrendMasterPro(" + string(MAPeriod) + ")");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 自定义反初始化函数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- 释放指标句柄
if(handleMA != INVALID_HANDLE) IndicatorRelease(handleMA);
if(handleMACD != INVALID_HANDLE) IndicatorRelease(handleMACD);
if(handleATR != INVALID_HANDLE) IndicatorRelease(handleATR);
}
//+------------------------------------------------------------------+
//| 主计算函数 |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- 防止数组越界
if(rates_total < MathMax(MAPeriod, MathMax(MACDSlow, ATRPeriod))
return(0);
//--- 设置数组为时间序列
ArraySetAsSeries(TrendBuffer, true);
ArraySetAsSeries(SignalBuffer, true);
ArraySetAsSeries(UpperBand, true);
ArraySetAsSeries(LowerBand, true);
//--- 获取指标数据
double maBuffer[], macdBuffer[], signalBuffer[], atrBuffer[];
CopyBuffer(handleMA, 0, 0, rates_total, maBuffer);
CopyBuffer(handleMACD, 0, 0, rates_total, macdBuffer); // MACD主线
CopyBuffer(handleMACD, 1, 0, rates_total, signalBuffer); // MACD信号线
CopyBuffer(handleATR, 0, 0, rates_total, atrBuffer);
//--- 计算起点(避免重复计算)
int start;
if(prev_calculated == 0)
{
// 第一次计算全部数据
start = MathMax(MAPeriod, MathMax(MACDSlow, ATRPeriod));
ArrayInitialize(TrendBuffer, 0.0);
ArrayInitialize(SignalBuffer, 0.0);
}
else start = prev_calculated - 1;
//--- 主循环处理每个K线
for(int i = start; i < rates_total && !IsStopped(); i++)
{
// 1. 计算趋势方向(三因子确认)
bool trendUp = true;
bool trendDown = true;
// 因子1:价格在MA上方
if(close[i] < maBuffer[i]) trendUp = false;
if(close[i] > maBuffer[i]) trendDown = false;
// 因子2:MACD金叉/死叉
if(macdBuffer[i] < signalBuffer[i]) trendUp = false;
if(macdBuffer[i] > signalBuffer[i]) trendDown = false;
// 因子3:波动率过滤(ATR通道)
double midBand = (high[i] + low[i]) / 2;
UpperBand[i] = midBand + ATRMultiplier * atrBuffer[i];
LowerBand[i] = midBand - ATRMultiplier * atrBuffer[i];
if(close[i] < UpperBand[i-1]) trendUp = false;
if(close[i] > LowerBand[i-1]) trendDown = false;
// 设置趋势方向(1=上涨,-1=下跌,0=震荡)
if(trendUp) TrendBuffer[i] = 1;
else if(trendDown) TrendBuffer[i] = -1;
else TrendBuffer[i] = 0;
// 2. 生成交易信号(突破波动通道)
if(TrendBuffer[i] == 1 && close[i] > UpperBand[i-1] && TrendBuffer[i-1] <= 0)
{
SignalBuffer[i] = 1; // 买入信号
// 发送警报(实际交易中可启用)
// if(i == rates_total-1) Alert("BUY Signal on ", Symbol());
}
else if(TrendBuffer[i] == -1 && close[i] < LowerBand[i-1] && TrendBuffer[i-1] >= 0)
{
SignalBuffer[i] = -1; // 卖出信号
// if(i == rates_total-1) Alert("SELL Signal on ", Symbol());
}
else SignalBuffer[i] = 0;
// 3. 动态颜色调整
if(TrendBuffer[i] > 0)
SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 3, uptrendColor);
else if(TrendBuffer[i] < 0)
SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 3, downtrendColor);
}
return(rates_total);
}
//+------------------------------------------------------------------+