Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Торгуй как успешные трейдеры - подпишись на их сигналы!
Forex Trader
114252
Forex Trader 2006.03.09 12:12 
Обращаюсь со следующим вопросом - хочу выяснить, это баг какой либо МТ4, МЕ4 или моя ошибка?
Собственно, описание трабла:
На графике создаются линии уровней. Открытие уровня (time1) выставляется на начало периода (например, для интрадея - 10 часов). То есть - текущий день, 8 по времени ДЦ. Для более удобного предствления в эксперте далее отсчет выражается в барах, прошедший с начала периода.
Кол-во баров расчитывается по схеме
Bars_From_Start_Level=iBarShift(symb,Period(),StartLevel_Time, false); // Расчет кол-ва баров с начала периода
Print("Баров с начала уровней ",Bars_From_Start_Level);


где StartLevel_Time - datatime переменная начала периода.
Для примера возьмём, что начало перода - 08:00 по времени ДЦ.
Если эксперт запускается раньше указанного времени, то Bars_From_Start_Level=0 , если в 08:17, Bars_From_Start_Level=1 , это всё Ок считается.
Далее создаётся сам уровень следующим макаром:

      // Создаем новый уровень
      ObjectDelete(Name_Level);
      if (!ObjectCreate(Name_Level, OBJ_TREND, 0, Time[Bars_From_Start_Level+1], Uroven[valuta][NomerUroven][LevelCena],  Time[0], Uroven[valuta][NomerUroven][LevelCena]))
         Print("Debug. Ошибка рисования уровня: ",ErrorDescription(GetLastError()));
         else
         {//3
         ObjectSet(Name_Level, OBJPROP_STYLE, STYLE_SOLID);
         ObjectSet(Name_Level, OBJPROP_WIDTH, Uroven_WIDTH);
         ObjectSet(Name_Level, OBJPROP_COLOR, CvetObj);
         ObjectSet(Name_Level, OBJPROP_RAY, false);
         Print("Уровень ", Uroven_NAME[NomerUroven]+" "+DayStartLevel," создан");
         }//-3


Соответственно, время создания уровня - это или 1 бар от текущего, если создался раньше начала периода или в самое начало периода или же определённое кол-во баров, прошедшее с начала периода.
Вот и подошли к нашим овечкам...
Дело в том, что очень часто при ПЕРВОМ запуске терминала, который был отключен какой то срок (например, на ночь), время начала уровня (time1) создается терминалом не правильно!
К сожалению, сей момент не могу привести достойного лога, но вот например вчера (а это было 08.03.2006) он выглядел так (избранное):

12:06:30 Свечной анализ EURUSD,M15: Debug_13. Баров с начала уровней - 1
12:06:31 Свечной анализ EURUSD,M15: Debug. Нарисовали уровень Тип -2, Цена 1.1955, Имя "Продажа "С Разворота" ур.(-2) №17", Время начала (+1 бар) 2006.03.07 17:45


И получается в результате уровень, начинающийся со вчера вечера, вместо сегодняшнего утра....
То есть получается, что терминал откуда то подхватывает ПРОШЛОЕ значение time1 и нагло вставляет его вместо положеного по алгоритму Time[2] = 2006.03.08 12:16 ! (к примеру). При дальнейшем запуске эксперта уже всё нормально пересчитывает, на других валютных парах тоже иногда сразу нормально а иногда с таким же багом....
Так что мне делать с этим? Кто подскажет?

Forex Trader
114252
Forex Trader 2006.03.09 19:22  
А вот эта часть:

Bars_From_Start_Level=iBarShift(symb,Period(),StartLevel_Time, false); // Расчет кол-ва баров с начала периода
Print("Баров с начала уровней ",Bars_From_Start_Level);



находится в функции старт или инит?

Forex Trader
114252
Forex Trader 2006.03.09 20:26  
А вот эта часть:

Bars_From_Start_Level=iBarShift(symb,Period(),StartLevel_Time, false); // Расчет кол-ва баров с начала периода
Print("Баров с начала уровней ",Bars_From_Start_Level);



находится в функции старт или инит?



По первости расчитывается в init, потом каждый новый бар - в start.
Но перед расчетом в инит стоит временнАя задержка для подкачки истории. Не помогает....
MetaQuotes Software Corp.
Модератор
180340
MetaQuotes Software Corp. 2006.03.09 21:10  
По первости расчитывается в init, потом каждый новый бар - в start.
Но перед расчетом в инит стоит временнАя задержка для подкачки истории. Не помогает....

В ините нельзя заниматься сбором и обработкой рыночной информации. При ините индикатор только конструируется и рыночных данных может и не быть вовсе. То есть, не надо вызывать никаких расчетов, основанных на рыночных данных.

В ините можно заниматься только общими подготовительными делами, которые не базируются и не затрагивают рыночного окружения.
Forex Trader
114252
Forex Trader 2006.03.09 21:10  
iBarShift(symb,Period(),StartLevel_Time, false); - последний аргумент false - значит при дыре в истории находит следующее значение. Попробуй сделать true. Если точное время не найдено (история не закачена) будет возвращаться -1. Исходя из этого чтонить можно сделать.
Forex Trader
114252
Forex Trader 2006.03.09 21:42  
Спасибо, буду читать пейджер и много думать...
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий