Diskussion zum Artikel "Wir schreiben eine Scalping-Markttiefe aufgrund der graphischen Bibliothek CGraphic" - Seite 3

 
Konstantin Seredkin:

Bedeutet das, was ich in meiner Frage geschrieben habe, nichts?

Ihr Beispiel

Dieser Code ist vom Autor des Themas in der Beschreibung der Klasse https://www.mql5.com/de/articles/3336 veröffentlicht .

Also sollte diese Frage zumindest nicht an mich gerichtet sein...

Diese Worte bedeuten für mich nichts, außer einer Sache - Sie haben den Code des Beispiels nicht studiert.

Sie geben ein Beispiel für die Löschung durch

m_book_market.SetMarketBookSymbol(Symbol())

Wenn wir diese Methode öffnen, werden wir dort ein Abonnement des übergebenen Tickers sehen.

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 ] kann das Glas nicht öffnen!!!", __FUNCTION__, __LINE__, m_symbol);

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

aber nicht die Löschung des Abonnements )) Die Löschung des Abonnements erfolgt über eine Funktion:

MarketBookRelease

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

bool  MarketBookRelease(
   string  symbol      // Zeichenname
   );

Параметры

symbol

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

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

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

Примечание

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

Muss Copypasta sein. Das kommt vor. Der Autor hat diesen Code wahrscheinlich teilweise im Browser geschrieben.

Anstelle von

CMarketBook MarketBook.mqh

schreiben

CMarketBook MarketBook;

es war eine Fangfrage für deinen Namensvetter )) er liest nicht gerne Code, sondern wartet auf eine fertige Antwort ))

 
Konstantin:

es war eine Fangfrage für meinen Namensvetter )) er liest nicht gerne Code, sondern wartet auf eine fertige Antwort ))

Das ist genau das, was ich immer mache, und anfangs habe ich das Entfernen des Glases so gemacht, wie es sein sollte, wie in deinem Beispiel, das eigentlich erforderlich ist, wenn man mit dem Glas aus der Hilfe arbeitet.

Aber wenn ich diese Methode verwende,

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

bekomme ich diese Fehlermeldung


P|S hat herausgefunden, was das Problem ist, es stellt sich heraus, dass wenn diese Methode im Klassenkonstruktor verwendet wird, es nicht notwendig ist, sie in OnDeinit zu verwenden.


Ich ziehe meine Frage zurück, Sie können mir ein Bonbon geben.

 
Konstantin Seredkin:

Wenn Sie keinen Destruktor in einer Klasse verwenden

Dieses Konstrukt funktioniert normal

Aber vielleicht weiß ich einfach nicht, wie man den Destruktor benutzt, oder vielleicht ist er auf eine krumme Art und Weise implementiert und funktioniert deshalb nicht so, wie er sollte.

Die Subskriptionsfunktion ist eine Broadcast-Funktion, die garantiert alle Subskriptionen in OnDeinit löscht. Wenn Sie zu viele Objekte in Ihrem Code haben und es Verzögerungen bei deren Löschung gibt, kann es sein, dass nicht genug Zeit für die OnDeinit-Verarbeitung zur Verfügung steht, was bedeutet, dass einige Objekte nicht gelöscht werden.

In diesem Fall können Sie entweder nach einem Problem im Code suchen, was korrekter ist, weil es offensichtlich ein Problem gibt und es Ihnen eines Tages in den Fuß schießen wird, oder Sie löschen sie einfach in OnDeinit und vergessen es.

ps.

Konstantin Seredkin:

Das mache ich auch immer so.

Du hast offensichtlich das Beispiel nicht analysiert, oder du hast von Anfang an einen krummen Code reingeschoben, wie, nimm es auseinander, und ich werde lachen ))

Mit einem solchen Objekt CMarketBook MarketBook.mqh würde der Compiler den Code kompilieren? Nun, du hast ein Objekt MarketBook.mqh erstellt, der Compiler hat dieses Sakrileg übersehen, aber du arbeitest mit einem Objekt MarketBook, du hättest einen Fehler in der Phase OnInit, weil du kein solches Objekt hast.Ich bin sofort darauf aufmerksam geworden, weil das Beispiel offensichtlich nicht funktioniert, also habe ich Ihnen eine Frage gestellt, aber Sie haben pflichtbewusst alles auf den Klassenentwickler und sein Beispiel geschoben....

Entweder Sie liefern ein funktionierendes Code-Beispiel, in dem dieser Fehler reproduziert wird, oder Sie erklären alles auf einmal ohne unnötigen Code, wie Sie es jetzt getan haben, dann sparen Sie auch Ihre Zeit.

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

Die Subskriptionsfunktion ist eine Broadcast-Funktion, die garantiert alle Subskriptionen in OnDeinit löscht. Wenn Sie zu viele Objekte in Ihrem Code haben und es Verzögerungen bei deren Löschung gibt, kann es sein, dass nicht genügend Zeit für die OnDeinit-Verarbeitung zur Verfügung steht, was bedeutet, dass einige Objekte nicht gelöscht werden.

In diesem Fall können Sie entweder nach einem Problem im Code suchen, was korrekter ist, da es offensichtlich ein Problem gibt und es Ihnen eines Tages in den Fuß schießen wird, oder Sie löschen sie einfach in OnDeinit und vergessen es.

ps.

du hast das Beispiel offensichtlich nicht geparst oder von Anfang an einen krummen Code eingebaut, also kannst du es selbst herausfinden, und ich werde lachen ))

Mit einem solchen Objekt CMarketBook MarketBook.mqh würde der Compiler den Code kompilieren? Nun, du hast ein Objekt MarketBook.mqh erstellt, der Compiler hat dieses Sakrileg übersehen, aber du arbeitest mit dem Objekt MarketBook, du hättest einen Fehler in der Phase OnInit, weil du ein solches Objekt nicht erstellt hast, ich habe es dir sofort gegeben.Ich habe sofort darauf geachtet, weil das Beispiel offensichtlich nicht funktioniert, also habe ich dir eine Frage gestellt, aber du hast pflichtbewusst alles auf den Entwickler der Klasse.... abgeladen.

Du solltest entweder ein funktionierendes Code-Beispiel liefern, wo dieser Fehler reproduziert wird, oder alles auf einmal ohne unnötigen Code erklären, wie du es jetzt getan hast, dann sparst du auch deine Zeit.

Sie sind einfach in Ihrem Repertoire, es ist mir egal, was der Autor in dem Beispiel gemacht hat, welche Druckfehler er gemacht hat, man muss schon ein kompletter Idiot sein, um nicht zu erkennen, dass es nur ein Druckfehler ist.

Die Frage war eine ganz andere.

In seinem Beispiel gibt es eine Initialisierung - Aufruf des Glases, dann gibt es seine Aktualisierung durch die Methode Refresh(), aber es gibt keine Löschung durch die Methode

MarketBookRelease

//+------------------------------------------------------------------+
//|MarktBuch.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[];
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+
int OnInit()
  {
   MarketBook.SetMarketBookSymbol(Symbol());
//--- Zuordnung von Indikatorpuffern
   SetIndexBuffer(0,fake_buffer,INDICATOR_CALCULATIONS);
// Für den Fall, dass der Benutzer das Diagramm, auf dem das Panel läuft, geändert hat,
// Sie müssen das Bedienfeld ausblenden und dann wieder öffnen. 
   MButton.Hide();
   MButton.Show();
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Marktbuch-Änderungsereignis|
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   if(symbol!=MarketBook.GetMarketBookSymbol())
      return;
   MarketBook.Refresh();
   MButton.Refresh();
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Chart-Ereignisse|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // Kennung des Ereignisses 
                  const long& lparam,   // Ereignisparameter vom Typ long
                  const double& dparam, // Ereignisparameter vom Typ Double
                  const string& sparam  // Ereignisparameter vom Typ String
                  )
  {
   MButton.Event(id,lparam,dparam,sparam);
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iterationsfunktion |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
//--- Rückgabewert von prev_calculated für den nächsten Aufruf
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Deinit|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   MButton.Hide();
   if(!MarketBookRelease(Symbol()))
   {
   Print("Error MarketBookRelease ",Symbol());}
  }
//+------------------------------------------------------------------+

OnDeinit oder die Implementierung desselben, sondern im Destruktor der Klasse.

Deshalb habe ich dem Autor eine Frage gestellt, inwiefern es seiner Meinung nach korrekter ist, das Glas mit seiner Klasse zu löschen, weil diese Arbeit im Hauptbeispiel und in der Klasse selbst fehlt und es gut wäre, sie vorher zu implementieren, ich sage nicht, dass es etwas Schlechtes gibt usw., nur dieser Punkt fehlt, so scheint es mir.

Die Frage wurde an den Autor gestellt und ganz normal formuliert, warum soll ich seitenlang über meine Fragen und Demagogie diskutieren, was ich gelesen habe, was ich von jemandem haben will, usw. Ich selbst bin in der Lage, alles in meinem Code zu verstehen, was tatsächlich gemacht wird... Die Frage war eine ganz andere.

Oben im Code habe ich in gelber Farbe hinzugefügt, was meiner Meinung nach im angehängten Indikator vorhanden sein sollte.

 
Konstantin Seredkin:

Es ist mir egal, was der Autor in dem Beispiel gemacht hat, welche Druckfehler er gemacht hat, man muss schon ein kompletter Idiot sein, um nicht zu erkennen, dass es sich nur um einen Tippfehler handelt.

Die Frage war eine ganz andere.

In seinem Beispiel gibt es eine Initialisierung - einen Aufruf des Glases, dann gibt es seine Aktualisierung durch die Methode Refresh(), aber es gibt keine Löschung durch die Methode

OnDeinit oder die Implementierung desselben, sondern im Destruktor der Klasse.

Deshalb habe ich dem Autor die Frage gestellt, inwiefern es seiner Meinung nach korrekter ist, das Glas mit seiner Klasse zu löschen, weil diese Arbeit in seinem Hauptbeispiel und in der Klasse selbst fehlt und es gut wäre, sie vorher zu implementieren, ich sage nicht, dass es etwas Schlechtes gibt, etc.

Die Frage wurde an den Autor gestellt und normal formuliert, warum soll ich seitenlang über meine Fragen und Demagogie diskutieren, was ich gelesen habe, was ich von jemandem haben will, usw. Ich selbst bin in der Lage, alles in meinem Code zu verstehen, was tatsächlich gemacht wird... die Frage war eine ganz andere

Oben im Code wurde in gelber Farbe hinzugefügt, was meiner Meinung nach im angehängten Indikator vorhanden sein sollte.

es gibt hier keine Telepathen, das Beispiel, das Sie in der ursprünglichen Frage gegeben haben, reproduziert nicht das Problem, über das Sie schreiben, außerdem sind alle Mechanismen in der Klasse vorhanden, die Lösung ist Ihnen gegeben, aber ich sehe nichts als Vorwürfe, der Disput ist geschlossen.

 
Konstantin:

Es gibt hier keine Telepathen, das Beispiel, das Sie in Ihrer ursprünglichen Frage gegeben haben, reproduziert nicht das Problem, über das Sie schreiben, außerdem sind alle Mechanismen in der Klasse vorhanden, die Lösung wird Ihnen gegeben, aber ich sehe nichts als Vorwürfe, der Disput ist beendet.

- Erstens gab es in meiner Frage überhaupt kein Problem.

- Zweitens habe ich niemandem irgendetwas vorgeworfen, ich habe nur eine einfache Frage an den Autor gestellt, um meine Vermutungen zu klären... und von Ihnen in jeder Nachricht einige lächerliche Anschuldigungen und Fragen über den Code, in meine Richtung, den ich gar nicht geschrieben habe, sondern aus der Artikelbeschreibung der Klasse als Beispiel genommen habe.

In der Hilfe steht:

Destruktor ist eine spezielle Funktion, die automatisch aufgerufen wird, wenn ein Objekt einer Klasse zerstört wird. Der Name des Destruktors wird wie der Klassenname mit einer Tilde (~) geschrieben. Strings, dynamische Arrays und Objekte, die eine Deinitialisierung erfordern, werden in jedem Fall deinitialisiert, unabhängig vom Vorhandensein eines Destruktors. Wenn ein Destruktor vorhanden ist, werden diese Aktionen nach dem Aufruf des Destruktors durchgeführt.

Es gibt keinen Destruktor in der Klasse, der das Preisglas durch die Methode schließen würde

MarketBookRelease

Auch im Indikator selbst in

void OnDeinit(const int reason)

ebenfalls nicht vorhanden ist, wurde mir eine einfache Frage gestellt - wie man die Deinitialisierung des Glases korrekt vornimmt.

Ich erwartete eine Antwort auf diese Frage,

- Erfinden Sie nichts, die Klasse selbst wird alles schließen, auch wenn kein Destruktor in ihr deklariert ist.

- Hinzufügen

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

Oder fügen Sie einen Destruktor in die Klasse selbst ein.

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

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

Und du wirst glücklich sein... und du hast eine Dimagogie begonnen, in der du mich beschuldigst, dass ich einige Druckfehler im Code eines anderen gemacht habe, dass er nicht kompilierbar ist, was ich auch ohne dich weiß, dass ich etwas nicht lesen kann.... auf Russisch, du hast mich als Rehe angemeldet.

 
Perfekt! Großartig  Perfekt! Großartige Arbeit!
 
MetaQuotes Software Corp.:

Der neue Artikel Implementing a Scalping Market Depth Using the CGraphic Library wurde veröffentlicht:

Autor: Vasiliy Sokolov

Vielen Dank, das ist ein großartiges Tool, das sehr leicht zu modifizieren ist.

 
Wenn ich den gesamten Code kopiere und einfüge, um ihn zu kompilieren, tritt beim Kompilieren ein Fehler auf. Kennt jemand eine Lösung?