Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XXVII): Arbeiten mit Handelsanfragen - platzieren von Pending-Orders" - Seite 3

 
Artyom Trishkin:
Es liegt nicht an mir, dass Sie sich nicht zu diesem Thema äußern wollen, aber Sie haben das Wesen dieses Themas nicht verstanden.
In drei Artikeln testen wir ein neues Handelskonzept - den Handel mit schwebenden Aufträgen. Nach und nach werden in jedem Artikel neue Objekte-Abfragen hinzugefügt. Außerdem ist dies nur ein Test des Konzepts an einer vorübergehend erstellten Klasse. Im vierten Artikel dieses Themas werden vollwertige Klassen für solche Objekte erstellt werden. Und es sind nicht viele, aber sie reichen aus, um alle Anforderungen des Konzepts zu erfüllen.
Damit ich Ihnen nicht alles noch einmal erklären muss, versuchen Sie bitte zu verstehen, warum Sie es brauchen und welche Möglichkeiten es Ihnen bietet. Ich habe nur ein paar Beispiele genannt, die mir sofort in den Sinn kamen.

Sie haben entschieden, dass ich nicht verstehe, dass jede Art von zeitversetzter Abfrage ihre eigene Lösung braucht. Alle Anfragen haben ihre eigenen Eigenschaften und eine gemeinsame Lösung ist unmöglich. Eine Lösung für Bestellungen ist eine Lösung, eine andere für wiederholte Abfragen bestimmter Daten. In den letzten beiden Artikeln haben wir an einer Lösung für Bestellungen gearbeitet. Der nächste Artikel wird sich auch damit befassen. Meiner Meinung nach ist das zu lang.

3 Artikel für die Lösung einer ausstehenden Anfrage NUR für Bestellungen, von denen zwei nichts ausfüllen.... Während in der Tat (nicht in der Form) die Lösung für ausstehende Bestellungen recht einfach ist.

 
Реter Konow:

Sie haben entschieden, dass ich nicht verstehe, dass jede Art von anhängiger Abfrage eine andere Lösung benötigt. Alle Abfragen haben ihre eigenen Eigenschaften und eine gemeinsame Lösung ist unmöglich. Eine Lösung für Bestellungen ist eine Lösung, eine andere für wiederholte Abfragen bestimmter Daten. In den letzten beiden Artikeln haben wir uns mit einer Lösung für Bestellungen beschäftigt. Der nächste Artikel wird sich auch damit befassen. Meiner Meinung nach ist er zu lang.

3 Artikel für die Lösung einer ausstehenden Anfrage NUR für Bestellungen, von denen zwei nichts ausfüllen.... Während in der Tat (nicht in der Form) die Lösung der ausstehenden Auftragsanfrage ziemlich einfach ist.

Über "unmöglich" sind Sie voreilig.
Über "gestreckt" - die Leute sagen, es gibt bereits eine Überfülle von Informationen in einer Website, und Sie sind unter ihnen auch. Und das sind Artikel, nicht kodobaza. Hier brauchen Sie eine Beschreibung. Deshalb - in Teilen.
Einfach - sofort.
Komplexer - mit dem Ziel der weiteren Nutzung und Erweiterbarkeit.
 
Artyom Trishkin:
Der Teil "unmöglich" ist ein bisschen voreilig.
Über "gestreckt" - Leute sagen, dass es bereits ein Übermaß an Informationen in einer Website, und Sie sind unter ihnen auch. Und dies sind Artikel, nicht kodobaza. Hier brauchen Sie eine Beschreibung. Daher - in Teilen.
Einfach - sofort.
Komplexer - mit dem Ziel der weiteren Nutzung und Erweiterbarkeit.

Genau, das ist unmöglich. Verschiedene Objekt-Abfragen - verschiedene Eigenschaften. Man kann nicht alle Eigenschaften in ein Abfrageobjekt packen.

Ich frage mich nur, wie eine einfache Aufgabe anderthalb Monate lang in drei Artikeln gelöst werden kann. Wenn diese Programmiermethode als "effizient" gilt, dann bin ich froh, dass ich anders programmiere.

 
Реter Konow:

