Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 856

 
Алексей Барбашин:

Hmmm... Wahrscheinlich habe ich mir die API nicht genau angeschaut, aber ich habe eine solche Funktion nicht gesehen.... Und es wäre wahrscheinlich sehr praktisch.

Irgendwelche anderen Tipps... vielleicht ist die Frage zu ... lächerlich ... Wie übersetze ich eine Zahl, z. B. double, in ein Array char? Das heißt, in einigen API ist es erforderlich, Zahlen als Zeiger zu übergeben. Zeiger werden als eindimensionale Arrays übergeben... Bei Zeichenketten verstehe ich, dass die Funktionen StringToShortArray und StringToCharArray für sie vorgesehen sind, aber bei Zahlen verstehe ich immer noch nicht, wie man sie in Byte-Arrays (char) umwandelt.

Vielleicht ein Beispiel?
 
. ... Rick D. ... .:
Vielleicht ein Beispiel?

Wir werden nicht weit genug gehen. Werfen wir einen Blick auf die Arbeit mit der Registry. In der Registrierung können sowohl Zeichen- als auch Zahlenwerte gespeichert werden (nicht als Zeichenfolge). Die Übergabe einer Zahl an die Registry und die Rückgabe eines Zeigers darauf erfolgt über Arrays (gemäß Ihrer Korrektur). Würde ein solches Beispiel funktionieren?

 
pivomoe:

Ich studiere die Geschichte der Zecken. Es lässt sich nicht immer herausfinden, was zum Zeitpunkt der Ticks auf dem Markt los war.

SBER

i=987 2016.06.27 10:00:30.274 Ask=133.91 Bid=133.9 Last=133.9 Vol=50 TICK_FLAG_ASK

i=988 2016.06.27 10:00:30.280 Ask=133.93 Bid=133.9 Last=133.9 Vol=50 TICK_FLAG_ASK

i=989 2016.06.27 10:00:30.280 Ask=133.93 Bid=133.9 Last=133.91 Vol=100 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY TICK_FLAG_SELL

i=990 2016.06.27 10:00:30.280 Ask=133.93 Bid=133.9 Last=133.92 Vol=300 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY TICK_FLAG_SELL

i=991 2016.06.27 10:00:30.280 Ask=133.93 Bid=133.9 Last=133.92 Vol=100 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY TICK_FLAG_SELL

i=992 2016.06.27 10:00:30.281 Ask=133.94 Bid=133.9 Last=133.92 Vol=100 TICK_FLAG_ASK

1. Was ist dieser mysteriöse Tick mit den gleichzeitigen FlagsTICK_FLAG_BUY und TICK_FLAG_SELL? Ich konnte solche Ticks sogar mit einem Volumen von 1 Lot finden.

2. Auf der Zecke 988. Ask=133.93 Bid=133.9 Woher kamen die letzten 133.91 auf 989 ?

Was ist auf dem Markt passiert?

Solche Fragen sollten besser in einem separaten Thema in der Rubrik "Aktienhandel" des Forums gestellt werden.

Kurz gesagt, wenn Sie sehen, dass ein Tick gleichzeitig eine Kauf- und eine Verkaufsflagge hat, bedeutet dies, dass der Server des Brokers nicht aktualisiert ist und Geschäfte mit unbekannter Richtung sendet.

Auf welchem Server beobachten Sie die Ticks?
 
Vladimir Karputov:

Bitte schreiben Sie entweder Ihre Frage um oder setzen Sie Satzzeichen, oder fügen Sie besser noch ein Bild von was, wo und wer hinzu. Andernfalls sehe ich vertraute Buchstaben, kann aber die Bedeutung und Ihren Gedanken nicht verstehen.

Hier ist ein Bild


 
Seric29:

Hier ist ein Bild.


Warum also mein Bild einfügen (oder ist der Cache verrückt?)?

 
Seric29:

Hier ist ein Bild


