Помощь с индикатором.

 

Индикатор представляет собой комбинированную торговую систему, которая генерирует сигналы на основе нескольких технических индикаторов.
Вот краткое описание его работы:

Основные компоненты:

  1. RSI (Relative Strength Index) - используется для определения перекупленности (OverBought) и перепроданности (OverSold)

  2. MACD - применяется для подтверждения сигналов (быстрая и медленная скользящие средние + сигнальная линия)

  3. Фильтры объема - проверяет, превышает ли текущий объем средний за период

  4. ATR (Average True Range) - фильтр волатильности

  5. Локальные экстремумы - ищет минимумы/максимумы RSI в заданном диапазоне

Генерация сигналов:

Сигналы на покупку (голубые стрелки вниз):

  • RSI пересекает уровень перепроданности (30) снизу вверх

  • Объем выше среднего на 20%

  • ATR выше своего среднего

  • RSI находится в локальном минимуме

Сигналы на продажу (оранжевые стрелки вверх):

  • RSI пересекает уровень перекупленности (70) сверху вниз

  • Объем выше среднего на 20%

  • ATR выше своего среднего

  • RSI находится в локальном максимуме

Подтверждающие сигналы:

  • Зеленые стрелки (подтверждение покупки): когда после сигнала на покупку MACD пересекает сигнальную линию снизу вверх

  • Красные стрелки (подтверждение продажи): когда после сигнала на продажу MACD пересекает сигнальную линию сверху вниз

Индикатор не отображает сигналы на текущем баре, если до закрытия бара осталось меньше 30 секунд (настраиваемый параметр).

Система сочетает несколько фильтров для уменьшения ложных сигналов и требует подтверждения от MACD для усиления надежности сигналов.