Es ist unmöglich, alle Aufrufe des EA an den Server zu verfolgen.

  • Sie können Handelsaufträge, die an den Server gesendet werden, NUR über die Methoden Ihrer Bibliothek verfolgen. Und wenn die Aufträge über Ihre eigenen Funktionen gesendet werden?
  • Wie werden Sie verfolgen und was können Sie im Falle eines Verbindungsabbruchs/einer Verbindungsunterbrechung tun, wenn der EA seine eigenen Methoden zur Kommunikation mit dem Server verwendet?
Daher die Frage:
  • Was können Sie als Lösung für Server-Kommunikationsprobleme vorschlagen, abgesehen vom erneuten Versenden fehlgeschlagener Aufträge?

Ich frage, weil die Lösung für das Problem des wiederholten Versendens von fehlgeschlagenen Aufträgen (offensichtlich) keine Komplikationen erfordert und einfach zu lösen ist.

Wenn Aufträge nicht über Bibliotheksmethoden gesendet werden, muss die gesamte Handelslogik unabhängig geschrieben werden. Die Bibliothek bietet die Möglichkeit, dies nicht zu tun, zwingt Sie aber nicht dazu, alles über ihre Funktionen zu erledigen.

In einer solchen Situation kann die Bibliothek keine Handelsfunktionen verwalten, die nicht ihre eigenen sind. Sie ist jedoch in der Lage, die Tatsache eines erfolgreichen Handelsauftrags zu melden, der über Funktionen Dritter gesendet wurde.

Nutzen Sie die Funktionen der Bibliothek, um auf vom Server zurückgegebene Fehler zu reagieren und diese angemessen zu bearbeiten.

Was sehen Sie als Handler für Server-Returncodes?

 
Реter Konow:

Genau, das ist unmöglich. Verschiedene Abfrageobjekte - verschiedene Eigenschaften. Sie können nicht alle Eigenschaften in ein Abfrageobjekt einfügen.

Ich frage mich nur, wie eine einfache Aufgabe in drei Artikeln in eineinhalb Monaten gelöst werden kann. Wenn diese Programmiermethode als "effizient" gilt, dann bin ich froh, dass ich anders programmiere.

Bei den Objekten handelt es sich um ausstehende Handelsanfragen . Alle Informationen über Handelsanfragen werden in einer einzigen Struktur für alle Anfragen gespeichert - MqlTradeRequest.

Trollst du?
In der Tat, ich beschreibe das Konzept. Schritt für Schritt. In Artikeln (ich schreibe die Texte selbst, ich überprüfe sie drei- oder viermal auf Fehler, und ich übersehe einige davon). Ich spreche den Inhalt des Konzepts in Artikeln aus, Logik und Funktionalität, zeige, wie man es macht. Gleichzeitig denke ich vorher über verschiedene Möglichkeiten nach, von denen ein großer Teil in den Papierkorb wandert - das heißt, ich schreibe tatsächlich drei- oder viermal mehr Code, als in den Artikeln steht. Manchmal schreibe ich den gesamten Code von Grund auf neu, und zwar nach anderen Prinzipien. Dann teste ich alles im Tester und in der Demo - was in jedem Artikel beschrieben ist. Und dann vermisse ich einige Fehler und korrigiere sie später in den nächsten Artikeln.

Wenn der Code auf Anhieb funktioniert, bedeutet das, dass darin eine Bombe versteckt ist, und ich erwarte in Zukunft eine große Überraschung.

Ich bin überrascht, dass Sie alles in einer Stunde selbst schreiben. Keine Prüfungen, keine Tests, und nur so lange, wie es geht :)

Ich möchte wirklich verstehen, was Sie hier für einfach halten. Warum willst du nicht verstehen, dass dies ein Teil der zukünftigen Funktionalität anderer Teile der Bibliothek ist, und alles im Voraus "in deinem Kopf" mit dem verknüpft werden sollte, was noch nicht da ist, aber geplant ist?

Ich stelle mir nicht die Aufgabe, es einmal zu tun und es dann schweben zu lassen. Ich habe eine andere Aufgabe - nämlich zu überlegen, wie alles weiter vernetzt werden soll. Das braucht Zeit und eine bestimmte Herangehensweise. Wenn das für Sie schwierig ist, nun ja... Dann ist es kompliziert.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Взаимодействие клиентского терминала и торгового сервера для проведения операций постановки ордеров производится посредством торговых запросов. Запрос представлен специальной предопределенной структурой MqlTradeRequest, которая содержит все поля, необходимые для заключения торговых сделок. Результат обработки запроса представлен структурой...
 
Artyom Trishkin:

...

Und was sehen Sie als Server-Returncode-Handler?

Ich werde Ihnen eine kurze und effektive Lösung zeigen.


1. deklarieren Sie eine globale Variable: string Del_req;

2. Schreiben Sie die Funktion void Delayed_request(). Die Funktion wird von OnTimer() einmal pro Sekunde aufgerufen (wenn Del_req != NULL).

3. Fügen Sie den Parameter int delayed_request_ID = 0 zu jeder Handelsfunktion hinzu, die einen Auftrag sendet.

4. Jede Handelsanfrage gibt eine Serverantwort zurück. Wenn delayed_request = 0 (kein wiederholter Aufruf von Delayed_request() ) und die Serverantwort eine Wiederholung der Anfrage erfordert, schreiben die Handelsfunktionen alle Aufrufparameter in die Variable Del_req (durch zwei Trennzeichen - delayed_request_ID und Parameter) und fügen am Ende der Zeile die Anzahl der erforderlichen Versuche hinzu (z. B. 10).

5. Die Funktion Delayed_request() überprüft den String Del_req einmal pro Sekunde. Wenn die Zeichenkette nicht NULL ist, legt die Funktion sie in ein Array und durchläuft es in einer Schleife, um die Teilzeichenkette des Anrufs zu finden, findet sie, extrahiert sie aus der gesamten Zeichenkette, teilt sie auf, prüft die Art des Anrufs und übergibt die Parameter zusammen mit der delayed_request_ID an die erforderliche Handelsfunktion. Als Nächstes wird der Aufrufzähler überprüft und um eins dekrementiert. Ist der Zähler nach Abzug von eins gleich null, wird die gesamte Teilzeichenkette des Aufrufs aus der gesamten Del_req-Zeichenkette gelöscht.

6. Wenn die Handelsfunktion einen Anruf mit delayed_request_ID annimmt und die Anfrage an den Server erfolgreich war, löscht sie die Teilzeichenkette des Anrufs aus der allgemeinen Del_req-Zeichenkette (sie findet sie nach delayed_request_ID).


All dies kann an einem Tag erledigt werden und kann nicht nur auf Handelsanfragen, sondern auf alle Anfragen angewendet werden.

ZY: Das ist kein Trolling, ich bin wirklich überrascht, dass einfache Lösungen für erfahrene Programmierer nicht offensichtlich sind.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
Реter Konow:

Ich werde Ihnen eine kurze und effektive Lösung zeigen.


1. eine globale Variable deklarieren : string Del_req;

2. Schreiben Sie die Funktion void Delayed_request(). Die Funktion wird von OnTimer() einmal pro Sekunde aufgerufen.

3. Fügen Sie einen Parameter int delayed_request_ID = 0 zu jeder Handelsfunktion hinzu, die einen Auftrag sendet.

4. Jede Handelsanfrage gibt eine Serverantwort zurück. Wenn delayed_request = 0 (kein wiederholter Aufruf von Delayed_request() ) und die Serverantwort eine Wiederholung der Anfrage erfordert, schreiben die Handelsfunktionen alle Aufrufparameter in die Variable Del_req (durch zwei Trennzeichen - delayed_request_ID und Parameter) und fügen am Ende der Zeile die Anzahl der erforderlichen Versuche hinzu (z. B. 10).

5. Die Funktion Delayed_request() überprüft die Zeichenkette Del_req einmal pro Sekunde. Wenn die Zeichenkette nicht NULL ist, legt die Funktion sie in ein Array und durchläuft es in einer Schleife, um den Anruf zu finden, findet ihn, extrahiert ihn aus der gesamten Zeichenkette, teilt ihn auf, prüft die Art des Anrufs und übergibt die Parameter zusammen mit der delayed_request_ID an die erforderliche Handelsfunktion. Als Nächstes wird der Aufrufzähler überprüft und um eins dekrementiert. Ist der Zähler ungleich Null, ändert Del_req den Aufrufzähler im Aufrufstring auf einen um eins kleineren Wert, ist er gleich Null, wird der gesamte Aufrufstring aus dem gesamten Del_req-String gelöscht.

6. Wenn die Handelsfunktion einen Anruf mit delayed_request_ID erhält und die Anfrage an den Server erfolgreich war, löscht sie die Teilzeichenkette des Anrufs aus der gesamten Del_req-Zeichenkette (findet sie anhand der delayed_request_ID).


All dies kann an einem Tag erledigt werden und kann nicht nur auf Handelsanfragen, sondern auf alle Anfragen angewendet werden.

ZY: Das ist kein Trolling, ich bin wirklich überrascht, dass einfache Lösungen für erfahrene Programmierer nicht offensichtlich sind.

Absichtlich Bremsen in Methoden zu drücken?

Und was ist der Unterschied zwischen der vorgeschlagenen Methode und der, die gerade gemacht wird? Abgesehen von der Tatsache, dass man sich durch teure Funktionen der Arbeit mit Strings arbeiten muss? Konzeptionell nichts. Das ist der Grund - es wird so sein, wie es beabsichtigt ist. Darüber hinaus wird das, was getan wird, und Sie wissen es noch nicht, verwendet, um die Funktionalität der Arbeit mit verzögerten Abfragen zu erweitern.

 
Artyom Trishkin:

Bewusst auf die Bremse treten bei Methoden?

Und was ist der Unterschied zwischen der vorgeschlagenen Methode und der, die gerade gemacht wird? Abgesehen von der Tatsache, dass Sie sich durch teure Funktionen für die Arbeit mit Zeichenketten arbeiten müssen? Nichts. Das ist der Grund - es wird so sein, wie es beabsichtigt ist. Darüber hinaus wird das, was getan wird, und Sie wissen es noch nicht, verwendet, um die Funktionalität der Arbeit mit verzögerten Abfragen zu erweitern.

Tun Sie, was Sie für richtig halten. Es ist Ihre Kreativität. Ich habe meine Meinung geäußert.

Und es gibt keine Bremsen. Anhängige Anfragen werden immer noch einmal pro Sekunde gesendet.

Der Unterschied besteht darin, dass schwebende Anfragen nicht zu vollwertigen Objekten werden und daher nicht viel Code mit sich bringen.

 
Реter Konow:

Tun Sie, was Sie für richtig halten. Es ist Ihre Kunst. Ich habe meine Meinung gesagt.

Und es gibt keine Bremsen. Anhängige Anfragen werden sowieso einmal pro Sekunde gesendet.

Warum werden sie einmal pro Sekunde gesendet? Um den Handelsserver zu überfluten?

 
Реter Konow:

Der Unterschied besteht darin, dass schwebende Abfragen nicht zu vollwertigen Objekten werden und somit nicht viel Code hinter sich herziehen.

Und ich brauche vollwertige Objekte, um das zu implementieren, was ich weiter geplant habe. Aber das wissen Sie noch nicht, und Sie versuchen, uneffektive Lösungsansätze für einen kleinen Teil der Aufgabe für die weitere Arbeit anzubieten. Und hier ist alles miteinander verbunden, und das allgemeine Konzept ist das gleiche - die anderen Dinge, die in der Zukunft geplant sind, hängen von diesem kleinen Teil ab.

Wie auch immer, danke für Ihre Meinung - jede Meinung ist nützlich und macht Sinn.

ZY: Und ja, es ist nicht schlimm, ein funktionierendes, erweiterbares und kompatibles Stück Code zu schreiben, anstatt ständig gedankenlos geschriebene unvollständige Lösungen für die nächsten Aufgaben neu zu schreiben.