init()

 
В моём эксперте в init() проверяется количество открытых ордеров.
Если я прикрепляю эксперта к чарту, или меняю период чарта с уже прикрепленным экспертом - это отрабатывается нормально, сообщается правильное количество открытых ордеров.
Но вот если я выгружаю MT и запускаю заново, и к чарту прикреплен мой эксперт, то количество ордеров равно нулю. Я догадываюсь, что это связано с тем, что MT некоторое время тратит на LOGIN, а эксперт еще до логина отрабатывает функцию OrdersTotal().

Подскажите, как обойти ситуацию, как заставить эксперта подождать окончания LOGIN процесса, ну или еще что нибудь...

Спасибо
pyrat
 
в init(), в самом начале -
while ( !IsConnected() ) Sleep(100);
 
в init(), в самом начале -
while ( !IsConnected() ) Sleep(100);



Не помогло :(

Попробуйте сами, эксперт простой.


int init()
{
   while ( !IsConnected() ) Sleep(100);
   Print("init(): Open orders:" + OrdersTotal() ) ;
   return(0);
}
int deinit()
{   return(0);}
int start()
{   return(0);}



Перестартовать MT с экспертом привязанным к чарту и хотя бы одним открытым ордером - получите "ноль". Если после этого менять период, прикреплять эксперта к чарту - получите правильное количество открытых ордеров.

 
странно, у меня работает =) правда, не кол-во сделок, а номер счёта ( AccountNumber() )...
попробуй ещё
while ( !IsConnected() ) Sleep(100);
Sleep(1000);
 
while ( !IsConnected() ) Sleep(100);
Sleep(1000);


так тоже не работает =)))

а вот так - то, что нужно ;)

bool first = true;
int init()
{
   while ( !IsConnected() ) Sleep(100);
   return(0);
}
int deinit()
{   return(0);}
int start()
{   
if (first)
{
	Print("init(): Open orders:" + OrdersTotal() );
	first = false;
}
return(0);}
 
Спасибо, вроде работает
Но с этой init() уже не первый такой случай когда обнаруживается, что функции в нем работают не как в start()... (уже писал про ObjectCreate() в форуме)
Приходится эмулировать этот init() в starte(). Но нужен ли тогда он init() этот. Чтобы им воспользоваться его еще поизучать надо - что в нем будет работать, а что нет...

Г-да разработчики, прокомментируйте пожалуйста. Это бага, или запланированное но недокументированное поведение?

Спасибо
pyrat
 
Не разработчик, но вставлю пару копеек ...

Все работает правильно.
- При запуске терминала запускаются эксперты.
- При этом срабатывает init.
- Но связь с сервером либо еще не установлена, либо установлена, но не все данные (напр. ордера) с него подкачаны.

Это нормально.
 
Не разработчик, но вставлю пару копеек ...

Все работает правильно.
- При запуске терминала запускаются эксперты.
- При этом срабатывает init.
- Но связь с сервером либо еще не установлена, либо установлена, но не все данные (напр. ордера) с него подкачаны.

Это нормально.


Хорошо, и понятно что происходит
Но почему тогда приведенные чуть выше вариант работает (когда перенесли все в start()).
Почему сложно сделать, чтобы init() вел себя как ожидается?
 
Но почему тогда приведенные чуть выше вариант работает (когда перенесли все в start()).
это потому что старт запускается _только_ при наличии коннекта - с приходом котировки...
 
- Но связь с сервером либо еще не установлена, либо установлена, но не все данные (напр. ордера) с него подкачаны.
не логично... если есть связь - должны быть _все_ данные. имхо, конечно, но надо сделать корректную отработку...
 
- Но связь с сервером либо еще не установлена, либо установлена, но не все данные (напр. ордера) с него подкачаны.
не логично... если есть связь - должны быть _все_ данные. имхо, конечно, но надо сделать корректную отработку...

Init - первое действие при подключении эксперта.
И это действие должно отработать тут же, показать результат (если нужно), а не тормозить.
Старайтесь использовать в инициализации подготовку общих данных и не пытайтесь производить реальную работу.