Как экономно перебрать периоды индикаторов в МТ5 и получить массивы значений? - страница 2

 

Рассчитывать индикатор в советнике и с теми же настройками сделать индикатор, который навешивать на график после теста, для визуализации.

iCustom с разным периодом это однозначно будут тормоза. Вообще где-то читал, что в мт5, индикатор будет рассчитываться всегда, даже, если копировать в буффер значения в советнике, после ряда срабатываний условных операторов.

 
forexman77:

Рассчитывать индикатор в советнике и с теми же настройками сделать индикатор, который навешивать на график после теста, для визуализации.

iCustom с разным периодом это однозначно будут тормоза. Вообще где-то читал, что в мт5, индикатор будет рассчитываться всегда, даже, если копировать в буффер значения в советнике, после ряда срабатываний условных операторов.


да там кругом попадалово в сотни строк кода

советник тики пропускает, индикатор вроде бы нет, но в тестере его хэндл нельзя удалить

 
Maxim Dmitrievsky:

да там кругом попадалово в сотни строк кода

советник тики пропускает, индикатор вроде бы нет, но в тестере его хэндл нельзя удалить

Вам же индикаторы все равно на ТФ, а не на тиках. Боевые советники, вызывая через iCustom индикатор, также пропускают тики.

 

А почему так? стандартный индикатор не создает больше i окон, а если вызывать кастомный то создается огромное кол-во и тестер начинает тормозить

каст. индикатор:

input int ReturnsPeriod   =15;

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Returns
#property indicator_label1  "Returns"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

//--- indicator buffers
double         ReturnsBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ReturnsBuffer,INDICATOR_DATA);
   IndicatorSetString(INDICATOR_SHORTNAME,"RETURNS PREDICTOR ("+_Symbol+"): ");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 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;
   if(prev_calculated<ReturnsPeriod+1) start=ReturnsPeriod;  // начнем заполнять ReturnsBuffer[]  с 1-го индекса 
   else start=prev_calculated-1;   // установим start равным последнему индексу в массивах
   for(int i=start;i<rates_total;i++) ReturnsBuffer[i]=MathLog(open[i]/open[i-ReturnsPeriod]);

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

Проверка в советнике:

int hnd;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   for(int i=5; i<20; i++)
    {
     hnd = iCustom(_Symbol,0,"ind",i);      //создает больше i окон
     //hnd = iRSI(_Symbol,0,i,PRICE_CLOSE); //не создает больше i окон
    }
  }
//+------------------------------------------------------------------+

Меня бы устроил случай со стандартным индикатором, когда создалось бы ограниченное число окон на каждый период, которые можно убрать.. но с кастомным так не получается

П.С. и стандартный показывает одинаковые значения так при разных периодах, хороче так работать не будет, можно создать просто много хэндлов и посмотреть будут ли тормоза. По идее если расчеты в индикаторах быстрые то не должно тормозить. Для проверки стратегии не хочется переписывать все индикаторы в классы

по 200 периодов для 3-х индикаторов, 600 хэндлов.. удачи мне :)

 
fxsaber:

Вам же индикаторы все равно на ТФ, а не на тиках. Боевые советники, вызывая через iCustom индикатор, также пропускают тики.


А будет ли разница если я создам n объектов классов или n хэндлов индикаторов.. вот в чем вопрос.. все равно и то и другое будет пересчитываться

 

Если индикатор так прост, можно в нем вычислить все значения, расположить их в одном буфере по порядку. Индикатор не для смотрения на него, а исключительно для советника.

 
Maxim Dmitrievsky:

А будет ли разница если я создам n объектов классов или n хэндлов индикаторов.. вот в чем вопрос.. все равно и то и другое будет пересчитываться

Разница принципиальная. В случае с классами все будет считаться в одной песочнице.

 
Dmitry Fedoseev:

Если индикатор так прост, можно в нем вычислить все значения, расположить их в одном буфере по порядку. Индикатор не для смотрения на него, а исключительно для советника.


а это мысль. А сколько там буферов в мт5 вообще создать можно, 64 вроде? а нет 512, это же все решает :)

3 индикатора с кучей буферов, в 1 буфер все пихать не удобно.. так вроде норм будет

а с другой стороны опять же нафиг это надо, когда можно создать кучу хэндлов, работы меньше а по скорости вычислений не понятно

 

Один хэндл, это как минимум один индикаторный буфер, а один буфер это массив с размером соответствующим количеству баров. Надо ориентироваться на доступный объем оперативной памяти, ее может не хватить.

 
Maxim Dmitrievsky:

Сразу создать много хэндлов или перебирать в цикле с присвоением хэндлу индикатора с разными параметрами, или есть другие способы?


Я пользуюсь СБ, в частности коллекцией индикаторов типа CIndicators. Очень удобно, особенно для "освежевания" данных. 

Там есть такой метод:

CIndicator *CIndicators::Create(const string symbol,const ENUM_TIMEFRAMES period,
                                const ENUM_INDICATOR type,const int count,const MqlParam &params[])

С его помощью создаётся любой индикатор.

Потом добавляем его в коллекцию.

И при необходимости получить новое значение любого индикатора из коллекции просто предварительно  вызываем int CIndicators::Refresh(void).