Klärung: Wollen Sie die Maus direkt im Terminal bewegen und den Preis der POSITION über die rechte Maustaste kopieren?

 
Алексей Барбашин:

Wir werden nicht weit genug gehen. Werfen wir einen Blick auf die Arbeit mit der Registry. In der Registrierung können sowohl Zeichen- als auch Zahlenwerte gespeichert werden (nicht als Zeichenfolge). Die Übergabe einer Zahl an die Registry und die Rückgabe eines Zeigers darauf erfolgt über Arrays (gemäß Ihrer Korrektur). Würde ein Beispiel wie dieses funktionieren?

Das war's. Ich denke, Sie können es herausfinden.
Dateien:
TestReg.mq5  33 kb
 
. ... Rick D. ... .:
Hier ist es. Ich denke, Sie werden es herausfinden.

Das ist originell! Daran hatte ich gar nicht gedacht. )))

In Anlehnung an mein vorheriges Beispiel habe ich versucht, herauszufinden, was einen Speicher- und Terminalabsturz verursacht.

Zunächst einmal habe ich Arrays abgelehnt, um Zeiger auf einen offenen Registerabschnitt zu erhalten. Das heißt, ich habe einfach uint& phkResult an die API übergeben. Alles lief gut und ohne Fehler. In der Dokumentation zu mql heißt es, dass die einfachen Typen per Referenz übergeben werden können, was bei der Arbeit mit API die Adresse der Variablen, d. h. ein Zeiger, ist. In diesem Teil war alles erfolgreich. Ich habe auch die NULL-Parameter zurückgegeben und sie ohne Verwendung von Arrays übergeben.

Außerdem habe ich daran gearbeitet, den Wert selbst an das Register zu übergeben. In der Funktionsbeschreibung wurde darauf hingewiesen, dass eine Zeichenkette mit einer Null am Ende übergeben werden soll. Dies ist genau der Stringtyp, also habe ich in der ersten Version nur eine Variable übergeben. Sie haben dies in der vorherigen Version, die sich auf dieselbe stützt, nicht geändert. Aber ich beschloss, mit Arrays zu experimentieren, und führte ushort-Array ein und füllte es mit dem erforderlichen Wert. Einer der Parameter bei der Übergabe an die Funktion

uint RegSetValueExW(uint hKey, string lpValueName, uint Reserved, uint dwType, ushort &lpData[], uint cbData)

ist die Größe der übergebenen Daten. In Ihrem Beispiel war es so:

uint cbData = (StringLen(Wert)+1)*2;

Hier ist alles klar. Wir nehmen die Länge der Zeichenkette, fügen eine "abschließende" Null hinzu und multiplizieren mit 2 Bytes, also mit der ushort-Größe;

Ich habe es auf diese Weise versucht:

ushort Data[];

StringToShortArray(Wert, Daten);

uint cbData = sizeof(Data);

Stellen Sie sich vor, wie überrascht ich war, als die Größe der Daten nicht mit der des vorherigen Beispiels übereinstimmte!

Ich habe die Größe des Arrays überprüft und sie war absolut gleich StringLen(value)+1, aber die Datengröße war nicht dieselbe... Ich verstehe immer noch nicht, warum.

Aber das macht nichts.

Das ursprüngliche Problem bestand darin, den Wert aus der Registrierung abzurufen, da ich eine String-Variable per Verweis als Zeiger übergeben habe. Hier ereignete sich der Unfall.

"Wenn Sie diese Struktur oder einen Verweis darauf in einer DLL anstelle der Zeichenkette selbst übergeben, können Sie kein korrektes Ergebnis erwarten - denn die System-DLL wird mit Sicherheit eine ehrliche Zeichenkette mit einem Null-Zeichen am Ende akzeptieren und nicht diese Struktur" - dieses Zitat ist zehn Jahre alt, aber es hat nichts von seiner Aktualität verloren.

Daher ist bei der Übergabe von String-Konstanten, z. B. Registrierungsabschnittsnamen oder String-Parameterwerten, alles korrekt. Und wenn eine String-Variable per Referenz übergeben wird, wie ich es getan habe, führt dies zu dem in dem Zitat genannten Problem. )))

