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

 
piterpen >>:

Странный подход к жизни. Есть некая данность. Вам хочется, чтобы было по-другому. И что? Вы в силах создать свой торговый терминал и свой язык типа MQL?


Да не подход странный. Мне надо что бы данные всегда были при инициализации индикатора, а то иногда бывает что количество свечей = 0. А то ведь иногда только при выполнении функции START() появляются данные.

 
))) Во-первых, про наши терки с TheXpert. Это мы так... прикалываемся по старой памяти - не обращайте внимания. Это первое.

По делу. Вам, вижу, ну совсем не хочется отказываться совсем от init() (я исключительно про индикаторы сейчас) - пардон за тавтологию, но здесь "совсем" несут разные смысловые нагрузки - т.е. это даже не тавтология.))) Элегантность по-вашему - это заставить init() таки работать как вам хочется, а не как есть. Согласен. Значит, нужно напрягать разработчиков и ждать результата (вот выпустят они MQL5 и сразу займутся этой проблемой!)))
Более короткого (элегантного) решения в практическом плане, чем заменить ф-ю init () на пользовательскую, у меня нет. Да. Для этого нужно вводить аж 1 (одну) переменную и вызывать ф-ю явно - ну не получается ее выдрессировать запускаться как init() по умолчанию при запуске индюка!)))

Менее элегантно (что уже предлагалось здесь) это просто вынести из init() неработающие участки в ту же отдельную ф-ю. Тогда init() будет по прежнему радовать глаз своим присутствием в коде. Говорят, что она таки работает быстрее, чем пользовательская. Хотя какое это имеет значение - выполнение ее однократно, время исполнения ничтожно по сранению с start(). Хоть при тестировании, хоть (и тем более) в реале.

Кстати! Инициализация с вызовом через start() упрощает определение номера подокна индюка. В init() в лоб там его не получишь. Но это так... к слову.
 

Svinozavr писал(а) >>

А может, так и было задумано? Ну, типа, стат. переменные при смене тайм-фрейма не переинициализируются спецом. Хотя зачем?

Ну, скажем так, это негативная сторона того, что было задумано.

З.Ы. В индикаторах такого не происходит.

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

Кстати. Бары совершенно корректно определяются в init() эксперта при смене тайм-фрейма.

А при запуске терминала проверяли?

А вообще, кто забыл, речь шла изначально про индикаторы.)))

Ну лучше перебдеть :) .

Но если объявить эту переменную как extern, то все канает.

Угу, но инкапсуляция.

 
TheXpert >>:

Ну, скажем так, это негативная сторона того, что было задумано.


А что было задумано? В чем фишка-то?

А при запуске терминала проверяли?

Мы про смену тайм-фреймов или про запуск?

Ну лучше перебдеть :) .

Это да. Я даже тему сделал про этот баг вот только-что. Может, кто чего пояснит...


Угу, но инкапсуляция.

Поясните. Я всего как с полгода назад MQL в MetaEditor'е увидел и не в курсе.

 
Svinozavr >>:

А что было задумано? В чем фишка-то?

Точно не помню. Оптимизация чего-то. Искать надоть.

Мы про смену тайм-фреймов или про запуск?

Мы про индикаторы. У них есть функция инит. Если индикатор повешен на график, то при запуске терминала код в ините имеет свойство работать не всегда так, как нужно.

Это к слову о корректном обращении к истории.

Поясните. Я всего как с полгода назад MQL в MetaEditor'е увидел и не в курсе.

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

 
TheXpert >>:

Точно не помню. Оптимизация чего-то. Искать надоть.

Хрен с ним. Забудьте.

Мы про индикаторы. У них есть функция инит. Если индикатор повешен на график, то при запуске терминала код в ините имеет свойство работать не всегда так, как нужно.

Это к слову о корректном обращении к истории.

Не боюсь показаться занудой (это после всего!))), но топикстартер в сабже был однозначен. Хотя... лишних знаний не бывает.)))

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

А, это... Ну да, конечно. Через анус приходится. А что делать?)))

 

А вообще, "где ты ничего не можешь, ты не должен ничего хотеть". По латыни звучит красивей, но уже не помню. Я к тому, что есть данность в виде Метатрейдера, у которого есть баги, которые ты исправить не можешь, потому как не разработчик. Отсюда, рассуждать об этом - праздное занятие. Чего-то не работает? Фигня! Сделаем, не заморачиваясь, обходной маневр в своем коде.

Вот не загрузил бы топикстартер этим ...))), не потратил бы стока времени - ей-богу, сутки уже обсуждаем! ))) Работает и работает, и хрен с ним.

Хотя кой-чего интересного всплыло.

 
KI-trader >>:


Bars содержит данные ТЕКУЩЕГО инструмента на ТЕКУЩЕМ тайм-фрейме, в отличии от iBars(), которая вернет данные ЛЮБОГО инструмента на ЛЮБОМ тайм-фрейме. Вот и все разница! А мне надо что бы функция INIT() выполнилась после получения данных терминалом! Если данных нет, то и Bars и iBars() вернут НОЛЬ!

Чего вы раскричались то? )))

Насчет отличий Bars от iBars ответ неверный. Об этом почему то умолчали в хэлпере, но где-то от разработчиков проскакивало, что данные массивов-таймсерий всегда содержат свежие данные в то время как их "младшие сестры" (Bid, Ask, Open, High, Low, Close) обновляются только с новым тиком или по RefreshRates.

Ну а насчет выполнения init после получения данных - вставьте указанную конструкцию в самом начале init и только после отработки конструкции выполняйте необходимые вам действия. Всего то. За вас это все равно делать никто не будет. Поймите одну простую вещь - информации по разным символам много, таймфрейм тоже не один. Если ежесекундно МТ будет полностью обновлять всю информацию, которая в таком объеме пользователю не нужна, то на саму торговлю и времени то не останется. От вас же всего лишь требуется запросить необходимую информацию и немного подождать, пока она будет формироваться. 

 
Scriptong >>:

где-то от разработчиков проскакивало, что данные массивов-таймсерий всегда содержат свежие данные в то время как их "младшие сестры" (Bid, Ask, Open, High, Low, Close) обновляются только с новым тиком или по RefreshRates.

Интересно. И каким же образом массивы-таймсерии получат свежие данные если тика не было? Функция start() ведь не запускалась. Каким же образом iBars или MarketInfo(Symbol(), MODE_BID) получат новое значение, если они находятся внутри start-а?

 
benik >>:

Интересно. И каким же образом массивы-таймсерии получат свежие данные если тика не было? Функция start() ведь не запускалась. Каким же образом iBars или MarketInfo(Symbol(), MODE_BID) получат новое значение, если они находятся внутри start-а?

Вообще-то речь идет о функции init, которой тика не требуется. Причем тут start?

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