Discusión sobre el artículo "Cómo escribir una profundidad de mercado de scalping usando como base la biblioteca CGraphic" - página 3

 
Konstantin Seredkin:

¿Las palabras que escribí en mi pregunta no significan nada?

Tu ejemplo

Este código está publicado por el autor del tema en la descripción de la clase https://www.mql5.com/es/articles/3336.

Así que esta pregunta no debería estar dirigida a mí al menos...

Estas palabras no significan nada para mi excepto una cosa - no has estudiado el código del ejemplo.

usted da un ejemplo de eliminación a través de

m_book_market.SetMarketBookSymbol(Symbol())

Si abrimos este método, veremos allí una suscripción al ticker pasado.

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 ] ¡¡¡No se puede abrir el cristal!!!", __FUNCTION__, __LINE__, m_symbol);

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

pero no el borrado de la suscripción )) el borrado de la suscripción se hace a través de una función:

MarketBookRelease

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

bool  MarketBookRelease(
   string  symbol      // nombre del personaje
   );

Параметры

symbol

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

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

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

Примечание

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

Debe ser copypasta. Ocurre. El autor probablemente escribió este código parcialmente en el navegador.

En lugar de

CMarketBook MarketBook.mqh

escriba

CMarketBook MarketBook;

era una pregunta capciosa para su tocayo )) no le gusta leer código, pero espera una respuesta lista ))

 
Konstantin:

era una pregunta capciosa para mi tocayo )) no le gusta leer código, pero espera una respuesta lista ))

Eso es exactamente lo que siempre hago, e inicialmente hice la eliminación de la copa como debe ser, como en su ejemplo, que en realidad se requiere cuando se trabaja con el vidrio de la ayuda.

Pero cuando utilizo este método,

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

Me sale este error


P|S he averiguado cual es el problema, resulta que si este método se utiliza en el constructor de la clase, no es necesario utilizarlo en OnDeinit.


Retiro mi pregunta, me podeis dar un caramelito.

 
Konstantin Seredkin:

Si no utiliza un destructor en una clase

Esta construcción funciona normalmente

Pero puede que no sepa usar el destructor, o puede que esté implementado de forma torcida y por tanto no funcione como debería.

La función de suscripción es broadcast, está garantizado que borrará todas las suscripciones en OnDeinit, si tienes demasiados objetos en tu código y hay retrasos en su borrado, puede que no haya suficiente tiempo asignado para el procesamiento de OnDeinit, lo que significa que algunos objetos no serán borrados.

Aquí puedes buscar un problema en el código, que es lo más correcto, porque obviamente hay un problema y te disparará en el pie algún día, o simplemente borrarlos en OnDeinit y olvidarte de ello.

ps.

Konstantin Seredkin:

Eso es lo que yo hago siempre.

Obviamente no has parseado el ejemplo, o has colado un código torcido desde el principio, como, desmóntalo y me echaré unas risas ))

¿Con tal objeto CMarketBook MarketBook.mqh el compilador compilaría el código? Bueno, creaste un objeto MarketBook.mqh, el compilador pasó por alto este sacrilegio, pero estás trabajando con un objeto MarketBook, tendrías un error en la etapa OnInit, porque no tenías tal objeto.Le presté atención de inmediato porque el ejemplo obviamente no funciona, así que te hice una pregunta, pero obedientemente culpaste de todo al desarrollador de la clase y su ejemplo....

o pones un ejemplo de código que funcione donde se reproduzca este error o lo explicas todo de una vez sin códigos innecesarios, como has hecho ahora, te ahorrarás también tu tiempo.

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

La función de suscripción es de difusión, está garantizado para eliminar todas las suscripciones en OnDeinit, si usted tiene demasiados objetos en su código y hay retrasos en su eliminación, puede que no haya suficiente tiempo asignado para el procesamiento OnDeinit, lo que significa que algunos objetos no serán eliminados.

Aquí puedes buscar un problema en el código, que es lo más correcto, porque obviamente hay un problema y te disparará en el pie algún día, o simplemente borrarlos en OnDeinit y olvidarte de ello.

ps.

obviamente no has parseado el ejemplo, o se te ha colado un código torcido desde el principio, así que podéis averiguarlo vosotros mismos, y yo me echaré unas risas ))

¿Con tal objeto CMarketBook MarketBook.mqh el compilador compilaría el código? Bien, has creado un objeto MarketBook.mqh, el compilador pasó por alto este sacrilegio, pero estás trabajando con el objeto MarketBook, tendrías un error en la etapa OnInit, porque no has creado tal objeto, te lo di inmediatamente.Le presté atención a la vez porque el ejemplo es, obviamente, no funciona, así que te hice una pregunta, pero usted obedientemente volcado todo en el desarrollador de la clase....

Deberías aportar un ejemplo de código que funcione donde se reproduzca este error o explicarlo todo de una vez sin códigos innecesarios como has hecho ahora, te ahorrarás tiempo también.

Sólo estás en tu repertorio, me da igual lo que haya hecho el autor en el ejemplo, las erratas que haya cometido, hay que ser un completo idiota para no darse cuenta de que es sólo una errata.

La pregunta era completamente diferente.

