Asynchrone und mehrfädige Programmierung in MQL - Seite 25

 
Yuriy Asaulenko:


Ich begann, das Thema erneut zu lesen, und Igor hatte bereits darüber geschrieben.

Пишите dll (в которой Вы должны выделить память и зарегистрировать новый поток! - затем при выходе все аккуратно уничтожить!) и вызывайте ее из MQL

Genau das wollte ich sagen, Juri, dass wir Speicher zuweisen und den Fluss registrieren müssen.
Igor sagt, dass Sie zuweisen und registrieren müssen, während Sie sagen, dass Sie nichts zu tun brauchen.
Deshalb dreht sich in meinem Kopf alles. Das Ergebnis ist eine Blockade.

Igor hat als Spezialist an der Universität studiert, und er sollte mehr davon verstehen als wir Autodidakten.
Ich war zunächst zu derselben Idee geneigt: Speicher zuweisen und initialisieren.
Die Initialisierung undSpeicherzuweisung ist der Schlüssel zur korrekten Kodierung, denn sie darf nicht fließen und darf nicht unsinnig sein.

Also meine Frage an Igor, bitte erklären, wie man es in C++ tun?
Nicht in Worten, mit einem Beispiel, ich verstehe nichts ))

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved )
{
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
}
 
Roman:

Ich habe begonnen, das Thema erneut zu lesen, und Igor hat bereits darüber geschrieben.

Genau das wollte ich sagen, Yuri, dass wir Speicher zuweisen und den Fluss registrieren sollten.

Ja, natürlich tun wir das. Aber DllMain hat damit nichts zu tun). - Es ist für etwas anderes. Und nicht für Sie. Vergessen Sie es, besser für immer.) Für Sie gibt es das nicht.
Schreiben Sie eine Exportfunktion. Der Rest ist genau dasselbe wie bei normalen Programmen. Das müssen Sie auch dort tun.
Der Rest später, ich schlafe schon)).
 
Nehmen Sie C#, weil C/C++ für Sie zu kompliziert ist.
 
Roman:

Ich begann, den Thread erneut zu lesen, und Igor hatte bereits darüber geschrieben.

Ich war zunächst zu derselben Idee geneigt: Speicher zuweisen und initialisieren.
Die Initialisierung und Speicherzuweisung ist der Schlüssel zur korrekten Kodierung, denn sie darf nicht tropfen und keinen Müll enthalten.

Also meine Frage an Igor, bitte erklären, wie man es in C++ tun?

Sie treiben diesen Thread meisterhaft an die Spitze der Diskussion und versuchen, immer mehr Teilnehmer für Ihr Problem zu gewinnen ))))

Nehmen Sie die Korrespondenz nicht aus dem Zusammenhang:

- Ich habe es in dem Zusammenhang geschrieben, dass Sie, wenn Sie verstehen wollen, wie WinAPI funktioniert, fertige Beispiele zum Schreiben von Dlls verwenden können = über 20 Artikel auf dieser Ressource

- Ich habe es in einem Kontext geschrieben, in dem Sie zu reinen WinAPI-Aufrufen gelangen können, indem Sie Plugins ersetzen, die Ihre Systemprogrammierer bereits für Sie geschrieben haben

....

der Sinn der Korrespondenz: lesen und etwas tun, nicht schreiben und.... Sie werden viel verstehen, Sie werden verstehen, was und wie in Windows funktioniert, aber dieses Wissen wird nicht gefragt sein, vonIhnen wie von der Anwendung Programmierer nur mechanische Arbeit - wählte die Art des Projekts, fügte Ihren Code, kompiliert = bekam das Ergebnis - die ganze Arbeit für Sie getan haben Hunderte oder Tausende von System-Programmierer. Jede Änderung von Templates und Include-Dateien muss sinnvoll sein - wenn man es nicht weiß, unter dem Vorwand "warum so viel Code, es funktioniert doch schon!" - Sie erhalten einen nicht reproduzierbaren Fehler und/oder mangelnde Kompatibilität (Portabilität) mit OS/PC

 
Vladimir Simakov:
Der Beitrag ist für die Ersteller bestimmt. Trolle weg. Bei GUIs ist es sinnvoll, das OnChartEvent in einen separaten Thread zu legen.

Warum sollte man das von den Entwicklern erstellte Modell zerstören? - Das MQL-Programmmodell ist einfach und klar, es gibt Ereignisse - es gibt Einstiegspunkte, die diese Ereignisse verarbeiten (OnTick(),OnInit()....OnChartEvent() )

es besteht die Möglichkeit, den Zustand der Handelsumgebung von jedem MQL-Programm zu erhalten (sogar Indikatoren können den Gewinn eines offenen Auftrags sehen, usw.) und es ist möglich, Expert Advisor+Skript, Expert Advisor+Benutzerindikator auf demselben Diagramm zu kombinieren - Sie erhalten eine asynchrone Ausführung von MQL-Programmen, der EA handelt, der Indikator zeigt die grafische Visualisierung an - wenn die Leistungdes Benutzerindikatorstroms nicht ausreicht (sie arbeiten in einem Thread), dann ist das natürlich ein Problem - Sie müssen 2 EAs auf 2 Diagrammen verwenden und ihre Interaktion organisieren

noch einmal - es gibt eine spezifische Aufgabe, es gibt eine Implementierung, ich habe viele Male gefragt, warum diese Funktion benötigt wird, aber bisher gibt es keine Antwort - nur räumliche Überlegungen zur 3D-Visualisierung.... und es gibt keine Diskussion darüber, wo man DirectX bekommt, um mit 3D zu arbeiten ;)

Imho funktioniert es! )))

 
Igor Makanu:

Warum sollte man das von den Entwicklern erstellte Modell zerstören? - Das MQL-Programmmodell ist einfach und klar, es gibt Ereignisse - es gibt Einstiegspunkte, die diese Ereignisse verarbeiten (OnTick(),OnInit()....OnChartEvent() )

es besteht die Möglichkeit, den Zustand der Handelsumgebung von jedem MQL-Programm zu erhalten (sogar Indikatoren können den Gewinn eines offenen Auftrags sehen, usw.) und es ist möglich, Expert Advisor+Skript, Expert Advisor+Benutzerindikator auf demselben Diagramm zu kombinieren - Sie erhalten eine asynchrone Ausführung von MQL-Programmen, der EA handelt, der Indikator zeigt die grafische Visualisierung an - wenn die Leistungdes Benutzerindikatorstroms nicht ausreicht (sie arbeiten in einem Thread), dann ist das natürlich ein Problem - Sie müssen 2 EAs auf 2 Diagrammen verwenden und ihre Interaktion organisieren

wieder - es gibt eine spezifische Aufgabe, es gibt eine Implementierung, ich habe viele Male gefragt, warum diese Funktion benötigt wird, aber bisher gibt es keine Antwort - nur räumliche Argumentation über die 3D-Visualisierung.... und es gibt keine Diskussion darüber, wo man DirectX bekommt, um mit 3D zu arbeiten ;)

Imho funktioniert es! )))

Sehen Sie. Es gibt einen Knopf. Sie klicken darauf. OnChartEvent wird in die Warteschlange aufgenommen. Aber in dieser Warteschlange gibt es bereits OnTick, und darauf folgt OnTime, und in ihnen gibt es CopyRate für alle Werkzeuge, die, für eine Sekunde, blockiert und Schleifen für einen Haufen von fucking Iterationen. Wenn die Schaltfläche z. B. ein Dialogfenster öffnen soll, wird die Schnittstelle dadurch träge. Natürlich nicht kritisch, aber auch nicht nett.
 
Vladimir Simakov:
Sehen Sie. Es gibt eine Schaltfläche. Sie klicken darauf. Das OnChartEvent wird in die Warteschlange gestellt. Aber in dieser Warteschlange gibt es bereits OnTick, und darauf folgt OnTime, und in ihnen gibt es CopyRate für alle Werkzeuge, die, für eine Sekunde, blockiert und Schleifen für einen Haufen von fucking Iterationen. Wenn die Schaltfläche z. B. ein Dialogfenster öffnen soll, wird die Schnittstelle dadurch träge. Natürlich nicht kritisch, aber auch nicht nett.

Die GUI sollte sich im Haupt-EA drehen und alles andere in einem separaten EA. Dieser separate EA-Slave wird auf dem unsichtbarenOBJ_CHART platziert und interagiert mit dem Hauptpfad EventSendCustom().

Es gibt so etwas wie ein Multithreading. Ich habe es auf diese Weise umgesetzt.

 
Vladimir Simakov:
Sehen Sie. Es gibt eine Schaltfläche. Sie klicken darauf. OnChartEvent wird in die Warteschlange aufgenommen. Aber in dieser Warteschlange gibt es bereits OnTick, und nach ihm gibt es OnTime, und in ihnen gibt es CopyRate für alle Werkzeuge, die für eine Sekunde blockiert und Schleifen für eine Scheiße-Tonne von Iterationen. Wenn die Schaltfläche z. B. ein Dialogfenster öffnen soll, wird die Schnittstelle dadurch träge. Natürlich nicht kritisch, aber auch nicht nett.

Ich weiß nicht, OnChartEvent OnTick und OnTime, aber Entwickler haben geschrieben, dass, wenn EA beschäftigt war und hat nicht das Ereignis verarbeitet, dieses Ereignis nicht eine Warteschlange erstellen, dh es wird nur ein Tick oder Timer überspringen ( OnChartEvent - nicht wissen, nicht überprüft)


Die Logik der Entwickler ist hier einfach, jedes Ereignis ist eine spezifische Aktion des Expert Advisors, aber es ist dieses Ereignis, das ich mit Sicherheit weiß und mehr als einmal überprüft habe (ich arbeite mehr in der Theorie in MT5, ich weiß nicht, wie ONTick physisch funktioniert):

über MT4 möchte ich eindeutig sagen: alle Handelsoperationen sollten nur über eingehende Ticks durchgeführt werden, andernfalls werden Sie in 9 von 10 Fällen eine Ablehnung des Servers erhalten, die Handelsoperation zu bearbeiten,

d.h. eine Schnittstelle mit der BUY-Schaltfläche wurde implementiert - nach unserer Idee, drücken Sie BUY und senden Sie sofort eine Bestellung, aber es wird nicht direkt funktionieren, müssen Sie den Benutzer-Befehl zu erinnern (idealerweise blockieren die Schaltfläche, so dass es nicht yak)) und bei Tick Ankunft, in OnTick() - senden Sie eine Bestellung an den Server - dies wird in 99% der Fälle zu arbeiten, dh ein Tick gekommen ist - können Sie einen Handel Anfrage (nicht von überall in MQL) durchführen



Und wenn wir OnChartEvent in einen asynchronen Ablauf einführen, erhalten wir dann gegenseitige Sperren des ausgeführten Codes? - Zum Beispiel werden die Handelsstatistiken durch Drücken der Schaltfläche in OnChartEvent erhalten, und die gleiche Funktion (letzter Verlusthandel) wird in OnTick verwendet - es wird etwas verrückt hier! - Imho kann man nicht alles reparieren!

 
Andrey Barinov:

Die GUI sollte sich im Haupt-EA drehen und alles andere in einem separaten EA. Dieser separate EA-Slave wird auf dem unsichtbarenOBJ_CHART platziert und interagiert mit dem Hauptpfad EventSendCustom().

Es gibt so etwas wie ein Multithreading. Ich habe es auf diese Weise umgesetzt.

Ganz genau. In Ermangelung eines Dienstmädchens... Das nennt man eine Krücke.
 
Igor Makanu:

Ich weiß nicht, OnChartEvent OnTick und OnTime, aber Entwickler schrieb, dass, wenn EA beschäftigt war und hat nicht das Ereignis verarbeitet, dieses Ereignis nicht eine Warteschlange zu erstellen, dh es wird nur ein Tick oder Timer überspringen ( OnChartEvent - nicht wissen, nicht überprüft)


Die Logik der Entwickler ist hier einfach, jedes Ereignis ist eine spezifische Aktion des Expert Advisors, aber es ist dieses Ereignis, das ich mit Sicherheit weiß und mehr als einmal überprüft habe (ich arbeite mehr in der Theorie in MT5, ich weiß nicht, wie ONTick physisch funktioniert):

über MT4 möchte ich eindeutig sagen: alle Handelsoperationen sollten nur über eingehende Ticks durchgeführt werden, andernfalls werden Sie in 9 von 10 Fällen eine Ablehnung des Servers erhalten, die Handelsoperation zu bearbeiten,

d.h. eine Schnittstelle mit der BUY-Schaltfläche wurde implementiert - nach unserer Idee, drücken Sie BUY und senden Sie sofort eine Bestellung, aber es wird nicht direkt funktionieren, müssen Sie den Benutzer-Befehl zu erinnern (idealerweise blockieren die Schaltfläche, so dass es nicht yak)) und bei Tick Ankunft, in OnTick() - senden Sie eine Bestellung an den Server - dies wird in 99% der Fälle zu arbeiten, dh ein Tick gekommen ist - können Sie einen Handel Anfrage (nicht von überall in MQL) durchführen



Und wenn wir OnChartEvent in einen asynchronen Ablauf einführen, erhalten wir dann gegenseitige Sperren des ausgeführten Codes? - Zum Beispiel werden die Handelsstatistiken durch Drücken der Schaltfläche in OnChartEvent erhalten, und die gleiche Funktion (letzter Verlusthandel) wird in OnTick verwendet - es wird etwas Ernstes sein! - Imho kann man nicht alles reparieren!

Die Synchronisierung ist Aufgabe des Programmierers, und wenn man nicht weiß, wie das geht, benutzt man kein Multithreading. Die Aufgabe der Schöpfer ist es, ein Werkzeug zu geben, und dann ist jeder selbst ein böser Schuster. Das gleiche a la mutex ist überhaupt kein Problem.