Индикатор на основе модулей торговых сигналов

 

Пытаюсь малой кровью написать более-менее универсальный индикатор на основе Стандартных Модулей Торговых сигналов (CSignal***). По большому счету для отображения на графике сигналов на покупку/продажу по выбранному индикатору на основе заложенных паттернов, чтобы самому их не высматривать.

При использовании Модулей сигналов в экспертах проблем нет, выдаются текущие сигналы и далее принимаются решения. Но вот в индикаторе нужны исторические данные. И вот тут не понимаю, как их задать через используемые классы.

//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalAC.mqh>

//--- indicator settings
#property indicator_applied_price PRICE_OPEN
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

//--- plot
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_width1  1
#property indicator_label1  "Test_Signal"

//--- inputs for main signal
input double             Signal_AC_Weight             =1.0;           // Accelerator Oscillator Weight [0...1.0]
//--- indicator buffers
double                    AC_Buffer[];

//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CSignalAC         m_signal_AC;
CSymbolInfo       m_info;
CiOpen            m_open;
CiHigh            m_high;
CiLow             m_low;
CiClose           m_close;
CIndicators       m_indicators;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,AC_Buffer,INDICATOR_DATA);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,20);
//--- name for DataWindow
   IndicatorSetString(INDICATOR_SHORTNAME,"Signal AC");
   PlotIndexSetString(0,PLOT_LABEL,"Signal AC");

//--- инициализация сигналов
m_info.Name(Symbol());
m_open.Create(Symbol(), Period());                      // Инициализация таймсерии цен открытия
m_high.Create(Symbol(), Period());                      // Инициализация таймсерии максимальных цен
m_low.Create(Symbol(), Period());                       // Инициализация таймсерии минимальных цен
m_close.Create(Symbol(), Period());                     // Инициализация таймсерии цен закрытия

m_signal_AC.Init(GetPointer(m_info), Period(), 10);   // Инициализация модуля сигналов торговым инструментом и тайфреймом
m_signal_AC.InitIndicators(GetPointer(m_indicators)); // Создание в модуле сигналов необходимых индикаторов на основе пустого списка индикаторов m_indicators

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    i,limit;
   
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
     }

      m_indicators.Refresh();
      m_signal_AC.SetDirection();  
     

//--- preliminary calculations
   limit=prev_calculated-1;
   if(limit<20)
      limit=20;

//--- the main loop of calculations
   for(i=limit;i<rates_total && !IsStopped();i++)
     {

      int power_sell = m_signal_AC.ShortCondition();
      int power_buy = m_signal_AC.LongCondition();
      AC_Buffer[i]=power_sell; //или AC_Buffer[i]=power_buy; для настройки не важно
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }


При таком расчете индикатор выдает постоянно один и тот же сигнал. Как его заставить считать по каждому бару?

Можно конечно использовать индикатор в чистом виде и прописать дополнительно паттерны, но не хочется этого делать, раз уже готовые модули имеются. Тем более заменяя классы индикаторов можно получить какую-то универсальность.

 

Так просто не получится. Надо свой дочерний класс писать, и в нем метод StartIndex().

Сейчас он такой:

StartIndex(void) { return((m_every_tick?0:1)); }

 А надо свою переменную возвращать. Соответственно нужно написать еще один метод для установки значений этой переменной. Тогда может получится, но я не пробовал.

 

Спасибо за подсказку, потренируюсь в этом направлении.. Как-то не полюбил я ООП за долгое время, функциональное программирование по моему более очевидно. 

Может еще кто какие идеи подскажет?

Причина обращения: