MT5 und trans2quik.dll - Seite 6

 
prostotrader:

Nein, ich muss nur 3 Threads synchronisieren (im Grunde einen Synchronizer schreiben), aber

Ich weiß nicht, wie das geht.

Dann bleiben nur noch die Flaggen. Wir setzen eine Fahne, warten, bis andere ihre Aktivitäten beendet haben, halten an und nehmen ihre Fahne ab, erledigen etwas, nehmen die Fahne ab. Nun, und natürlich die Logik der Flaggenpriorität.

Ich würde die DDE nicht anhalten, sondern in den Puffer schreiben lassen, damit nichts verloren geht.

 
Yuriy Asaulenko:

Dann bleiben nur noch die Flaggen. Hängen Sie eine Fahne auf, warten Sie, bis die anderen ihre Aktivitäten beendet haben, halten Sie an und nehmen Sie ihre Fahnen ab, erledigen Sie das Geschäft, nehmen Sie die Fahne ab. Nun, und natürlich die Logik der Flaggenpriorität.

Ich würde DDE aber nicht stoppen, sondern in den Puffer schreiben lassen, damit nichts verloren geht.

Mit anderen Worten, der Synchronizer sollte einen Puffer von eingehenden Funktionen erstellen, die je nach Priorität ausgeführt werden?

 
prostotrader:

Der Synchronizer muss also eingehende Funktionen puffern, die je nach Priorität ausgeführt werden?

Nein, setzen Sie einfach den/die Thread(s) gemäß den entsprechenden Flags und ihrer Priorität aus. Bei dieser Variante ist überhaupt nichts anderes erforderlich.

Die zweite Möglichkeit besteht darin, zu warten, bis die Funktion des Threads beendet ist, und ihn dann durch sein Flag zu stoppen. Dies kann z.B. notwendig sein, um das asc-Gebot, die Indikatoren und alles andere, was wir brauchen, zu aktualisieren.

Zum Beispiel die Flaggenwerte.

0 - Thread ist im Leerlauf,

1 - Das Gewinde ist eingeschaltet,

2 - Anforderung, alle Threads mit niedrigerer Priorität anzuhalten.

Setzen Sie ihn auf 2 und warten Sie, bis alle Threads 0 werden, führen Sie das Programm aus und setzen Sie ihn auf 0 oder 1. Mit diesem Kennzeichen nehmen alle anderen Threads ihre Arbeit wieder auf.

 
Yuriy Asaulenko:

Nein, setzen Sie den/die Thread(s) einfach nach den entsprechenden Flags und ihrer Priorität aus. Bei dieser Variante ist überhaupt nichts weiter erforderlich.

Die zweite Möglichkeit besteht darin, zu warten, bis die Funktion des Threads beendet ist, und ihn dann durch sein Flag zu stoppen. Dies kann z.B. notwendig sein, um das asc-Gebot, die Indikatoren und alles andere, was wir brauchen, zu aktualisieren.

Zum Beispiel die Flaggenwerte.

0 - Thread ist im Leerlauf,

1 - Das Gewinde ist eingeschaltet,

2 - Anforderung, alle Threads mit niedrigerer Priorität anzuhalten.

Setzen Sie ihn auf 2 und warten Sie, bis alle Threads 0 werden, führen Sie das Programm aus und setzen Sie ihn auf 0 oder 1. Mit diesem Kennzeichen nehmen alle anderen Threads ihre Arbeit wieder auf.

Sie haben selbst geschrieben, dass es nicht gut ist, DDE auszusetzen

 
prostotrader:

Sie haben selbst geschrieben, dass es nicht gut ist, eine DDE auszusetzen

Ich verstehe Sie einfach nicht.

Was ich tue, ist Folgendes.

Der Server (ich habe einen TCP-Server) schreibt in seinem Thread ständig Daten in die Sammlung nach dem Prinzip "last in first out". Es gibt keinen Grund, sie zu stoppen.

Die Daten werden in einem anderen Thread aus der Sammlung gelesen/gelöscht und in DataTable geschrieben (analog zur Datenbanktabelle, aber im Speicher). Dieser Thread kann pausiert werden, wenn er im Weg ist.

3. ein anderer Thread liest Daten aus DataTable zur Analyse. Dieser Thread stört Thread 2 nicht, da er von select abgerufen wird und niemand außer 2 Daten in diese Tabelle schreibt. Sie können diesen Thread auch stoppen, wenn er Ihnen im Weg ist.

Ich muss nichts unterbrechen, denn ich arbeite mit einem Tool und Thread 3 ist auf "Aufträge einreichen - ausführen" und "Geschäfte verfolgen" geschaltet.

 
Yuriy Asaulenko:

Ich verstehe Sie einfach nicht.

Was ich tue, ist Folgendes.

1) Der Server (ich habe einen TCP-Server) schreibt in seinem Thread ständig Daten in die Sammlung, und zwar nach dem Prinzip "last in first out". Es gibt keinen Grund, sie zu stoppen.

Die Daten werden in einem anderen Thread aus der Sammlung gelesen/gelöscht und in DataTable geschrieben (analog zur Datenbanktabelle, aber im Speicher). Dieser Thread kann pausiert werden, wenn er im Weg ist.

3. ein anderer Thread liest Daten aus DataTable zur Analyse. Dieser Thread stört Thread 2 nicht, da er von select abgerufen wird und niemand außer 2 Schreibvorgänge in dieser Tabelle durchführt. Sie können diesen Thread auch stoppen, wenn er Ihnen im Weg ist.

Ich muss nichts unterbrechen, da ich mit einem Tool arbeite und Thread 3 auf "Aufträge einreichen/ausführen" und "Geschäfte verfolgen" umgeschaltet wird.

Du hast Glück, ich habe 52 Werkzeuge, also muss ich wechseln.

 
prostotrader:

Du hast Glück, ich habe 52 Instrumente, also muss ich wechseln

Ich gehe davon aus, dass die Analyse aller 52 Instrumente in einem Thread durchgeführt wird? Oder doch nicht?

Was wird als Speicher verwendet? In meinem Fall, mit Multi-User-Zugriff, ist Sperren unnötig und Lesen stört nicht beim Schreiben.

Das einzige, was blockiert werden muss, ist der gemeinsame Zugang des Kindes zu trans2quik. Und nur im Falle einer Gruppe von Fäden Kind. Sie können dies tun, indem Sie trans2quik in einem separaten Thread organisieren und ihn bei einem Ereignis aufrufen und gleichzeitig den Ereignishandler sperren, bis die Anfrage beendet ist. Der Rest ist unerreichbar).

 
prostotrader:

Die Idee, MT5 und Kvik zu verknüpfen, habe ich komplett verworfen und mich nur für Kvik entschieden (DEE-Server + trans2quik.dll)

Das ist schade. Was ist der Grund für diese Entscheidung, gibt es ernsthafte Hindernisse beim Empfang/der Übermittlung von Daten zwischen den beiden Programmen?

 
Yuriy Asaulenko:

Ich gehe davon aus, dass die Analyse aller 52 Instrumente in einem Strom erfolgt? Oder ist es nicht so?

Was wird als Speicher verwendet? In meinem Fall, mit Multi-User-Zugriff, ist das Sperren unnötig und das Lesen stört das Schreiben nicht.

Das Einzige, was zu blockieren ist, ist der gemeinsame Zugang des Kindes zu trans2quik. Und nur im Falle einer Gruppe von Fäden Kind. Sie können dies tun, indem Sie trans2quik in einem separaten Thread organisieren und ihn bei einem Ereignis aufrufen und gleichzeitig den Ereignishandler sperren, bis die Anfrage beendet ist. Der Rest wird nicht dazu kommen).

Nein, die Analyse selbst findet in Child statt (separat für jedes Werkzeug) Selector(1,2) wählt aus, an welchen Roboter die Daten gesendet werden sollen und kollabiert

Speicherung - nur Tabellen, die im Speicher abgelegt werden

 
Aleksey Vyazmikin:

Das ist sehr schade. Was ist der Grund für diese Entscheidung, gibt es ein ernsthaftes Hindernis für den Empfang/ die Übertragung von Daten zwischen den beiden Programmen?

Es macht einfach keinen Sinn, ein Durcheinander zu verursachen.

Bei MT5 benötigen wir einen Code im Expert Advisor und eine DLL, die Daten empfängt.

Wenn wir nur Quick verwenden, haben wir nur eine Anwendung (siehe Abbildung mit Diagramm)

Grund der Beschwerde: