Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil IV)."

 

Neuer Artikel Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil IV). :

In den vorherigen Artikeln haben wir begonnen, eine große plattformübergreifende Bibliothek zu erstellen, die die Entwicklung von Programmen für MetaTrader 5 und MetaTrader 4 Plattformen vereinfacht. Wir verfügen bereits über Sammlungen historischer Orders und Deals, Market Orders und Positionen sowie über die Klasse zur komfortablen Auswahl und Sortierung der Aufträge. In diesem Teil werden wir die Entwicklung des Basisobjekts fortsetzen und die Engine Library lehren, Handelsereignisse auf dem Konto zu verfolgen.

Lassen Sie uns den EA im Tester starten und die Schaltflächen ausprobieren:

Alles ist korrekt aktiviert, und das Journal erhält Meldungen über die auftretenden Ereignisse.

Derzeit ist das allerletzte Ereignis immer fixiert. Mit anderen Worten, wenn wir mehrere Positionen gleichzeitig schließen, befindet sich nur die letzte von allen geschlossenen Positionen im Ereignis. Das Schließen von allem kann anhand der Anzahl der neuen Geschäfte oder Aufträge in der Geschichte verfolgt werden. Es ist dann möglich, die Liste aller neu geschlossenen Positionen nach ihrer Anzahl zu erhalten und ihre gesamte Gruppe zu definieren. Lassen Sie uns dafür eine eigene Event-Klasse einer Collection entwickeln. Das ermöglicht es uns, einen ständigen Zugriff auf alle aufgetretenen Ereignisse im Programm.

Autor: Artyom Trishkin

 

Artyom Trishkin, ich danke Ihnen für Ihre Arbeit, es fühlt sich an wie eine leistungsfähige Bibliothek. Bitte, wenn es nicht schwierig ist - können Sie kurz angeben, welche Funktionalität Sie planen (bereits abgedeckt und für die Veröffentlichung vorbereitet), außer der Arbeit mit Aufträgen/Historie. Ich habe gerade damit begonnen, eine ähnliche Bibliothek auf der Grundlage einer Standardbibliothek zu schreiben, aber ich bin von der Seite der Funktionalität wie technische Analysewerkzeuge ausgegangen. Die Idee ist, alle Analyse-Tools, die in der klassischen TA und RA verwendet werden, in die Bibliothek zu schreiben und sie mit Indikator-Tools und anderen interoperabel zu machen. CExpertSignal.

Wenn Ihre Funktionalität das abdeckt, was ich geplant habe, dann sollte ich vielleicht die Option in Betracht ziehen, das weiterzuentwickeln, was Sie bereits geschrieben haben.

 
alex_all:

Artyom Trishkin, ich danke Ihnen für Ihre Arbeit, es fühlt sich an wie eine leistungsfähige Bibliothek. Bitte, wenn es nicht schwierig ist - können Sie kurz angeben, welche Funktionalität Sie planen (bereits abgedeckt und für die Veröffentlichung vorbereitet), außer der Arbeit mit Aufträgen/Historie. Ich habe gerade damit begonnen, eine ähnliche Bibliothek auf der Grundlage einer Standardbibliothek zu schreiben, aber ich bin von der Seite der Funktionalität wie technische Analysewerkzeuge ausgegangen. Die Idee ist, alle Analyse-Tools, die in der klassischen TA und RA verwendet werden, in die Bibliothek zu schreiben und sie mit Indikator-Tools und anderen interoperabel zu machen. CExpertSignal.

Wenn Ihre Funktionalität das abdeckt, was ich geplant habe, dann sollte ich vielleicht die Option in Betracht ziehen, das weiterzuentwickeln, was Sie bereits geschrieben haben.

Alles, was derzeit in den Artikeln beschrieben ist, ist erst der Anfang. Das Arbeiten mit Terminal-Order-Systemen wird sehr einfach sein. Dem Programm auf Anfrage fast alle Daten über jeden Auftrag, jedes Geschäft, jede Position, jedes Ereignis, das jemals stattgefunden hat, usw. zu geben. Das ist die Sache mit den Ordersystemen. Bis die Arbeit und die Veröffentlichung der Artikel über die Arbeit mit den Ordersystemen beider Terminals abgeschlossen und veröffentlicht ist, werden andere Funktionen nicht veröffentlicht - alles der Reihe nach.
Aber gemäß der festgelegten Struktur wird die Arbeit mit Kursdaten, die Arbeit mit Indikatoren, mit grafischen Objekten vorbereitet und veröffentlicht, es wird eine vollwertige grafische Hülle auf der Leinwand geben, die in die Struktur der Bibliothek gemäß dem ursprünglich festgelegten Paradigma integriert ist. D.h., es wird möglich sein, nur eine Bibliothek vollständig zu nutzen, ohne sie an andere Bibliotheken andocken zu müssen. Ein Beispiel: Abrufen von Daten durch Anklicken des Symbols einer offenen Position, eines erteilten Auftrags, Abrufen von Daten durch Anklicken eines Kursbalkens, Suchen von Daten in den vorhandenen Sammlungen, deren Verarbeitung usw.

Ich habe vor, den schnellen und bequemen Zugang so zu organisieren, dass der Benutzer nicht darüber nachdenken muss, wie er die benötigten Daten erhält, sondern sie nur anfordert und mit einer der zahlreichen Funktionen erhält, die vorbereitet werden; ihre vollständige Liste wird in den letzten Artikeln dieser Serie zusammengestellt und veröffentlicht.

Es gibt eine Menge Pläne und eine Menge Entwicklungen. Ich bin dabei, das Material vorzubereiten. Einschließlich Anfragen (von denen es noch keine gibt )

 
Artyom Trishkin:

Alles, was jetzt in den Artikeln beschrieben wird, ist erst der Anfang. Die Arbeit mit den Auftragssystemen der Terminals wird sehr einfach sein. Sie geben dem Programm auf Anfrage fast alle Daten über jeden Auftrag, jedes Geschäft, jede Position, jedes Ereignis, das jemals stattgefunden hat, usw. Das ist die Sache mit den Auftragssystemen. Bis die Arbeit und die Veröffentlichung der Artikel über die Arbeit mit den Ordersystemen beider Terminals abgeschlossen und veröffentlicht ist, werden andere Funktionen nicht veröffentlicht - alles der Reihe nach.
Aber gemäß der festgelegten Struktur wird die Arbeit mit Kursdaten, die Arbeit mit Indikatoren, mit grafischen Objekten vorbereitet und veröffentlicht, es wird eine vollwertige grafische Hülle auf der Leinwand geben, die in die Struktur der Bibliothek gemäß dem ursprünglich festgelegten Paradigma integriert ist. D.h., es wird möglich sein, nur eine Bibliothek vollständig zu nutzen, ohne sie an andere Bibliotheken andocken zu müssen. Ein Beispiel: Abrufen von Daten durch Anklicken des Symbols einer offenen Position, eines erteilten Auftrags, Abrufen von Daten durch Anklicken eines Kursbalkens, Suche nach bestimmten Daten in den vorhandenen Sammlungen, deren Verarbeitung usw.

Ich habe vor, den schnellen und bequemen Zugang so zu organisieren, dass der Benutzer nicht darüber nachdenken muss, wie er die gewünschten Daten erhält, sondern sie nur anfordert und mit einer der zahlreichen Funktionen abruft, die vorbereitet werden; ihre vollständige Liste wird in den letzten Artikeln dieser Serie zusammengestellt und veröffentlicht.

Es gibt eine Menge Pläne und eine Menge Entwicklungen. Ich bin dabei, das Material vorzubereiten. Einschließlich der Anfragen (die noch nicht verfügbar sind).

