У Альпари появился стакан котировок - страница 2

 

Естественно, при проверке чтения выяснилось, что читается всё криво :)

Выкладываю более-менее рабочий вариант.

Файлы:
 
Interesting:

Дык давно появился, я еще с 7 чтсла прошу и тут его организовать (если мона). А в ответ тишина...

Ну раз разработчики не отслеживают изменения в заявке придется тут повториться:

Я что-то в толк не возьму, почему BOOK_TYPE_BUY = 0, а не 1?


PS

Хорошо, что еще опыт позволил быстро сообразить где собака убита... :)

Давно говорю, что в справке нужно и числовые коды опубликовывать, тогда всем проще будет.

Vladimir:

А вот вы уверены в том что BOOK_TYPE_BUY = 1, а не скажем 0?

Не ясно о чем вопрос - https://www.mql5.com/ru/docs/constants/tradingconstants/enum_book_type

Виды заявок в стакане цен

Для биржевых инструментов доступно окно "Очереди заявок", в котором можно посмотреть текущие заявки на покупку и продажу. Для каждой заявки указано желаемое направление торговой операции, требуемый объем и запрашиваемая цена.

Для получения информации о текущем состоянии стакана цен средствами языка MQL5 предназначена функция MarketBookGet(), которая помещает "снимок стакана" в массив структур MqlBookInfo. Каждый элемент этого массива в поле type содержит информацию о направлении заявки – это значение из перечисления ENUM_BOOK_TYPE.

ENUM_BOOK_TYPE

Идентификатор

Описание

BOOK_TYPE_BUY

Заявка на покупку

BOOK_TYPE_SELL

Заявка на продажу

Смотри также


Поясняю в чем вопрос

Вот небольшой пример (два кажется правильных варианта), но это только кажется.

Первый из них работает, а второй глючит..

1. работает, поскольку ArrayMarketBookInfo[i].type и BOOK_TYPE_SELL = 2

    for(i=0;i<SizeBook;i++)
    {
   
      if(ArrayMarketBookInfo[i].type==BOOK_TYPE_SELL)
      //Подсчет даных по коротким позициям
      {
      }
      else
      //Подсчет данных по длинным позициям
      {
      }

    }


2. не работает, поскольку ArrayMarketBookInfo[i].type равно 1, а как я понимаю BOOK_TYPE_BUY = 0

    for(i=0;i<SizeBook;i++)
    {
   
      if(ArrayMarketBookInfo[i].type==BOOK_TYPE_BUY)
      //Подсчет даных по коротким позициям
      {
      }
      else
      //Подсчет данных по длинным позициям
      {
      }

    }
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Виды заявок в стакане цен
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Виды заявок в стакане цен
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Виды заявок в стакане цен - Документация по MQL5
 
Interesting:

Vladimir:

А вот вы уверены в том что BOOK_TYPE_BUY = 1, а не скажем 0?

Не ясно о чем вопрос - https://www.mql5.com/ru/docs/constants/tradingconstants/enum_book_type

Виды заявок в стакане цен

Для биржевых инструментов доступно окно "Очереди заявок", в котором можно посмотреть текущие заявки на покупку и продажу. Для каждой заявки указано желаемое направление торговой операции, требуемый объем и запрашиваемая цена.

Для получения информации о текущем состоянии стакана цен средствами языка MQL5 предназначена функция MarketBookGet(), которая помещает "снимок стакана" в массив структур MqlBookInfo. Каждый элемент этого массива в поле type содержит информацию о направлении заявки – это значение из перечисления ENUM_BOOK_TYPE.

ENUM_BOOK_TYPE

Идентификатор

Описание

BOOK_TYPE_BUY

Заявка на покупку

BOOK_TYPE_SELL

Заявка на продажу

Смотри также



Давно уже говорю, что в справочнике нужно приводить числовые коды для таких вещей. как это было в справке по MQL4...

 
Interesting:

Поясняю в чем вопрос

Вот небольшой пример (два кажется правильных варианта), но это только кажется.

Первый из них работает, а второй глючит..

1. работает, поскольку ArrayMarketBookInfo[i].type и BOOK_TYPE_SELL = 2


2. не работает, поскольку ArrayMarketBookInfo[i].type равно 1, а как я понимаю BOOK_TYPE_BUY = 0


Приводите, пожалуйста, код, который можно понять. Вы показали кусок кода, из которого не очевидно, что проблема в языке MQL5, а не  в Вашем коде. Мы же не можем догадываться, что Вы имеете в виду.
 
Rosh:
Приводите, пожалуйста, код, который можно понять. Вы показали кусок кода, из которого не очевидно, что проблема в языке MQL5, а не  в Вашем коде. Мы же не можем догадываться, что Вы имеете в виду.

А что тут догадываться, все просто и очевидно (сам язык тут не причем, все дело в цифровом представлении идентификатора BOOK_TYPE_BUY).

По логике вещей BOOK_TYPE_BUY =1, а BOOK_TYPE_SELL = 2. И MarketBookGet(symbol,ArrayMarketBookInfo) подразумевает имено такой итог.

Но вот на практике BOOK_TYPE_BUY = 0 (ошибочно, по видимому). MarketBookGet в ArrayMarketBookInfo (которое по сути является массивом с типом MqlBookInfo) возвращает 1 (для Buy)и 2 (для Sell).

При этом поскольку BOOK_TYPE_SELL = 2 все работает, а вот с BOOK_TYPE_BUY с проблемка (поскольку возвращается 1, а сам BOOK_TYPE_BUY = 0).

Во втором случае на данный момент в ArrayMarketBookInfo (читай MqlBookInfo) тип никогда не будет равен MqlBookInfo идетификатору BOOK_TYPE_BUY (поскольку он ошибочно принимается за 0), в итоге все будет обработано как короткие позиции.


Вот попробуйте получить нормальный результат вот от этого кода... :)

//Пытаемся загрцзить данные стакана цен
Res = MarketBookGet(symbol,ArrayMarketBookInfo);

  if(Res)
  //Данные успешно получены
  {
  //Определяем количество записей в стакане цен
  SizeBook=ArraySize(ArrayMarketBookInfo);

    for(i=0;i<SizeBook;i++)
    {
    
      if(ArrayMarketBookInfo[i].type==BOOK_TYPE_BUY)
      //Подсчет данных по длинным позициям
      {
      //Этот блок не выполнится при любом исходе, поскольку 1(как MqlBookInfo[i].type) != 0 (как BUY)
      }
      else
      //Подсчет данных по коротким позициям
      {
      //В этом блоке обработается весь стакан (поскольку и BOOK_TYPE_BUY и BOOK_TYPE_SELL != 1)
      }

    }    

  }


 
lea:

Естественно, при проверке чтения выяснилось, что читается всё криво :)

Спасибо за замечание. Значения перечисления BOOK_TYPE_BUY и BOOK_TYPE_SELL приведены в актуальное состояние. Будет в следующем обновлении
 

Разработчикам.

Можно будет снова подключить стакан, месяца на два-три?

Желательно по всем символам которые торгуются на чемпионате...



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