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

 
Konstantin:

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

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

Но при использовании данного метода,

if(!MarketBookRelease(Symbol()))
   {
   if(Debug){Print("Error MarketBookRelease ",m_symbol.Name());}}

у меня вылетает такая ошибка


P|S  разобрался в чем дело, получается если в диструкторе класса этот метод используется, то в OnDeinit  это использовать не нужно.


Снимаю свой вопрос, мне можно дать конфетку.

 
Konstantin Seredkin:

Если же деструктор не использовать в классе

То данная конструкция отрабатывается нормально

Хотя может я просто не умею пользоваться деструктором, или как вариант он реализован криво и по этому не работает как нужно.

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

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

ps.

Konstantin Seredkin:

Как раз я это всегда и делаю

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

с таким объектом CMarketBook MarketBook.mqh компилятор разве скомпилил бы код? ну хорошо, ты создал объект MarketBook.mqh, компилятор пропустил это святотатство, но ты работаешь с объектом MarketBook, у тебя на этапе OnInit возникла бы ошибка, т.к. такого объекта у тебя не было создано, я на это сразу и обратил внимание т.к. пример явно не рабочий, в связи с чем и задал тебе вопрос, но ты добросовестно спихнул все на разработчика класса и на его пример...

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

Использование аналитических объектов - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
Использование аналитических объектов - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
  • www.metatrader5.com
Определение трендов, построение каналов, выявление циклов и уровней поддержки/сопротивления — все эти и многие другие задачи решаются при помощи аналитических объектов. Всего в торговой платформе доступно 46 таких инструментов. Среди них имеются геометрические фигуры, различные каналы, инструменты Ганна, Фибоначчи, Эллиотта и многое другое. В...
 
Konstantin:

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

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

ps.

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

с таким объектом CMarketBook MarketBook.mqh компилятор разве скомпилил бы код? ну хорошо, ты создал объект MarketBook.mqh, компилятор пропустил это святотатство, но ты работаешь с объектом MarketBook, у тебя на этапе OnInit возникла бы ошибка, т.к. такого объекта у тебя не было создано, я на это сразу и обратил внимание т.к. пример явно не рабочий, в связи с чем и задал тебе вопрос, но ты добросовестно спихнул все на разработчика класса...

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

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

Вопрос стоял совершенно в другом.

У него в примере есть инициализация - вызов стакана, далее есть его обновление через метод Refresh()  но нет его удаления через

MarketBookRelease

//+------------------------------------------------------------------+
//|                                                   MarketBook.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
#include "GlobalMarketBook.mqh"
#include "MBookBtn.mqh"
#include "EventNewTick.mqh"

CMBookBtn MButton;
CEventNewTick EventNewTick;
double fake_buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   MarketBook.SetMarketBookSymbol(Symbol());
//--- indicator buffers mapping
   SetIndexBuffer(0,fake_buffer,INDICATOR_CALCULATIONS);
// В случае, если пользователь изменил график на котором запущена панель,
// необходимо скрыть, а затем заново переоткрыть панель. 
   MButton.Hide();
   MButton.Show();
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| MarketBook change event                                          |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   if(symbol!=MarketBook.GetMarketBookSymbol())
      return;
   MarketBook.Refresh();
   MButton.Refresh();
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Chart events                                                     |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // идентификатор события  
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                  )
  {
   MButton.Event(id,lparam,dparam,sparam);
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Deinit                                                           |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   MButton.Hide();
   if(!MarketBookRelease(Symbol()))
   {
   Print("Error MarketBookRelease ",Symbol());}
  }
//+------------------------------------------------------------------+

в OnDeinit или же реализации этого же, но в деструкторе класса. 

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

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

Выше в коде добавил желтым цветом то что по моему мнению должно присутствовать в прилагаемом индикаторе.

 
Konstantin Seredkin:

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

Вопрос стоял совершенно в другом.

У него в примере есть инициализация - вызов стакана, далее есть его обновление через метод Refresh()  но нет его удаления через

в OnDeinit или же реализации этого же, но в деструкторе класса. 

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

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

Выше в коде добавил желтым цветом то что по моему мнению должно присутствовать в прилагаемом индикаторе.

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

 
Konstantin:

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

- Во первых, ни какой проблемы вообще не было в моем вопросе.

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

В справке сказано:

Деструктор — это специальная функция, которая вызывается автоматически при уничтожении объекта класса. Имя деструктора записывается как имя класса с тильдой (~). Строки, динамические массивы и объекты, требующие деинициализации, в любом случае будут деинициализированы независимо от наличия деструктора. При наличии деструктора, эти действия будут произведены после вызова деструктора.

В классе деструктора нет который бы закрыл стакан цен методом

MarketBookRelease

Так же в самом индикаторе в

void OnDeinit(const int reason)

так же этого нет, был задан простейший вопрос  - А как правильно сделать де инициализацию стакана

На данный вопрос я ожидал ответа,

- не чего не выдумывай, класс сам все закроет, даже если в нем не объявлен деструктор.

- Добавь 

void OnDeinit(const int reason)
  {
   if(!MarketBookRelease(Symbol()))
   {Print("Error MarketBookRelease ",Symbol());}
  }

Или добавь в сам класс Деструктор

public:
    ~CMarketBook(void);
//--
//--

CMarketBook::~CMarketBook(void)
{
   if(!MarketBookRelease(m_symbol)){
   printf(__FUNCTION__ + "Error MarketBookRelease ",m_symbol);} 
}

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

 

В новых билдах терминала  (примерно с версии 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 - ошибок нет и запускаем: стакан работает.

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

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

Подскажите пожалуйста, можно ли в классе 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 параметра, но в ней нет времени.


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

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

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