指标文件下载连接: 

链接: 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);
}
//+------------------------------------------------------------------+

作者 admin

九稳量化交易系统 是一套高胜率策略趋势跟踪系统,系统最大优势就是开仓位置精确,信号不漂移 不延迟 同步行情信号 拒绝马后面!www.gao998.cn 微信 fxfx668998

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注