Обсуждение статьи "Пишем скальперский стакан цен на основе графической библиотеки CGraphic" - страница 4

 
"Each such class has a common parent, the CNode class, which performs only one function, i.e. stores the type of the basic primitive. 
Its only protected constructor requires type specification during element creation." 

Класс CNode не хранит тип базового примитива, а CEIChart хранит через член m_obj_type.

Спасибо Василий

 

В новых билдах терминала  (примерно с версии 2170) появилась проблема с исходниками сабжевой статьи ("Пишем скальперский стакан").
В частности, основной файл "MarketBook.mq5" выдает критические ошибки при компиляции:

  'Event' - unexpected token, probably type is missing?    MBookBtn.mqh    57    12

  'Event' - function already defined and has different type    MBookBtn.mqh    57    12

Подскажите плиз что не так и как исправить?


P.S. сейчас проверил "MarketBook.mq5" из старой статьи 2015 года. Оказалось и с тем проектом возникают ошибки такого же рода:

  'Show' - unexpected token, probably type is missing?    MBookFon.mqh    47    11
  'Show' - function already defined and has different type    MBookFon.mqh    47    11

 
avento:

В новых билдах терминала  (примерно с версии 2170) появилась проблема с исходниками сабжевой статьи ("Пишем скальперский стакан").
В частности, основной файл "MarketBook.mq5" выдает критические ошибки при компиляции:

  'Event' - unexpected token, probably type is missing?    MBookBtn.mqh    57    12

  'Event' - function already defined and has different type    MBookBtn.mqh    57    12

Подскажите плиз что не так и как исправить?


Язык развивается и требования ужесточаются.

Смотрим файл "MBookBtn.mqh", объявление класса CMBookBtn - функций Event объявлена как void

//+------------------------------------------------------------------+
//| Класс представляет кнопку вверху графика, при нажатии на которую |
//| отображается панель, с тиковым графиком и таблицей заявок.       |
//| Повторное нажатие кнопки скрывает панель.                        |
//+------------------------------------------------------------------+
class CMBookBtn : public CElButton
  {
private:

   CMBookArea        m_book_area;
   bool              m_showed_book;
public:
                     CMBookBtn();
   void              SetMarketBookSymbol(string symbol);
   void              Refresh();
   void              Event(int id,long lparam,double dparam,string sparam);
   void              Clear(void);
   virtual void      OnShow(void);
  };

и теперь смотрим на саму функцию в классе:

function already defined and has different type

вторая ошибка говорит, что "'Event' - function already defined and has different type MBookBtn.mqh 57 12" - то есть функция была объявлена с типом void, а здесь она без указания типа.


Лечим

//+------------------------------------------------------------------+
//| Перехватываем щелчок мыши по нашей кнопке. Если кнопка после     |
//| щелчка в состоянии нажатия - показываем панель. Если в состоянии |
//| отжатия - скрываем панель                                        |
//+------------------------------------------------------------------+
void CMBookBtn::Event(int id,long lparam,double dparam,string sparam)
  {

- просто дописываем void перед функцией в теле класса.


Теперь снова компилируем файл ... Indicators\MarketBookArticle\MarketBook.mq5 - ошибок нет и запускаем: стакан работает.

 
Lucas:
Весь код, когда я копирую и вставляю его для компиляции, выдает ошибку при компиляции. Кто-нибудь знает решение?

Лукас, если ошибка связана с неожиданной лексемой в классе CMBookBtn, то вызов функции CMBookBtn::Event должен предваряться void.


Именно так мы и поступили на данный момент.

 
Vladimir Karputov, огромное спасибо за такой обстоятельный ответ!
 

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

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

Не могли бы вы помочь мне решить эту проблему?

 
Вот с какой ошибкой я столкнулся. Можете ли вы мне помочь?
Файлы:
Error.jpg  365 kb
 

Здравствуйте.

Подскажите пожалуйста, можно ли в классе MarketBook.mqh фиксировать - запоминать время найденного индекса ?

void Calculation(void)
   {
      // FOR ASK SIDE
      int begin = (int)m_book.InfoGetInteger(MBOOK_LAST_ASK_INDEX);
      int end = (int)m_book.InfoGetInteger(MBOOK_BEST_ASK_INDEX);
      //m_ask_best_index
      for(int i = begin; i <= end && begin !=-1; i++)
      {
         if(m_book.MarketBook[i].volume > m_max_ask_volume)
         {
            m_max_ask_index = i;
            m_max_ask_volume = m_book.MarketBook[i].volume;
         }
         m_sum_ask_volume += m_book.MarketBook[i].volume;
      }
      // FOR BID SIDE
      begin = (int)m_book.InfoGetInteger(MBOOK_BEST_BID_INDEX);
      end = (int)m_book.InfoGetInteger(MBOOK_LAST_BID_INDEX);
      for(int i = begin; i <= end && begin != -1; i++)
      {
         if(m_book.MarketBook[i].volume > m_max_bid_volume)
         {
            m_max_bid_index = i;
            m_max_bid_volume = m_book.MarketBook[i].volume;
         }
         m_sum_bid_volume += m_book.MarketBook[i].volume;
      }
      m_calculation = true;
   }

В данном методе мы находим индекс цены на котором стоит максимальный объем по стороне Аск и Бид.

Хочу еще знать еще  в какое терминальное время мы получили данный индекс.


Структура стакана

struct MqlBookInfo 
  { 
   ENUM_BOOK_TYPE   type;            // тип заявки из перечисления ENUM_BOOK_TYPE 
   double           price;           // цена 
   long             volume;          // объем 
   double           volume_real;     // объем с повышенной точностью 
  };


Дает нам 4 параметра, но в ней нет времени.


Кто может направить в русло как запомнить время найденного индекса

 
Konstantin Seredkin:

Здравствуйте.

Подскажите пожалуйста, можно ли в классе MarketBook.mqh фиксировать - запоминать время найденного индекса ?

В данном методе мы находим индекс цены на котором стоит максимальный объем по стороне Аск и Бид.

Хочу еще знать еще  в какое терминальное время мы получили данный индекс.


Структура стакана


Дает нам 4 параметра, но в ней нет времени.


Кто может направить в русло как запомнить время найденного индекса

наследуй структуру и добавь в нее дополнительное поле в которое при заполнении будешь добавлять время тика

 
Konstantin Seredkin:

Здравствуйте.

Подскажите пожалуйста, можно ли в классе MarketBook.mqh фиксировать - запоминать время найденного индекса ?

В данном методе мы находим индекс цены на котором стоит максимальный объем по стороне Аск и Бид.

Хочу еще знать еще  в какое терминальное время мы получили данный индекс.

Структура стакана

Дает нам 4 параметра, но в ней нет времени.

Кто может направить в русло как запомнить время найденного индекса

Времени нет, потому что время прихода котировки в MQL5 узнать нельзя. Максимум что можно сделать это запоминать время в момент прихода события OnBookEvent, вот его и запоминайте. Запоминать время нахождения вершин стакана также бессмысленно, Вам нужно время прихода стакана цен, а не время нахождения его макс. индекса.