Обсуждение статьи "Рецепты MQL5 - Пишем свой стакан цен" - страница 5

 
Да, другая версия. Эта статья 2015 года, содержит код из второй статьи-продолжения 2017 года https://www.mql5.com/ru/articles/3336. Он к сожалению не компилируется. В целях обучения Вы можете воспользоваться оригинальной кодовой базой из 2015 года, в ней стакан цен работает без графика. Код я опубликовал выше. Что касается новой версии то для ее исправления потребуется определенное время.
Пишем скальперский стакан цен на основе графической библиотеки CGraphic
Пишем скальперский стакан цен на основе графической библиотеки CGraphic
  • 2017.06.23
  • www.mql5.com
В статье создается базовый функционал скальперского стакана цен. Разрабатывается тиковый график на основе графической библиотеки CGraphic и интегрируется с таблицей заявок. С помощью описываемого стакана цен можно создать мощный помощник для краткосрочной торговли.
 
Vasiliy Sokolov #:
Он к сожалению не компилируется.

В коде, прилагаемом к этой статье, всего пара ошибок. 

В файле MBookFon.mqh не правильно определена реализация метода - пропущен void:

void CBookFon::Show(void)
{
   ObjectCreate(ChartID(), m_name, OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(ChartID(), m_name, OBJPROP_YDISTANCE, 13);
   ObjectSetInteger(ChartID(), m_name, OBJPROP_XDISTANCE, 6);
   ObjectSetInteger(ChartID(), m_name, OBJPROP_XSIZE, 116);
   ObjectSetInteger(ChartID(), m_name, OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(ChartID(), m_name, OBJPROP_BGCOLOR, clrWhite);
   int total = (int)m_book.InfoGetInteger(MBOOK_DEPTH_TOTAL);
   ObjectSetInteger(ChartID(), m_name, OBJPROP_YSIZE, total*15+16);
   CreateCeils();
   
   OnShow();
}


В файле MBookCeil.mqh нет проверки размера массива и выхода за его пределы:

void CBookCeil::Refresh(void)
{
   int total = (int)m_book.InfoGetInteger(MBOOK_DEPTH_TOTAL);
   if(total == 0 || m_index < 0 || m_index > total-1)
      return;
   ENUM_BOOK_TYPE type = m_book.MarketBook[m_index].type;
   long max_volume = 0;
   if(type == BOOK_TYPE_BUY || type == BOOK_TYPE_BUY_MARKET)
   {
      ObjectSetInteger(ChartID(), m_name, OBJPROP_BGCOLOR, clrCornflowerBlue);
      max_volume = m_book.InfoGetInteger(MBOOK_MAX_BID_VOLUME);
   }
   else if(type == BOOK_TYPE_SELL || type == BOOK_TYPE_SELL_MARKET)
   {
      ObjectSetInteger(ChartID(), m_name, OBJPROP_BGCOLOR, clrPink);
      max_volume = m_book.InfoGetInteger(MBOOK_MAX_ASK_VOLUME);
   }
   else
      ObjectSetInteger(ChartID(), m_name, OBJPROP_BGCOLOR, clrWhite);
   MqlBookInfo info = m_book.MarketBook[m_index];
   if(m_ceil_type == BOOK_PRICE)
      m_text.SetText(DoubleToString(info.price, Digits()));
   else if(m_ceil_type == BOOK_VOLUME)
      m_text.SetText((string)info.volume);
   if(m_ceil_type != BOOK_VOLUME)return;
   double delta = 1.0;
   if(max_volume > 0)
      delta = (info.volume/(double)max_volume);
   if(delta > 1.0)delta = 1.0;   
   long size = (long)(delta * 50.0);
   if(size == 0)size = 1;
   ObjectSetInteger(ChartID(), m_name, OBJPROP_XSIZE, size);
   ObjectSetInteger(ChartID(), m_name, OBJPROP_YDISTANCE, m_ydist);
}

При первом запуске, когда стакан цен ещё не подключен, размер массива нулевой и, соответственно - вылет по критической ошибке.

 
Я скомпилировал файлы, но ошибки остались. Кто-нибудь может поделиться рабочей версией, пожалуйста.
 
startatrix #:
Я скомпилировал файлы, но ошибки остались. Кто-нибудь может поделиться рабочей версией, пожалуйста.
Если скомпилировали, то ошибок нет. Если не удалось скомпилировать, то какие ошибки?