Порядок выполнения init() - страница 3

 
_new-rena:
init() индикатора и советника работают по разному. Индикатор будет проходить переинициализацию каждый раз, а советник - только при запуске.
Нет.
 
tara:
Нет.
как угодно. опытным путём. нет так нет. у меня вообще уже без индюков. может и подзабыл
 
Integer:

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

Проверку делать примерно так:


Большое спасибо. Завтра буду разбираться и пробовать.
 
_new-rena:
как угодно. опытным путём. нет так нет. у меня вообще уже без индюков. может и подзабыл

Integer ответил.
 
tara:

Integer ответил.
видел - круто
 

Да. Integer ответил круто и близко к решению проблемы. Я (ещё не успел) сейчас проверю такой вариант, но!!! Если поставить сов на график, (он сделает всё согласно алгоритма без ошибок), потом переключить ТФ (выполнено с ошибкой), а потом сколько не вызывай свойства советника ничего не получается, ошибка остаётся... Хотя данные уже должны-бы подгрузиться. Только если сов удалить с графика, а потом заново поставить. Тогда алгоритм будет выполнен безошибочно и на новом ТФ. Вернуть ТФ обратно... Та-же самая процедура.

Вот думаю, не в переменных-ли глобального уровня проблема??? Ведь они инициализируются до выполнения init() а в случаях изменения свойств советника или изменении ТФ остаются... Но и это у меня под сомнением... Ведь первое что делается это находится фрактал на текущем ТФ и это значение пишется в переменную. Поэтому обнуление переменных не приводит к положительному результату. Это проверил. Даже пробовал вместо переменных использовать массивы и первой строкой в init() ArrayInitialize(массив, 0).

 
Integer:

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

Проверку делать примерно так:


К сожалению как я и предположил это не помогло. Вот что я добавил в init()


datetime d[]; int err;
for(int i = 0; i <=5; i++)
{
ArrayCopySeries(d, MODE_TIME, Symbol(), Period());
err = GetLastError();
if(err > 0)
{
Print("GetLastError() == ", err);
continue;
}
else
{
Print(Period());
break;
}
}

Печатает только период.

Может я что-то не так сделал в этой проверке?

 

Повторюсь по другому.

Без кода можно говорить только об общем.

Частное решение найти не удастся

Хотя, если нужно общее, то в статьях все это есть

 

Vinin, меня и интересует общее. Код выполняется без ошибок на любом ТФ. Проблема при переключении ТФ. Ну повторяю специально для Вас. Если сов ставить на график выполняется безошибочно. Проблема в переинициализации. Какие данные могут быть не обновлены??? Все переменные обнулял, не помогает. Почему-то начинает искать фрактал не с 3-го бара, а не понятно с какого и какого ТФ.

Или вы хототе найти ошибку в такой строке

frUp = iFractals(NULL, 0, MODE_UPPER, i+3);

 

Проблема в i? Вы хотите считать данные которые еще не загрузились. Если откроете другой график. Сперва на нем переключитесь на нужный тайм-фрейм, потом на основном (сделав паузу в несколько секунд), проблема исчезнет.

А так Вы обращаетесь к данным, а они пока только загружаются. И естественно будут проблемы.

Хотя можно сделать цикл по обработке ошибки 4066, может и поможет

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