Проблема состоит в том что не могу решить проблему:
1. В тестер стратегий не отображает корректно сигналы (их нету, появляются когда накладываешь повторно индикатор на график).
2. Не обновляет все буферы в реальном времени.
GPT чаты не помогли в итоге исправить все проблемы(. Ищу знатоков которые помогут решить мою проблему.

 
Exillkos:
Проблема состоит в том что не могу решить проблему:

Нужно видеть код

Знатоков тут много
 
lynxntech #:

Нужно видеть код

#property strict
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 clrAqua
#property indicator_color2 clrOrange
#property indicator_color3 clrLime
#property indicator_color4 clrRed

input int RSIPeriod = 14;
input double OverBought = 70.0;
input double OverSold = 30.0;
input int SecondsBeforeClose = 30;
input int FastMAPeriod = 12;
input int SlowMAPeriod = 26;
input int SignalPeriod = 9;
input int ExtremaRange = 5;
input int VolumePeriod = 20;
input int ATRPeriod = 14;

double BuySignalBuffer[];
double SellSignalBuffer[];
double ConfirmBuyBuffer[];
double ConfirmSellBuffer[];

int minBarsRequired;

double rsiArray[];
double atrArray[];

int OnInit()
{
   IndicatorBuffers(4);
   SetIndexBuffer(0, BuySignalBuffer);
   SetIndexStyle(0, DRAW_ARROW, 0, 0, clrAqua);
   SetIndexArrow(0, 233);
   SetIndexLabel(0, "Buy Signal");

   SetIndexBuffer(1, SellSignalBuffer);
   SetIndexStyle(1, DRAW_ARROW, 0, 0, clrOrange);
   SetIndexArrow(1, 234);
   SetIndexLabel(1, "Sell Signal");

   SetIndexBuffer(2, ConfirmBuyBuffer);
   SetIndexStyle(2, DRAW_ARROW, 0, 0, clrLime);
   SetIndexArrow(2, 108);
   SetIndexLabel(2, "Confirm Buy");

   SetIndexBuffer(3, ConfirmSellBuffer);
   SetIndexStyle(3, DRAW_ARROW, 0, 0, clrRed);
   SetIndexArrow(3, 108);
   SetIndexLabel(3, "Confirm Sell");

   minBarsRequired = MathMax(MathMax(RSIPeriod + ExtremaRange, SlowMAPeriod + SignalPeriod), MathMax(ATRPeriod, VolumePeriod)) + 10;

   return(INIT_SUCCEEDED);
}

bool IsLocalExtremum(const double &array[], int index, int range, bool findMin)
{
   if(index < range || index >= ArraySize(array) - range)
      return false;

   double val = array[index];
   for(int i = index - range; i <= index + range; i++)
   {
      if(i == index) continue;
      if(i < 0 || i >= ArraySize(array)) continue;
      if((findMin && array[i] <= val) || (!findMin && array[i] >= val))
         return false;
   }
   return true;
}

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 < minBarsRequired)
      return 0;

   ArraySetAsSeries(BuySignalBuffer, true);
   ArraySetAsSeries(SellSignalBuffer, true);
   ArraySetAsSeries(ConfirmBuyBuffer, true);
   ArraySetAsSeries(ConfirmSellBuffer, true);
   ArraySetAsSeries(close, true);
   ArraySetAsSeries(high, true);
   ArraySetAsSeries(low, true);
   ArraySetAsSeries(time, true);

   int limit = (int)(rates_total - (prev_calculated == 0 ? minBarsRequired : prev_calculated));
   limit = MathMax(limit, 0);

   if(prev_calculated == 0)
   {
      ArrayInitialize(BuySignalBuffer, EMPTY_VALUE);
      ArrayInitialize(SellSignalBuffer, EMPTY_VALUE);
      ArrayInitialize(ConfirmBuyBuffer, EMPTY_VALUE);
      ArrayInitialize(ConfirmSellBuffer, EMPTY_VALUE);
   }

   datetime currentTime = TimeCurrent();
   datetime barCloseTime = time[0] + PeriodSeconds();
   bool showOnCurrentBar = (barCloseTime - currentTime) <= SecondsBeforeClose;

   ArrayResize(rsiArray, rates_total);
   ArraySetAsSeries(rsiArray, true);

   for(int i = 0; i < rates_total; i++)
      rsiArray[i] = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i);

   for(int i = limit; i >= 0; i--)
   {
      BuySignalBuffer[i] = EMPTY_VALUE;
      SellSignalBuffer[i] = EMPTY_VALUE;
      ConfirmBuyBuffer[i] = EMPTY_VALUE;
      ConfirmSellBuffer[i] = EMPTY_VALUE;

      if(i == 0 && !showOnCurrentBar) continue;

      double rsi = rsiArray[i];
      double rsiPrev = rsiArray[i+1];

      double volSum = 0;
      for(int j = 0; j < VolumePeriod && (i + j) < rates_total; j++)
         volSum += (double)tick_volume[i + j];
      double volSMA = volSum / (double)VolumePeriod;
      bool volumeFilter = (double)tick_volume[i] > volSMA * 1.2;

      double atr = iATR(NULL, 0, ATRPeriod, i);
      double atrSum = 0;
      for(int j = 0; j < ATRPeriod && (i + j) < rates_total; j++)
         atrSum += iATR(NULL, 0, ATRPeriod, i + j);
      double atrSMA = atrSum / (double)ATRPeriod;
      bool atrFilter = atr > atrSMA;

      bool isLocalMin = IsLocalExtremum(rsiArray, i, ExtremaRange, true);
      bool isLocalMax = IsLocalExtremum(rsiArray, i, ExtremaRange, false);

      if(rsi < OverSold && rsiPrev >= OverSold && volumeFilter && atrFilter && isLocalMin)
         BuySignalBuffer[i] = low[i] - 10 * _Point;

      if(rsi > OverBought && rsiPrev <= OverBought && volumeFilter && atrFilter && isLocalMax)
         SellSignalBuffer[i] = high[i] + 10 * _Point;

      if(i < rates_total - 1)
      {
         double macdMain = iMACD(NULL, 0, FastMAPeriod, SlowMAPeriod, SignalPeriod, PRICE_CLOSE, MODE_MAIN, i);
         double macdSignal = iMACD(NULL, 0, FastMAPeriod, SlowMAPeriod, SignalPeriod, PRICE_CLOSE, MODE_SIGNAL, i);
         double macdMainPrev = iMACD(NULL, 0, FastMAPeriod, SlowMAPeriod, SignalPeriod, PRICE_CLOSE, MODE_MAIN, i + 1);
         double macdSignalPrev = iMACD(NULL, 0, FastMAPeriod, SlowMAPeriod, SignalPeriod, PRICE_CLOSE, MODE_SIGNAL, i + 1);

         if(BuySignalBuffer[i + 1] != EMPTY_VALUE && macdMain > macdSignal && macdMainPrev <= macdSignalPrev)
            ConfirmBuyBuffer[i] = low[i] - 20 * _Point;

         if(SellSignalBuffer[i + 1] != EMPTY_VALUE && macdMain < macdSignal && macdMainPrev >= macdSignalPrev)
            ConfirmSellBuffer[i] = high[i] + 20 * _Point;
      }
   }

   return rates_total;
}
 
lynxntech #:

Нужно видеть код

Знатоков тут много
Я отправил код. но вот еще сам индикатор отправлю. 
Файлы:
Test3.mq4  12 kb
 
Тема больше не актуальна, можно удалять в архив. Проблему решил по индикатору и пришлось все перебрать.