Разработчикам и кто умеет: помогите договорится с тестером о времени нулевого бара младшего ТФ

 

Как многие - использую тестер с пустым советником для посмотреть на то, что показывает накинутый поверх графика индикатор.

В индикаторе при пересечении нулевым баром заданного уровня цены iCustom читает буфера другого индикатора с заданием младшего ТФ.

В реал-тайм - работает, на тестере что-то странное. Стал смотреть - оказалось что параметры свечек на младшем ТФ читаются не от нулевого бара, совпадающего по времени с моделируемым тестером нулевым баром, а от реального нулевого бара истории.

Пробовал: если в индикатор, вызываемый iCustom, добавить extern datetime и передовать при вызове Time[0] - то номер соответствующего по времени бара на младшем ТФ прочитать iBarShift можно правильно. Проблема в том, что уровни пробиваются баром не в момент открытия бара :).

Пробовал: iTime, iOpen,... , TimeCurrent(),... - не договорились...

Для примера прикладываю два маленьких индикатора:

Writer пишет на нулевом баре в три буфера цены открытия 5, 13, и 21 баров.

Reader, работая например на М15, читает с М1 эти значения и рисует на своем ТФ.

Если накинуть Reader на тестере на М15, то читать он будет то, что покажет Alert Writer'а :), т.е. нарисует три прямые на всем периоде тестирования. А хотелось бы немного другого. Только накидывайте ридер на график, предварительно поставив тестер на паузу, и нажимайте >> только после удаления ридера с графика, иначе Alert затрахает.

Кто-нибудь знает, как в данной ситуации заполучить номер бара младшего ТФ, соответствующего по времени моделируемому бару?

//+---------------------------------------------------------- Writer +
#property copyright ""
#property link      ""
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 White
#property indicator_color3 Lime
//----
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//----
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexEmptyValue(2,0.0);
   return(0);
  }
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
int start()
  {
      ExtMapBuffer1[0]=Open[5];
      ExtMapBuffer2[0]=Open[13];
      ExtMapBuffer3[0]=Open[21];
      Alert(Open[5]," ",Open[13]," ",Open[21]);
   return(0);
  }
//+------------------------------------------------------------------+
//+---------------------------------------------------------- Reader +
#property copyright ""
#property link      ""
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 White
#property indicator_color3 Green
//----
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//----
int pBars=0;
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexEmptyValue(2,0.0);
   return(0);
  }
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
int start()
  {
/*
   */
   if(Bars!=pBars) 
   {
      if(MathAbs(Close[0]-Open[0])>Point*2)
      {
      ExtMapBuffer1[0]=iCustom(NULL,PERIOD_M1,"Writer",0,0);
      ExtMapBuffer2[0]=iCustom(NULL,PERIOD_M1,"Writer",1,0);
      ExtMapBuffer3[0]=iCustom(NULL,PERIOD_M1,"Writer",2,0);
      pBars=Bars;
      }
   }
   return(0);
  }
//+------------------------------------------------------------------+
 
Тему Проблема с индикаторами в тестере видел, ворос не в том, что проблема есть, а как бы с ней справиться. Можно как-нибудь читать моделируемое время? или чего еще..... но что поможет.
 
Передавайте значение времени из тестируемого советника (Визуальный режим) в индикатор через Глобальные переменные.
 
Посчитать время следующего (будущего) бара большого таймфрейма, по этому времени получить номер бара малого таймфрейма (с exact=false). Проверить время бара малого таймфрейма (имеющего полученный номер). Если он из будущего бара, то из номера отнять 1, если из текущего, то такой номер и использовать. Что-то в таком стиле можно попробовать.
 
Rosh писал (а):
Передавайте значение времени из тестируемого советника (Визуальный режим) в индикатор через Глобальные переменные.


Как раз зашел, чтоб спросить! (вспомнил, кто мне их вдалбливал в свое время)

Вместо пустого советника - советник постоянно формирующий глобальную с временем TimeCurrent() и читай себе из индюков. А узнать хотел - можно ли, не будет ли задержки и т.п. Как понял - можно, спасибо!

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