Das ist sehr interessant. Ich habe bereits zwei ähnliche Versionen der Bibliothek hier gesehen. Universal Expert Advisor und plattformübergreifende Bibliothek. Die erste ist nicht ganz plattformübergreifend. Und die zweite hat viele Nachteile, insbesondere fehlen ihr viele Funktionen, die plattformübergreifend sein sollten. Zum Beispiel die Eröffnungszeit oder der Eröffnungskurs einer Position/Order. Sie müssen die Makros der MQL-Version selbst verwenden und den Code separat schreiben. Aber es gibt viele interessante Dinge, insbesondere gefällt mir das Vorhandensein von mehreren Stopps, Trailing ist sehr leistungsfähig und anpassbar. MM interessante Optionen. Dies ist eine Reihe von Artikeln hier von einigen italienischen, ich denke, Sie bekommen die Idee. Wie auch immer, es ist interessant zu sehen, was Sie bekommen, und es wäre toll, wenn Sie die Erfahrung früherer ähnlicher Entwicklungen nutzen und das Beste nehmen. Danke!

 
leonerd:

Sehr interessant. Ich habe hier schon zwei ähnliche Versionen der Bibliothek gesehen. Universal Expert Advisor und Cross-platform Library. Die erste ist nicht wirklich plattformübergreifend. Und die zweite hat viele Nachteile, insbesondere das Fehlen vieler Funktionen, die plattformübergreifend sein würden. Zum Beispiel die Eröffnungszeit oder der Eröffnungskurs einer Position/Order. Sie müssen die Makros der MQL-Version selbst verwenden und den Code separat schreiben. Aber es gibt viele interessante Dinge, insbesondere gefällt mir das Vorhandensein von mehreren Stopps, Trailing ist sehr leistungsfähig und anpassbar. MM interessante Optionen. Dies ist eine Reihe von Artikeln hier von einigen italienischen, ich denke, Sie bekommen die Idee. Wie auch immer, es ist interessant zu sehen, was Sie bekommen, und es wäre toll, wenn Sie die Erfahrung früherer ähnlicher Entwicklungen nutzen und das Beste nehmen. Ich danke Ihnen.

Danke für die Meinung. Aber ich bin nicht in der Lage, Artikel zu lesen und nach dem zu suchen, was ich brauche, weil ich keine Zeit dafür habe, aber Wünsche für zukünftige Funktionen entgegenzunehmen, zu planen und in die Liste für die Umsetzung aufzunehmen, ist immer willkommen. Es gäbe Vorschläge. Bis jetzt mache ich das, was ursprünglich für die Implementierung geplant war.

 

Wird diese Bibliothek mit Börseninstrumenten auf Moex funktionieren?

Meiner Meinung nach sollte man die Bibliothek für die Arbeit mit Aufträgen nicht mit anderen Funktionen überfrachten, die nichts mit dem Geldmanagement zu tun haben, es ist besser, separate Bibliotheken zu erstellen.

Und ja, es fehlt eine detaillierte Beschreibung des Handbuchs der Bibliothek.

 
Aleksey Vyazmikin:

Funktioniert diese Bibliothek mit Stock-Instrumenten auf Moex?

Meiner Meinung nach sollte man die Bibliothek für die Arbeit mit Aufträgen nicht mit anderen Funktionen überladen, die nichts mit dem Geldmanagement zu tun haben; es ist besser, separate Bibliotheken zu erstellen.

Und ja, es fehlt eine detaillierte Beschreibung des Handbuchs der Bibliothek.

Tests werden es zeigen. Was bemerkt wird - wird behoben werden. Es wird eine Dokumentation für die Bibliothek geben. Aber nicht sofort.

 

Artem, über Wünsche - ich denke schon - wenn Sie irgendwelche Gedanken in Bezug auf die Wahl, welchen Weg in dieser oder jener Entscheidung zu gehen, was wichtig ist und was zu verwerfen, etc...,