En su ejemplo hay inicialización - llamada del cristal, luego hay su actualización a través del método Refresh(), pero no hay su borrado a través del método

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[];
//+------------------------------------------------------------------+
//| Función de inicialización del indicador personalizada |
//+------------------------------------------------------------------+
int OnInit()
  {
   MarketBook.SetMarketBookSymbol(Symbol());
//--- asignación de búferes indicadores
   SetIndexBuffer(0,fake_buffer,INDICATOR_CALCULATIONS);
// En caso de que el usuario haya cambiado el gráfico en el que se está ejecutando el panel,
// es necesario ocultar y volver a abrir el panel. 
   MButton.Hide();
   MButton.Show();
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Evento de cambio de MarketBook|
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   if(symbol!=MarketBook.GetMarketBookSymbol())
      return;
   MarketBook.Refresh();
   MButton.Refresh();
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Eventos del gráfico|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // identificador del evento 
                  const long& lparam,   // parámetro de evento de tipo long
                  const double& dparam, // parámetro de evento de tipo doble
                  const string& sparam  // parámetro de evento de tipo cadena
                  )
  {
   MButton.Event(id,lparam,dparam,sparam);
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizada |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
//--- valor de retorno de prev_calculado para la siguiente llamada
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Deinit|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   MButton.Hide();
   if(!MarketBookRelease(Symbol()))
   {
   Print("Error MarketBookRelease ",Symbol());}
  }
//+------------------------------------------------------------------+

OnDeinit o implementación del mismo, sino en el destructor de la clase.

Por eso le hice una pregunta al autor, como es más correcto en su opinión matar el vaso usando su clase porque falta este trabajo en el ejemplo principal y en la propia clase y sería bueno implementarlo antes, no digo que haya algo malo, etc solo falta este punto me parece.

La pregunta fue hecha al autor y normalmente formulada, ¿por qué preguntar y discutir mis preguntas y demagogia durante varias páginas sobre lo que leo, lo que quiero conseguir de alguien, etc. Yo mismo soy capaz de entender todo en mi código, que se hace en realidad ... La pregunta era muy diferente.

Arriba en el código he añadido en color amarillo lo que en mi opinión debería estar presente en el indicador adjunto.

 
Konstantin Seredkin:

Sólo estás en tu repertorio, me da igual lo que haya hecho el autor en el ejemplo, las erratas que haya cometido, hay que ser un completo idiota para no darse cuenta de que sólo es una errata.

La pregunta era completamente diferente.

En su ejemplo, hay inicialización - llamada del vaso, luego hay su actualización a través del método Refresh(), pero no hay su eliminación a través del método

OnDeinit o implementación del mismo, sino en el destructor de la clase.

Por eso le hice una pregunta al autor, como es más correcto en su opinión matar el vaso usando su clase porque falta este trabajo en su ejemplo principal y en la propia clase y sería bueno implementarlo antes, no digo que haya algo malo, etc solo falta este punto me parece.

La pregunta fue hecha al autor y normalmente formulada, ¿por qué preguntar y discutir mis preguntas y demagogia durante varias páginas sobre lo que leo, lo que quiero obtener de alguien, etc. Yo mismo soy capaz de entender todo en mi código, que se hace en realidad ... la pregunta era completamente diferente

Arriba en el código añadido en color amarillo lo que en mi opinión debería estar presente en el indicador adjunto.

aqui no hay telepatas, el ejemplo que pusiste en la pregunta original no reproduce el problema del que escribes, ademas todos los mecanismos estan presentes en la clase, la solucion te la doy yo, pero no veo mas que reproches, la disputa esta cerrada.

 
Konstantin:

Aquí no hay telépatas, el ejemplo que pusiste en tu pregunta original no reproduce el problema del que escribes, además, todos los mecanismos están presentes en la clase, la solución te la dan, pero no veo más que reproches, la disputa está cerrada.

- En primer lugar, no había ningún problema en mi pregunta.

- En segundo lugar, yo no reproché nada a nadie, sólo hice una simple pregunta al autor para aclarar mis conjeturas... y de ti en cada mensaje unas ridículas acusaciones y preguntas sobre el código, en mi dirección, que yo no escribí en absoluto, sino que tomé de la descripción del artículo de la clase como ejemplo.

La ayuda dice:

El destructor es una función especial que se llama automáticamente cuando se destruye un objeto de una clase. El nombre del destructor se escribe como el nombre de la clase con una tilde (~). Las cadenas, las matrices dinámicas y los objetos que requieren desinicialización se desinicializarán de todos modos, independientemente de la presencia de un destructor. Si hay un destructor, estas acciones se realizarán después de llamar al destructor.

No hay destructor en la clase que cerraría el cristal de precios por el método

MarketBookRelease

Además en el propio indicador en

void OnDeinit(const int reason)

tampoco está presente, me hicieron una simple pregunta - Cómo realizar correctamente la desinicialización del vaso.

Esperaba una respuesta a esta pregunta,

- no inventar nada, la propia clase se cerrará todo, incluso si no hay destructor declarado en ella.

- Añade

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

O añade un destructor a la propia clase.

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

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

Y serás feliz... y empezaste una dimagogia acusándome de unas erratas en código ajeno, que no compilará, cosa que sé sin ti, que no puedo leer algo allí.... en ruso, me apuntaste como a un ciervo.

 
Perfecto ¡Genial  Perfecto ! ¡Gran trabajo!
 
MetaQuotes Software Corp.:

Nuevo artículo Implementando una Profundidad de Mercado Scalping Usando la Librería CGraphic ha sido publicado:

Autor: Vasiliy Sokolov

Gracias, es una gran herramienta, muy fácil de modificar.

 
Todo el código, cuando lo copio y pego para compilar, da error al compilar. ¿Alguien sabe alguna solución?