Проблемы с Services. MarketBookAdd(symbol)

 
Функция  MarketBookAdd( symbol ) не работает в сервисе.  
Завершается с ошибкой 4101 - ERR_CHART_WRONG_ID 
Но у сервисов вообще нет привязки к графику.
В числе запрещенных для сервисов функций MarketBookAdd нет.

Помогите решить эту проблему - запуск MarketBookAdd из Сервиса.


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

Документация по MQL5: Операции с графиками / ChartID
Документация по MQL5: Операции с графиками / ChartID
  • www.mql5.com
Возвращает идентификатор текущего графика. Возвращаемое значение Значение типа long . Пример...
 

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

Сервисы в их текущей концепции невозможно использовать для событий.

 
Можно сделать сервис, который будет контролировать, чтобы на нужном символе работал советник или индикатор, обрабатывающий данные стакана.
 
Дак в сервисах можно с наскока вызывать MarketBookGet. Я в советниках сначала с наскока пытаюсь получить стакан, если не получилось подписываюсь. OnBookEvent вообще не пользуюсь. Все получаю, через MarketBookGet в любом месте программы.
 

Если ничто не подпишется на стакан сперва (вызвав MarketBookAdd), то вряд ли MarketBookGet что-то прочитает. Так что, чисто теоретически, если и пытаться читать стаканы из сервиса, потребуется другая программа для подписки. Кроме того, если MarketBookAdd запрещена для сервисов, то я подозреваю, что и MarketBookGet запрещена. Но я из сервисов не пробовал.

Может быть, и достаточно из сервиса найти любой чарт с требуемым символом и подпихнуть его в MarketBookAdd (и это сработает без ошибки), но если этот чарт закроют, то подозреваю, сервис перестанет получать обновления. Так что идея с отдельно взятым сервисом как обработчиком стакана пока кажется ущербной, если MQ не поменяют API.

 
Stanislav Korotky #:

Если ничто не подпишется на стакан сперва (вызвав MarketBookAdd), то вряд ли MarketBookGet что-то прочитает. Так что, чисто теоретически, если и пытаться читать стаканы из сервиса, потребуется другая программа для подписки. Кроме того, если MarketBookAdd запрещена для сервисов, то я подозреваю, что и MarketBookGet запрещена. Но я из сервисов не пробовал.

Может быть, и достаточно из сервиса найти любой чарт с требуемым символом и подпихнуть его в MarketBookAdd (и это сработает без ошибки), но если этот чарт закроют, то подозреваю, сервис перестанет получать обновления. Так что идея с отдельно взятым сервисом как обработчиком стакана пока кажется ущербной, если MQ не поменяют API.

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

 
pivomoe #:

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

Здесь поподробнее, пожалуйста.

Но в любом случае, если я правильно понимаю механизм событий МТ5, нужен выделенный открытый график - в довесок к сервису. А тогда и нет смысла городить сервис.

 
Stanislav Korotky #:

Здесь поподробнее, пожалуйста.

 А тогда и нет смысла городить сервис.

сервис в терминах Mt - это просто отдельный системный тред, который запустить иначе нельзя. (его нет в профиле). Это такая мега-фича :-)

 
Maxim Kuznetsov #:

сервис в терминах Mt - это просто отдельный системный тред, который запустить иначе нельзя. (его нет в профиле). Это такая мега-фича :-)

Как эта общеизвестная информация оправдывает применение сервиса для получения стакана, если без доп.графика все равно нельзя инициировать его трансляцию?

 
Stanislav Korotky #:

Как эта общеизвестная информация оправдывает применение сервиса для получения стакана, если без доп.графика все равно нельзя инициировать его трансляцию?

и куда он будет транслироваться ?

вот как системщик системщику - куда и как ?? 

в "сервисе" единственный OnStart - и понеслась..

ps/ "сервис" может генерить стакан. Это в принице зашибись. Я так понимаю разработчики постарались чтобы это было возможным. и ничего не крякнулось.
 
Maxim Kuznetsov #:

и куда он будет транслироваться ?

вот как системщик системщику - куда и как ?? 

в "сервисе" единственный OnStart - и понеслась..

Это вопрос не ко мне. Если почитаете ветку повнимательнее, то может быть заметить, что pivomoe предложил в сервисе читать стакан вызовами MarketBookGet (по идее этого достаточно, если стакан-таки в терминале уже получен). Я ему расписал собственное представление об этом, т.е. необходимость инициирования подписки на график и т.д. Куда и что будет ли "транслироваться" - вы можете проверить сами - вызов MarketBookGet оставляет организацию "трансляции" "внешним силам".