Und was ist mit der empfangenen Größe, es gibt ein Beispiel in der API-Dokumentation, wenn im Falle einer Fehlermeldung "es gibt mehr Daten" wir die Größe des Empfangspuffers in der Schleife erhöhen und wieder Daten erhalten.

Es geht also folgendermaßen.

Nochmals vielen Dank für die Hilfe! )))


 
Алексей Барбашин:

Das ist originell! Daran hatte ich gar nicht gedacht. )))

Union ist bequem zu bedienen. Sie müssen nicht überlegen, wo das High-Byte und wo das Low-Byte ist. Union kann sogar für REG_BINARY verwendet werden. Sie beschreiben Ihre Datenstruktur. Und Sie fügen es in Union zusammen mit einem Array von Bytes nach Strukturgröße hinzu. Aber ich denke, Sie brauchen es nicht wirklich. Alle Daten können in eine Zeichenkette umgewandelt und als Zeichenkette gespeichert werden.

Anhand des vorherigen Beispiels habe ich versucht zu verstehen, was genau den Speicher- und Terminalabsturz verursacht hat.

Vielleicht haben Sie in der Funktionsbeschreibung long statt int angegeben, weil der Stapel fliegt.

In der Dokumentation zu mql heißt es, dass einfache Typen per Referenz übergeben werden können, was bei der Arbeit mit API die Adresse einer Variablen, d. h. ein Zeiger, ist.

Können Sie einen Link zu diesem Abschnitt der Dokumentation herunterladen?

uint cbData = sizeof(Data);

Sie benötigen uint cbData = ArraySize(Data) * 2, wenn Sie ushort array übergeben.

und uint cbData = ArraySize(Data), wenn Sie ein Array uchar übergeben.

Im letzten Beispiel übergebe ich ein uchar-Array als API-Funktionsparameter, um volle Kompatibilität mit dem LPBYTE lpData von wind zu gewährleisten.

Das ist richtig. Es ist jedoch umständlich, alle Daten in ein Byte-Array zu konvertieren.

Und was die Empfangsgröße betrifft, so gibt die API-Dokumentation ein Beispiel, bei dem im Falle des Fehlers "Es gibt mehr Daten" die Größe des Empfangspuffers in der Schleife erhöht wird und die Daten erneut empfangen werden.

Schauen Sie sich den letzten Code an. In der Implementierung wird zunächst die Größe der Daten abgefragt, dann wird die Größe des Arrays festgelegt, und dann werden alle Daten in ihrer Gesamtheit übernommen.

 
. ... Rick D. ... .:

Union ist bequem zu bedienen. Man muss nicht überlegen, wo das High-Byte und wo das Low-Byte ist. Sie können Union auch für REG_BINARY verwenden. Sie beschreiben Ihre Datenstruktur. Und Sie addieren es in Union zusammen mit dem Array von Bytes nach Strukturgröße. Aber ich denke, Sie brauchen es nicht wirklich. Alle Daten können in eine Zeichenkette umgewandelt und als Zeichenkette gespeichert werden.

Vielleicht haben Sie in der Funktionsbeschreibung long statt int angegeben, auch weil der Stapel fliegt.

Können Sie einen Link zu diesem Abschnitt der Dokumentation herunterladen?

Sie benötigen uint cbData = ArraySize(Data) * 2, wenn Sie ushort array übergeben.

und uint cbData = ArraySize(Data), wenn Sie ein Array uchar übergeben.

Im letzten Beispiel übergebe ich das uchar-Array als API-Funktionsparameter, um volle Kompatibilität mit dem Windows-LPBYTE lpData zu gewährleisten.

Das ist richtig. Es ist jedoch umständlich, alle Daten in ein Byte-Array zu konvertieren.