dann kann man deren Formulierung in Form einer Umfrage o.ä. veröffentlichen, die Forumsmitglieder geben gerne Rückmeldung, was sie davon halten.

Aber jemandem etwas Bestimmtes zu wünschen, ohne alle Ideen des Projekts zu kennen, halte ich für verfehlt, denn Sie wissen ja, wie immer - auch eine bereits fertige und dokumentierte Bibliothek liest jeder anders und nimmt sich etwas Eigenes heraus, was für ihn gerade relevant ist.

Ich wünsche Ihnen also viel Erfolg und Entschlossenheit bei Ihrem Vorhaben! :)

 

Gelesen, compiliert, läuft !


Wenn ich Bewerten könnte 5 von 5 Sterne

Top Artyom

 
Christian:

Gelesen, compiliert, läuft !


Wenn ich Bewerten könnte 5 von 5 Sterne

Top Artyom

Danke
 

Artem, zuallererst. zuallererst. Ich möchte mich ganz herzlich für die Artikelserie und die Bibliothek bedanken. Ich habe alles über OOP verstanden, indem ich deine Artikel gelesen habe! Deine Artikel sind wirklich lehrreich und helfen denen, die es brauchen, sie haben mir geholfen. Ihre Verwendung verschiedener Algorithmen an denselben Stellen, an denen Sie sich nur wiederholen könnten, ist ebenfalls sehr gelungen.

Wenn ich nun zum Punkt kommen darf: ::GetListByTime - in dieser Methode selektieren Sie Aufträge nach Zeitintervall, um die Liste an das aufrufende Programm zu übergeben, in Teil 3 schreiben Sie das:

"Je nachdem, nach welcher Zeit die Liste sortiert ist, wird in den Auftragseigenschaften die gewünschte Eigenschaft für die Suche und den Vergleich gesetzt: wenn nach Öffnungszeit, dann ist die Eigenschaft für die Suche Öffnungszeit, wenn nach Schlusszeit, dann werden die Aufträge nach ihrer Schlusszeit verglichen, usw."

Aber wie? - In der Methode selbst gibt es keine Möglichkeit, die Sortierung der Liste der Aufträge, mit denen wir arbeiten, zu ändern.

Ich verstehe, aber ich kann mich irren, dass die Methoden SearchGreatOrEqual() und SearchLessOrEqual() die sortierte Liste nach MT5-Eröffnungszeit und MT4-Schlusszeit durchsuchen, unabhängig davon, welche Zeitintervalle wir übergeben (z. B. die Schlusszeit)? Da die Initialisierung der Orderliste im Konstruktor der Klasse COrder Collections standardmäßig durch die Eröffnungszeit oder das Ticket der Order bestimmt wird .

