ОШИБКА! ФУНКЦИИ AccountNumber() и AccountInfoInteger(ACCOUNT_LOGIN) ВОЗВРАЩАЮТ НУЛЕВОЙ НОМЕР СЧЕТА!

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

// Получить номер текущего счета

   int  account_number_1=AccountNumber();
   Print("account_number_1=", account_number_1); // возвращает account_number_1=0

// Возвращает значение соответствующего свойства счета

   long account_number_2=AccountInfoInteger(ACCOUNT_LOGIN);
   Print("account_number_2=", account_number_2); // возвращает account_number_2=0

 ...

Вставил обращение к этим функциям из функции OnCalculate(), все равно после первого тика обе функции возвращают ноль!
И только после второго тика функции возвращают ненулевой номер счета!

Кто знает, как получить ненулевой номер текущего счета внутри функции OnInit() в момент запуска терминала МТ4?




 

Забыл добавить главное - такое поведение функций характерно только при запуске терминала, если же индикаторы запускать после того как терминал запущен, то обе функции работают корректно, возвращают действительно текущий номер счета.

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

 
myzrov:

Забыл добавить главное - такое поведение функций характерно только при запуске терминала, если же индикаторы запускать после того как терминал запущен, то обе функции работают корректно, возвращают действительно текущий номер счета.

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


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

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

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

В-третьих, обе функции возвращают нулевое значение номера счета только в момент запуска терминала МТ4 (когда индикаторы уже были установлены на графике перед закрытием терминала). Если индикатор присоединять к графику в уже запущенном терминале, то таких проблем не возникает.

Складывая все вместе, можно сделать вывод, что это явный глюк, ошибка, которая причем легко локализуется и быстро исправляется.

 
Пока не установится связь с торговым сервером, Вы не получите информации о своём торговом счёте.
 
stringo:
Пока не установится связь с торговым сервером, Вы не получите информации о своём торговом счёте.
Вот это-то как раз и странно, ведь логин-пароль вводятся ещё до установки связи, то есть терминалу эти данные уже доступны.
 
evillive:
Вот это-то как раз и странно, ведь логин-пароль вводятся ещё до установки связи, то есть терминалу эти данные уже доступны.
Ничего странного. Нужно подтверждение идентификации, иначе можно будет ввести любые данные: например, при привязке к номеру счета - вводим любой пароль и индикатор запустится ;).... 
 
VladislavVG:
Ничего странного. Нужно подтверждение идентификации, иначе можно будет ввести любые данные: например, при привязке к номеру счета - вводим любой пароль и индикатор запустится ;).... 

Хотя да, верно, так и должно быть.

 
нет, неверно, так не должно быть...
VladislavVG:
Нужно подтверждение идентификации, иначе можно будет ввести любые данные:
например, при привязке к номеру счета - вводим любой пароль и индикатор запустится ;).... 
Как может индикатор, привязанный к номеру счета, запустится, если Вы введете левый логин+пароль? Ну посудите сами, если такая пара логин+пароль не существует, то авторизация просто не пройдет. Но на сегодня индикатор все равно запустится, даже если терминал не подключится к счету! И что Вы думаете вернет функция  AccountInfoInteger(ACCOUNT_LOGIN), когда терминал не подключен ни к одному счету? Вы удивитесь, но она возвратит последний номер счета, успешно прошедший авторизацию. Согласитесь, что нелогично возвращать индикатору "чужой" номер счета, так что это явно недоработка Метаквотов.

Во-первых, не понятно зачем запускать индикаторы до тех пор, пока не получено подтверждение авторизации на этом счете? Советники же не запускаются до тех пор пока не прошла авторизация! И зачем возвращать 0 вместо номера счета, если авторизация прошла успешно?

Во-вторых, предположим, что Метаквоты действительно задумали так, чтобы советникам было запрещено, а индикаторам разрешено запускаться во время загрузки терминала. И что? Вы ввели левый номер счета, но индикатор при запросе номера счета все равно не получит его, т.к. авторизация не состоялась, и терминал возвратит последний известный ему номер счета, прошедший авторизацию.

В общем, как говорится, "чем дальше влез, тем дольше вылезать" :)

 

В чём главное отличие индикатора от эксперта?

Индикатор рассчитывается на имеющихся ценовых данных и должен так или иначе отобразиться на ценовом графике.

Главная функция эксперта - совершение торговых операций на основе анализа поступающих ценовых данных

Так как индикатор должен быть правильно показан на ценовом графике, то он рассчитывается не только по приходу очередного тика, но и по любому изменению на ценовом графике

Какие могут быть изменения в данных на графике?

  • поднятие данных с нуля при старте терминала, при смене счёта, при смене профайла
  • смена таймфрейма графика
  • обновление данных по нажатию F5, либо после установления соединения
  • и, конечно же, приход нового тика

Было бы очень странно требовать от индикатора расчёта исключительно по приходу нового тика. А что тогда делать в выходные? Пялиться на пустой график и ждать расчёта индикатора до понедельника?

 
stringo: Было бы очень странно требовать от индикатора расчёта исключительно по приходу нового тика.

А что тогда делать в выходные? Пялиться на пустой график и ждать расчёта индикатора до понедельника?

Вы не правильно меня поняли. Мне без разницы когда и по какому поводу индикатор рассчитывает и отрисовывает данные - по приходу нового тика, чаще или реже. Не об этом речь! Я лишь ожидал, что функция  AccountInfoInteger(ACCOUNT_LOGIN), вызванная из любого места индикатора, в том числе из функции OnInit(), вернет мне номер текущего счета, т.е. сделает ровно то, что написано в справочнике MQL4

// Возвращает значение соответствующего свойства счета.

long  AccountInfoInteger(
   int  property_id      // идентификатор свойства
   );


Но функция ведет себя неоднозначно, двойственно. В одном случае она возвращает номер текущего счета, в другом - возвращает ноль! Где, скажите, написано в документации, что функция должна или может вернуть ноль во втором случае?

А так конечно, Вы все написали правильно - пусть индикатор и дальше рассчитывается не только по приходу очередного тика, но и по любому изменению на ценовом графике.