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

 
Konstantin Seredkin:

А слова которые я написал в своем вопросе не о чем не говорят ?

Ваш пример

Этот код опубликован автором темы в описании класса https://www.mql5.com/ru/articles/3336

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

мне эти слова вообще ни о чем не говорят кроме одного - код примера тобой не изучен

ты приводишь пример удаления через

m_book_market.SetMarketBookSymbol(Symbol())

если открыть этот метод, то увидим там подписку на передаваемый тикер

bool CMarketDepth::SetMarketBookSymbol(string symbol) {
   m_sell_deals = 0;
   m_buy_deals  = 0;
   ArrayResize(market_book, 0);
   m_available = false;
   m_best_ask_index = -1;
   m_best_bid_index = -1;
   m_depth_total = 0;

   bool _selelect = SymbolSelect(symbol, true);
   if(_selelect)
      m_symbol = symbol;
   else {
      if(!SymbolSelect(m_symbol, true) && SymbolSelect(Symbol(),true))
         m_symbol = Symbol();
   }

   if(_selelect)
      if(!MarketBookAdd(m_symbol))
         printf("%s - %d: [ %s ] не возможно открыть стакан!!!", __FUNCTION__, __LINE__, m_symbol);

   this.Refresh();
//---
   return _selelect;
}

но ни как не удаление подписки )) удаление подписки производится через функцию:

MarketBookRelease

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

bool  MarketBookRelease(
   string  symbol      // имя символа
   );

Параметры

symbol

[in]  Имя символа.

Возвращаемое значение

Значение true в случае успешного закрытия, иначе false.

Примечание

Обычно эта функция должна вызываться из функции OnDeinit() в том случае, если в функции OnInit() была вызвана соответствующая функция MarketBookAdd(). Либо должна вызываться из деструктора класса, если в конструкторе этого класса вызывается соответствующая функция MarketBookAdd().
 
TheXpert:

Копипаста наверное. Бывает. Автор скорее всего писал этот код частично прямо в браузере.

Вместо 

CMarketBook MarketBook.mqh

напишите 

CMarketBook MarketBook;

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

 
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);} 
}

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

 
Отлично! Великолепно ! Отличная работа!
 

Спасибо, отличный инструмент, очень легко модифицировать.

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