//+------------------------------------------------------------------+
//| Konstruktor|
//+------------------------------------------------------------------+
CHistoryCollection::CHistoryCollection(void) : m_index_deal(0),m_delta_deal(0),m_index_order(0),m_delta_order(0),m_is_trade_event(false)
  {
   this.m_list_all_orders.Sort(#ifdef __MQL5__ SORT_BY_ORDER_TIME_OPEN #else  SORT_BY_ORDER_TIME_CLOSE #endif );
   this.m_list_all_orders.Clear();
   this.m_list_all_orders.Type(COLLECTION_HISTORY_ID);
  }
//+------------------------------------------------------------------+
//| Konstruktor|
//+------------------------------------------------------------------+
CMarketCollection::CMarketCollection(void) : m_is_trade_event(false),m_is_change_volume(false),m_change_volume_value(0)
  {
   this.m_list_all_orders.Sort(SORT_BY_ORDER_TIME_OPEN);
   this.m_list_all_orders.Clear();
   this.m_list_all_orders.Type(COLLECTION_MARKET_ID);
   ::ZeroMemory(this.m_struct_prev_market);
   this.m_struct_prev_market.hash_sum=WRONG_VALUE;
   this.m_list_control.Clear();
   this.m_list_control.Sort();
   this.m_list_changed.Clear();
   this.m_list_changed.Sort();
   this.m_k_pow=(ulong)pow(10,6);
  }

Die obige Methode (::GetListByTime) wirdalso so funktionieren, dass sie immer nach der MT5-Eröffnungszeit oder der MT4-Schlusszeit sucht.

//--- Vergleicht COrder-Objekte untereinander nach allen möglichen Eigenschaften (zum Sortieren von Listen nach der angegebenen Eigenschaft des COrder-Objekts
virtual int Compare(const CObject *node,const int mode=0) const;

haben Sie sehr eng geschrieben(eng - heißt nicht, dass esfalsch ist) und es wird der im Konstruktor der Klasse order collections aus der Standard-MQL-Bibliothek gewählte Sortiermodus bei der Suche nach Ordnungen gemäß der Vorlage verwendet. Also: (in Teil 3)

//+------------------------------------------------------------------+
//| Wählt Aufträge aus der Sammlung über die Zeit aus.
//| im Bereich von Anfang_Zeit, bis Ende_Zeit |
//+------------------------------------------------------------------+
CArrayObj *CHistoryCollection::GetListByTime(const datetime begin_time=0,const datetime end_time=0,
                                             const ENUM_SELECT_BY_TIME select_time_mode=SELECT_BY_TIME_CLOSE)
  {
   ENUM_ORDER_PROP_INTEGER property=(select_time_mode==SELECT_BY_TIME_CLOSE ? ORDER_PROP_TIME_CLOSE : ORDER_PROP_TIME_OPEN);

   CArrayObj *list=new CArrayObj();
   if(list==NULL)
     {
      ::Print(DFUN+TextByLanguage("Fehler bei der Erstellung einer temporären Liste","Error creating temporary list"));
      return NULL;
     }
   datetime begin=begin_time,end=(end_time==0 ? END_TIME : end_time);
   if(begin_time>end_time) begin=0;
   list.FreeMode(false);
   ListStorage.Add(list);
   //---
   this.m_order_instance.SetProperty(property,begin);
   int index_begin=this.m_list_all_orders.SearchGreatOrEqual(&m_order_instance);
   if(index_begin==WRONG_VALUE)
      return list;
   this.m_order_instance.SetProperty(property,end);
   int index_end=this.m_list_all_orders.SearchLessOrEqual(&m_order_instance);
   if(index_end==WRONG_VALUE)
      return list;
   for(int i=index_begin; i<=index_end; i++)
      list.Add(this.m_list_all_orders.At(i));
   return list;
  }

werden nicht benötigt, da die Standardbibliothek (Methoden SearchGreatOrEqual() und SearchLessOrEqual()) weiterhin nach dem im Konstruktor übergebenen Sortiercode suchen.
Sie können diese rot hervorgehobenen Zeilen einfach entfernen und bedingte Kompilierungszeilen hinzufügen, um die Eigenschaft für das Objekt zu setzen:

   COrder            m_order_instance;       // Auftragsobjekt für die Suche nach einer Eigenschaft

Noch immer kann die Liste nur auf zwei Arten sortiert werden, nämlich beim Öffnen von MT5 oder beim Schließen von MT4.
RIGHT?

P.S. Dies ist nur notwendig, um die OOP-Logik zu verstehen!?!?

Библиотека для простого и быстрого создания программ для MetaTrader (Часть III): Коллекция рыночных ордеров и позиций, поиск и фильтрация
Библиотека для простого и быстрого создания программ для MetaTrader (Часть III): Коллекция рыночных ордеров и позиций, поиск и фильтрация
  • www.mql5.com
В первой части данного цикла статей мы начали создавать большую кроссплатформенную библиотеку, целью которой является облегчение создания программ для платформы MetaTrader 5 и MetaTrader 4. Во второй части продолжили развитие библиотеки и сделали коллекцию исторических ордеров и сделок. В данной части повествования создадим класс для удобного...