© 本贴为 yiyupapa 原创/首发,严禁抄袭!
//+------------------------------------------------------------------+ //| SuperTrend.mq5| //| Copyright 2023, MetaQuotes Software Corp. | //| Developed by yiyupapa | //+------------------------------------------------------------------+ #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 Lime // 上升趋势颜色 #property indicator_color2 Red // 下降趋势颜色 #property indicator_width1 2 #property indicator_width2 2 #property indicator_label1 "Supertrend Up" #property indicator_label2 "Supertrend Down"
// 输入参数 input int ATRPeriod = 10; // ATR 计算周期 input double Multiplier = 3.0; // ATR 乘数
// 指标缓冲区 double ST_Up[], ST_Down[]; double ATR[];
//+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { // 指定缓冲区 SetIndexBuffer(0, ST_Up, INDICATOR_DATA); SetIndexBuffer(1, ST_Down, INDICATOR_DATA);
IndicatorShortName("Supertrend ("+IntegerToString(ATRPeriod)+","+DoubleToString(Multiplier,1)+")");
return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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[]) { int start = MathMax(ATRPeriod, prev_calculated);
// 计算 ATR for (int i = start; i < rates_total; i++) { ATR = iATR(NULL, 0, ATRPeriod, i); }
// 计算 Supertrend for (int i = start; i < rates_total; i++) { double HL2 = (high + low) / 2.0; // 价格的中值 double UpperLevel = HL2 + Multiplier * ATR; double LowerLevel = HL2 - Multiplier * ATR;
if (close[i - 1] > ST_Up[i - 1]) { ST_Up = UpperLevel; ST_Down = EMPTY_VALUE; // 不绘制 } else if (close[i - 1] < ST_Down[i - 1]) { ST_Down = LowerLevel; ST_Up = EMPTY_VALUE; // 不绘制 } else { ST_Up = ST_Up[i - 1]; ST_Down = ST_Down[i - 1]; } } return (rates_total); } //+------------------------------------------------------------------+ |