Schauen Sie sich den letzten Code an. In der Implementierung wird zunächst die Größe der Daten abgefragt, dann wird die Größe des Arrays festgelegt, und dann werden alle Daten in ihrer Gesamtheit übernommen.

Nochmals viele Grüße!

Ich hoffe wirklich, dass unsere Diskussion in diesem Thread nicht nur für Neulinge, sondern auch für erfahrene Programmierer nützlich sein wird.

Wie wäre es mit lang. Ja, es ist mein Fehler, aber es war int, das zuerst verwendet wurde. Ich habe Long verwendet, weil ich ein 64-Bit-Terminal verwende. Aber alles funktioniert gut mit int.

Über Zeiger. Ich denke, die folgenden Artikel beschreiben das alles sehr gut:https://www.mql5.com/ru/docs/basis/types/this,https://www.mql5.com/ru/docs/runtime/imports.

Ich gebe auch meinen Fehler mit sizeof zu. Wir verwenden ein dynamisches Array für den Austausch, während sizeof bei dynamischen Arrays einfach die Größe des Arrays selbst anstelle der Datengröße zurückgibt:https://www.mql5.com/ru/docs/basis/operations/other.

Bezüglich des Erhalts der vollen Datengröße. Ja, Sie haben Recht. In der Tat gibt die Funktion beim ersten Aufruf die Größe der im Parameter abgelegten Daten zurück, so dass Sie auf die von mir beschriebene Schleife verzichten können. Ich muss die Funktionsbeschreibung falsch verstanden haben, denn dort steht, dass die Variable die Größe der gelesenen Daten zurückgibt.

Kommen wir zurück zum String... Im Prinzip, so stellte sich heraus, könnten wir beim Empfang von Daten die Variable als Referenz übergeben, aber zuerst könnten wir sie mit einem Wert bis zur maximalen Länge initialisieren. Dies scheint mir eine Krücke zu sein, da anschließend der Wert selbst aus dieser Zeichenfolge herausgeschnitten werden sollte. Das Abrufen von Daten aus dem Array-Puffer ist die optimalere Variante, d.h. unsere Lösung ist meiner Meinung nach besser ))).

Hier geht es um die Übergabe eines Strings als Zeiger:https://www.mql5.com/ru/forum/103532/page2#comment_2983919

Andriy erzählt uns sehr gut über die Arbeit mit dll:https://www.mql5.com/ru/articles/96


Ich denke, dass wir mit Ihrer Hilfe das Thema der Arbeit nicht nur mit der Registrierung, sondern auch mit den Nuancen der Bibliotheks-API vollständig abgedeckt haben.

Die Klasse der Arbeit mit der Registry ist sehr nützlich für den Austausch von Daten sowohl zwischen Werkzeugen auf einer Karte als auch zwischen Karten und Terminals im Allgemeinen.

In diesem Forum wurde einmal gesagt, dass die Verwendung der Registrierung für diese Zwecke dem Einschlagen von Nägeln mit einer Glühbirne gleichkommt, und die Verwendung virtueller Dateien (Mapping) vorgeschlagen. Damit bin ich aber nicht einverstanden, denn bevor die Registrierung auf die Festplatte geschrieben wird, ist sie nur eine virtuelle Datei. Und bei Verwendung des Attributs REG_OPTION_VOLATILE ist der Wert immer virtuell. Außerdem ist es sehr praktisch, Daten zwischen den einzelnen Sitzungen in der Registrierung zu speichern. IMHO.

Документация по MQL5: Основы языка / Типы данных / Ссылки. Модификатор & и ключевое слово this
Документация по MQL5: Основы языка / Типы данных / Ссылки. Модификатор & и ключевое слово this
  • www.mql5.com
В MQL5 параметры простых типов можно передавать как по значению, так и по ссылке, в то время как параметры сложных типов всегда передаются по ссылке. Для указания компилятору на необходимость передачи параметра по ссылке, перед именем параметра ставится знак амперсанда Передача параметра по ссылке означает передачу адреса переменной, поэтому...
Grund der Beschwerde: