Init() выполняется не дождавшись данных - страница 2

 

Вот как это могло бы выглядеть:

bool first=1;

int start()
  {
   if(first) first=First(); // если первое обращение к start()
   int ic=IndicatorCounted();
   if(Bars-ic>2) ic=reinit(); // если есть пропущенные бары
   
   int limit=Bars-ic-1;
   for(int i=limit; i>=0; i--) {
      //----
      // цикл пересчета
      //----
     }
   return(0);
  }
//+------------------------------------------------------------------+

bool First() { // замена init()
   // то, что должно быть init();
   return(0);
  }
  
int reinit() { // дополнительная инициализация
   // то, что необходимо переинициализировать при пересчете:
   // индикаторные массивы, общие и стат. переменные (последние нужно передавать в ф-ю)
   // удаление граф. объектов, обнуление их счетчика
   // и т.д.
   return(0);
  }
 
Svinozavr >>:

Вот как это могло бы выглядеть:

А давайте ещё к велосипеду пропеллер прикрутим будет велопеллер.

 

Корректнее так - не делать переинициализацию при первом обращении к start(). Но прошлый вариант тоже рабочий - проверил.

bool first=1;

int start()
  {
   if(first) First(); // если первое обращение к start()
   int ic=IndicatorCounted();
   if(!first && Bars-ic>2) ic=reinit(); // если есть пропущенные бары не на первом подключении (в работе)
   
   int limit=Bars-ic-1;
   for(int i=limit; i>=0; i--) {
      //----
      // цикл пересчета
      //----
     }
   first=0;
   return(0);
  }
//+------------------------------------------------------------------+

void First() { // замена init()
   // то, что должно быть init();
  }
  
int reinit() { // дополнительная инициализация
   // то, что необходимо переинициализировать при пересчете:
   // индикаторные массивы, общие и стат. переменные (последние нужно передавать в ф-ю)
   // удаление граф. объектов, обнуление их счетчика
   // и т.д.
   return(0);
  }
 
Urain >>:

А давайте ещё к велосипеду пропеллер прикрутим будет велопеллер.

))) А не замахнуться ли нам на start()? Действительно - как без нее хорошо - ВООБЩЕ никаких проблем! Бугагага!

 
Urain >>:

А давайте ещё к велосипеду пропеллер прикрутим будет велопеллер.

Кстати говоря, в советнике, возможно без init полностью не обойтись, из-за схемы размещения в памяти.

Т.е. начальное значение переменной FirstRun = true должно происходить именно в ините, а не при объявлении переменной. Не проверял. Но 90% что так оно и есть :) .

Т.е. типо так:


bool IsFirstRun;

int init()
{
   IsFirstRun = true;
}

int start()
{
   if (IsFirstRun)
   {
      IsFirstRun = false;
      //...
   }
   //...
}

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


Проблемы с тем, что в ините не видны бары, тоже могут возникать, здесь есть темы, этому посвященные, вроде даже с рекомендациями разработчиков. Типа лучше в ините этого не делать.


Имхо, приведенная выше схема -- по меньшей мере нормальна.

Единственно ее бы проверить с функциями SetIndexBuffer SetIndexStyle и т.д. и т.п. Возможно, их пользовать вне функции инит.

 
TheXpert >>:


Т.е. начальное значение переменной FirstRun = true должно происходить именно в ините, а не при объявлении переменной. Не проверял. Но 90% что так оно и есть :) .



остальные 10%  включают вариант

static bool IsFirstRun=true;

по-моему тоже работает:)

 
TheXpert >>:

Имхо, приведенная выше схема -- по меньшей мере нормальна.

Единственно ее бы проверить с функциями SetIndexBuffer SetIndexStyle и т.д. и т.п. Возможно, их пользовать вне функции инит.


По своему опыту скажу - если перед написанием программы мне интуиция подсказывает, что придется время от времени переинициализироваться, первое, что я делаю - это удаляю инит() и рисую что-то подобное тому, что написал Svinozavr. Дабы потом не переделывать код. Проблем ни с одной функцией, "стандартно" находящейся в инит(), у меня не возникало.

 
TheXpert >>:

Единственно ее бы проверить с функциями SetIndexBuffer SetIndexStyle и т.д. и т.п. Возможно, их пользовать вне функции инит.

Возможно, проверено мин нет(только немного тормозно получается).

 
TheXpert >>:

Имхо, приведенная выше схема -- по меньшей мере нормальна.

Единственно ее бы проверить с функциями SetIndexBuffer SetIndexStyle и т.д. и т.п. Возможно, их пользовать вне функции инит.


А не по меньшей мере - ясен пень - гениальна...

Че проверять, выполняться ли команды для инд.буферов?

#property indicator_separate_window // в подокне
#property indicator_buffers 1
#property indicator_color1 Red 

double Buff0[];
bool first=1;

/*
int init() {
   SetIndexBuffer(0,Buff0);
   return(0);
  }
*/

int start()
  {
   if(first) First(); // если первое обращение к start()
   int ic=IndicatorCounted();
   if(!first && Bars-ic>2) ic=reinit(); // если есть пропущенные бары не на подключение (в работе)
   
   int limit=Bars-ic-1;
   for(int i=limit; i>=0; i--) Buff0[i]=(High[i]+Low[i])/2;
   first=0;
   return(0);
  }
//+------------------------------------------------------------------+

void First() { // замена init()
   // то, что должно быть init();
   SetIndexBuffer(0,Buff0);
  }
  
int reinit() { // дополнительная инициализация
   ArrayInitialize(Buff0,0.0); // здесь не обязательно, но в общем случае...
   // то, что необходимо переинициализировать при пересчете:
   // индикаторные массивы, общие и стат. переменные (последние нужно передавать в ф-ю)
   // удаление граф. объектов, обнуление их счетчика
   // и т.д.
   return(0);
  }
 
Svinozavr >>:

А не по меньшей мере - ясен пень - гениальна...

Гениальностью не страдаю, в отличие от некоторых :) .
Причина обращения: