Entwicklung einer Bibliothek von API-Funktionen für MetaTrader 4 - Seite 5

 
Übrigens entspricht das Angebot von Min jetzt mehr dem, was man kaufen kann als früher. <br / translate="no"> Rein imho :)

Danke! Wir freuen uns auf kommerzielle Angebote. Viel Glück!
 
Es ist schwer, es eine API zu nennen. Bibliothek + EA. Arbeitet SEHR langsam.
 
...
 
Frage an den Entwickler der Bibliothek: Warum ist die Geschwindigkeit beim Abrufen von Zitaten bei der Verwendung Ihrer Bibliothek noch langsamer als bei der Arbeit mit temporären Dateien? Was ist dann der Vorteil der Verwendung von gemeinsamem Speicher? <br/ translate="no">

Was meinen Sie mit der Schnelligkeit der Angebotseinholung? Wenn es sich um Ticks handelt, dann habe ich bereits geschrieben, dass die Arbeit mit Ticks von Kursen auch direkt in MT4 schwierig ist.
Die Bibliothek war ursprünglich nicht dazu gedacht, Zecken zu fangen. Das hat damit zu tun, dass sich das System bei sehr aktiven Märkten einfach aufhängen kann, weil es nicht mit den Ticks Schritt halten kann. Deshalb hat die Bibliothek einen eingebauten Softwareschutz gegen die Zeckenlawine.
Die Vorteile der Verwendung eines gemeinsamen Speichers sind die hohe Zuverlässigkeit eines solchen Systems und das Fehlen von Festplattenverstopfungen. Außerdem können mehrere Programme auf die Bibliothek zugreifen, und sie müssen den genauen Speicherort der temporären Dateien nicht "kennen". Viel Glück!
 
Wenn der Markt sehr aktiv ist, kann das System einfach einfrieren, weil es nicht mit den Ticks Schritt halten kann. Deshalb gibt es in der Bibliothek einen eingebauten Softwareschutz gegen die Tick-Lawine.


es scheint, dass der Autor es übertrieben hat :)
soweit ich verstehe, wenn der EA sich innerhalb der start() Funktion befindet (und von dort aus Informationen über einen Tick an den API-Client sendet), dann wird MT keinen neuen Tick geben, bis der EA die start() Funktion verlässt. Deshalb ist nicht klar, wie eine Lawine von Ticks entstehen kann?

Wenn der EA in einer Schleife läuft und Ticks über RefreshRates empfängt, sollte er zuerst die Client-API verlassen, und dann wird der Aufruf von RefreshRates erfolgen. Deshalb gibt es hier auch keinen Platz zum Frieren.

Der Vorteil der Verwendung eines gemeinsamen Speichers ist die hohe Zuverlässigkeit eines solchen Systems

klingt gut, ist aber nicht die einzige Möglichkeit der Kommunikation zwischen Prozessen.
damit ist das Thema "Was ist der Sinn der gemeinsamen Speichernutzung?" nicht gelöst :)

imho ist MMF nur in einem Fall gut, wenn man große Datenmengen zwischen Prozessen pumpen muss - die Pumpgeschwindigkeit beträgt ~150Mb/sec. (vor ein paar Monaten musste ich einen solchen Mechanismus nur mit MMF machen, weil dies laut Tests der schnellste Weg ist).

in dieser Aufgabe (Übergabeparameter für OrderSend etc.) - es ist wie ein Vogel durch eine Feder, einfacher, ein Fenster zu erstellen und SendMessage mit wm_copydata zu verwenden.
 
klingt solide, ist aber nicht die einzige Möglichkeit der prozessübergreifenden Kommunikation. <br / translate="no"> Das Thema "...Was ist dann der Vorteil der Verwendung von gemeinsamem Speicher?" ist also nicht gelöst :)

Ich glaube nicht, dass ich behaupte, dass der verwendete Algorithmus der beste ist. Das ist das Schöne am Programmieren, dass ein solches Problem auf mindestens ein Dutzend Arten gelöst werden kann. Auch die Variante mit den temporären Dateien hat voll funktioniert. Meine Aufgabe war es, einen zuverlässigen, praktikablen und voll funktionsfähigen Ersatz für die MT3-API zu entwickeln. Jetzt arbeitet die Bibliothek etwa ein halbes Jahr lang mit dem praktischen Handelsprogramm. Und das Hauptproblem war hier nicht die Erreichung der Höchstgeschwindigkeit, sondern die Zuverlässigkeit und die richtige Reaktion auf eine große Anzahl von Notfallsituationen. Vielen Dank für Ihre Bemerkungen, sie sind durchaus angebracht, aber das ist eine andere Geschichte". Viel Glück!
 
Hallo, also das Hauptproblem ist im Moment die Verbindung:

Mforex2.lib Importbibliothek in das Projekt einbinden (für Delpi - einfach die Bibliotheksfunktionen beschreiben),
Die Mforex.h Headerdatei im Hauptprogramm angeben (zum Beispiel: #include "Mforex.h" - nur für Builder C++);

Diese 2 Punkte sind mir rätselhaft, denn Omega ist ein fertiges Programm, alle anderen Dateien habe ich wie beschrieben platziert, die Funktion zum Starten von MT4 vorgeschrieben, und beim Start bekam ich die Meldung, dass es notwendig ist, den genauen Pfad anzugeben, aber ich habe auch den Pfad angegeben. Ich weiß nicht, was ich als nächstes tun soll.
 
In das Projekt importieren Sie die Bibliothek Mforex2.lib (für Delpi - beschreiben Sie nur die Funktionen der Bibliothek),<br/ translate="no"> Geben Sie in der Hauptprogramm-Header-Datei Mforex.h an (zum Beispiel: #include "Mforex.h" - nur für Builder C++);
Diese 2 Punkte sind mir rätselhaft, denn Omega ist ein fertiges Programm, alle anderen Dateien habe ich wie beschrieben platziert, die Funktion von MT4 Start vorgeschrieben und beim Start bekam ich die Meldung, dass es notwendig ist, den genauen Pfad anzugeben, aber ich habe den Pfad auch vorgeschrieben. Ich weiß nicht, was ich als nächstes tun soll.

Omega hat die Möglichkeit, Funktionen aus externen DLLs zu importieren. Daher sollten Sie Mforex2.dll als externe Bibliothek angeben. Gleichzeitig sollte sich diese Datei im "Sichtfeld" der Omega-Programme befinden. Geben Sie in den Aufrufprozeduren die Namen der aus der DLL importierten Funktionen an, wie in der Dokumentation angegeben. Beachten Sie auch, dass Omega die Definitionen aus der Datei Mforex.h "nicht kennt". Das heißt, wenn Sie zum Beispiel die Funktion zur Eröffnung einer Position aufrufen, müssen Sie den Operationscode für z.B. Verkaufen - 1 angeben und nicht OP_SELL usw. Weitere Einzelheiten finden Sie in der DevKit-Dokumentation, in der beschrieben wird, wie Omega mit externen Bibliotheken arbeitet.
Viel Glück!
 
<br / translate="no"> Es ist möglich, Funktionen aus externen DLLs in Omega zu importieren. Daher sollte Mforex2.dll als externe Bibliothek angegeben werden. Gleichzeitig muss diese Datei für die Omega-Programme "sichtbar" sein. Geben Sie in den Aufrufprozeduren die Namen der aus der DLL importierten Funktionen an, wie in der Dokumentation angegeben. Beachten Sie auch, dass Omega die Definitionen aus der Datei Mforex.h "nicht kennt". Das heißt, wenn Sie zum Beispiel die Funktion zur Eröffnung einer Position aufrufen, müssen Sie den Operationscode für z.B. Verkaufen - 1 und nicht OP_SELL usw. angeben. Weitere Einzelheiten finden Sie in der DevKit-Dokumentation, in der beschrieben wird, wie Omega mit externen Bibliotheken arbeitet.
Viel Glück!


Deshalb habe ich in Omega folgendes verschrieben:

DefineDLLfunc: "Mforex2.dll", int, "Start"; {DLL-Aufruf}
_gbp = Start(); {Terminal Startfunktion}

Aber Sie sagen, dass wir hier statt "Start()" etwas anderes schreiben sollten, habe ich das richtig verstanden?
 
<br/ translate="no"> Also verschrieb ich in Omega das Folgende:

DefineDLLfunc: "Mforex2.dll", int, "Start"; {call DLL}
_gbp = Start(); {terminal start function}

Aber Sie sagen, dass Sie anstelle von "Start()" etwas anderes schreiben sollten, habe ich Recht?

Ich antworte mir selbst: Sie sollten nicht etwas anderes anstelle von "Start()" schreiben - das ist richtig, Omega startet MT4 ohne Probleme.

Aber es ist ein wenig komplizierter in der Funktion der Positionseröffnung, so habe ich die Funktion vorgeschrieben:

Input: Symbol(NumericSimple), Order(NumericSimple), Lot(NumericSimple),
price(NumericSimple), sl(NumericSimple), tp(NumericSimple);


DefineDLLfunc: "Mforex2.dll", int, "NewPos",char, int, int, double, double, double;

_NewPos = NewPos(Symbol, Order, Lot, price, sl, tp);

Logisch passt alles zur Beschreibung des Herstellers, aber in der Praxis gibt es Probleme: alles wird in Zahlen gesetzt...