2评论

0收藏

请高手帮忙改写一个MT4指标xSuperTrend candles (mtf)为MT5适用

avatar 小飞鱼20123 | 161 人阅读 | 2 人评论 | 2025-01-05

    我不懂MT5编程,想请各位高手帮忙改写一个指标, 我用CHATGPT4改写过,最终有一个错误解决不了。今天用国产AI,deepseek改写,也是没有解决。论坛中高手如云,或许可以帮忙看看。

    错误如下:'ATR'-wrong parameters count
   是这一句出了问题:double atr = iATR(Symbol(), actualTimeFrame, period, i);  // 修复 iATR 参数
   先谢过热心的兄弟们,附上源码:



#property copyright "外汇EA之家,免费下载EA、指标"
#property link      "http://www.eazhijia.com"

#property indicator_separate_window
#property indicator_buffers 9
#property indicator_color1  LimeGreen  //clrBlue
#property indicator_color2  clrRed
#property indicator_color3  LimeGreen  //clrBlue
#property indicator_color4  clrRed
#property strict

//
//
//
//
//

input ENUM_TIMEFRAMES TimeFrame    = PERIOD_CURRENT;    // Time frame
input int              period       = 10;                // Super trend period
input double           multiplier   = 1.7;               // Super trend multiplier原周期为3.0
input int              WickWidth    = 1;                 // Candle wick width
input int              BodyWidth    = 2;                 // If auto width = false then use this
input bool             UseAutoWidth = true;              // Auto adjust candle body width

double valhu[], valhd[], valhbu[], valhbd[], Up[], Dn[], valc[], Trend[], count[];
string indicatorFileName;
int candlewidth = 0;

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//

int OnInit()
{
   if (UseAutoWidth)
   {
      int scale = (int)ChartGetInteger(0, CHART_SCALE);
      switch (scale)
      {
      case 0: candlewidth = 1; break;
      case 1: candlewidth = 1; break;
      case 2: candlewidth = 2; break;
      case 3: candlewidth = 3; break;
      case 4: candlewidth = 6; break;
      case 5: candlewidth = 14; break;
      }
   }
   else { candlewidth = BodyWidth; }

   IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
   //IndicatorBuffers(9);

   SetIndexBuffer(0, valhu, INDICATOR_DATA);  
   PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_HISTOGRAM);  
   PlotIndexSetInteger(0, PLOT_LINE_WIDTH, WickWidth);

   SetIndexBuffer(1, valhd, INDICATOR_DATA);  
   PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_HISTOGRAM);  
   PlotIndexSetInteger(1, PLOT_LINE_WIDTH, WickWidth);

   SetIndexBuffer(2, valhbu, INDICATOR_DATA);
   PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_HISTOGRAM);  
   PlotIndexSetInteger(2, PLOT_LINE_WIDTH, candlewidth);

   SetIndexBuffer(3, valhbd, INDICATOR_DATA);
   PlotIndexSetInteger(3, PLOT_DRAW_TYPE, DRAW_HISTOGRAM);  
   PlotIndexSetInteger(3, PLOT_LINE_WIDTH, candlewidth);

   SetIndexBuffer(4, Trend, INDICATOR_CALCULATIONS);
   SetIndexBuffer(5, Up, INDICATOR_CALCULATIONS);
   SetIndexBuffer(6, Dn, INDICATOR_CALCULATIONS);
   SetIndexBuffer(7, valc, INDICATOR_CALCULATIONS);
   SetIndexBuffer(8, count, INDICATOR_CALCULATIONS);

   indicatorFileName = __FILE__;
   return (INIT_SUCCEEDED);
}

void OnDeinit(const int reason) { }

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//

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 i, counted_bars = prev_calculated;
   if (counted_bars < 0) return (-1);
   if (counted_bars > 0) counted_bars--;
   int limit = rates_total - counted_bars;

   ENUM_TIMEFRAMES actualTimeFrame = TimeFrame;  // 使用临时变量
   if (actualTimeFrame < _Period) {
      actualTimeFrame = _Period;  // 如果需要调整时间框架
   }

   if (TimeFrame != _Period)
   {
      limit = (int)MathMax(limit, MathMin(rates_total - 1, rates_total * (int)TimeFrame / (int)_Period));
      for (i = limit; i >= 0 && !IsStopped(); i--)
      {
         int y = iBarShift(NULL, TimeFrame, time[i]);
         valc[i] = iCustom(NULL, TimeFrame, indicatorFileName, period, multiplier, WickWidth, BodyWidth, UseAutoWidth, 7, y);
         if (valc[i] == 1)
         {
            valhu[i] = high[i];
            valhd[i] = low[i];
            valhbu[i] = MathMax(open[i], close[i]);
            valhbd[i] = MathMin(open[i], close[i]);
         }
         if (valc[i] == -1)
         {
            valhu[i] = low[i];
            valhd[i] = high[i];
            valhbu[i] = MathMin(open[i], close[i]);
            valhbd[i] = MathMax(open[i], close[i]);
         }
      }
      return (rates_total);
   }

   //
   //
   //
   //
   //

   for (i = limit; i >= 0; i--)
   {
      double atr = iATR(Symbol(), actualTimeFrame, period, i);  // 修复 iATR 参数
      double cprice = close[i];
      double mprice = (high[i] + low[i]) / 2;
      Up[i] = mprice + multiplier * atr;
      Dn[i] = mprice - multiplier * atr;

      //
      //
      //
      //
      //

      valc[i] = (i < rates_total - 1) ? (cprice > Up[i + 1]) ? 1 : (cprice < Dn[i + 1]) ? -1 : valc[i + 1] : 0;
      if (valc[i] == 1) { Dn[i] = MathMax(Dn[i], Dn[i + 1]); Trend[i] = Dn[i]; }
      if (valc[i] == -1) { Up[i] = MathMin(Up[i], Up[i + 1]); Trend[i] = Up[i]; }
      if (valc[i] == 1)
      {
         valhu[i] = high[i];
         valhd[i] = low[i];
         valhbu[i] = MathMax(open[i], close[i]);
         valhbd[i] = MathMin(open[i], close[i]);
      }
      if (valc[i] == -1)
      {
         valhu[i] = low[i];
         valhd[i] = high[i];
         valhbu[i] = MathMin(open[i], close[i]);
         valhbd[i] = MathMax(open[i], close[i]);
      }
   }
   return (rates_total);
}

//-------------------------------------------------------------------
//
//-------------------------------------------------------------------
//
//
//
//
//

string sTfTable[] = { "M1","M5","M15","M30","H1","H4","D1","W1","MN" };
int iTfTable[] = { 1,5,15,30,60,240,1440,10080,43200 };

string timeFrameToString(int tf)
{
   for (int i = ArraySize(iTfTable) - 1; i >= 0; i--)
      if (tf == iTfTable[i]) return (sTfTable[i]);
   return ("");
}

""
还没有人打赏,支持一下

评论|共 2 个

conkers

发表于 2025-1-6 10:11:50 | 显示全部楼层

看看这个能不能用上 GBPUSDM30.png SuperTrend new format histo.mq5

小飞鱼20123

发表于 2025-1-6 10:55:07 | 显示全部楼层

我这个是主图K线变色的指标,因为用习惯了,想在MT5上也用它,不管怎么说,谢谢了
snap215.jpg

您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则