Merkmale der Sprache mql4, Feinheiten und Techniken

 
In diesem Thema werden undokumentierte Möglichkeiten der Arbeit mit der Sprache mql4 und Beispiele für die Lösung bestimmter Probleme behandelt. Es wäre wünschenswert, dass dieser Zweig inhaltlich näher an den FAQ als an der Diskussion liegt. Ich schlage vor, dass alle erfahrenen Programmierer ihre Lösungen und Programmiertechniken mitteilen, insbesondere die Abdeckung von Funktionen, die nicht in der Hilfe beschrieben sind.
 
Nun, lassen Sie mich zuerst beginnen.

Um einen Auftrag zu schließen, müssen Sie die Auftragsart und den entsprechenden Preis nicht definieren. Es ist ausreichend, OrderClosePrice() zu schreiben

/********************Script program start function********************/
void OnStart()
{
   int i, total = OrdersTotal()-1;
    for(i = total; i >= 0; i--)
     {
      if(OrderType() < OP_SELLSTOP)
       {
        if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
        printf("***********");
       }
     }
}/********************************************************************/
 

Es gibt noch viele weitere Ungenauigkeiten in der Hilfe. Nehmen Sie zum BeispielSetIndexBuffer(). Was ist an der Hilfe falsch?

"Parameter

Index

[in] Nummer des Indikatorpuffers. Die Nummerierung beginnt mit 0. Die Anzahl muss kleiner sein als der in #property indicator_buffers angegebene Wert." (diese Aussage ist nicht wahr)

Die #Eigenschaft indicator_buffers gibt die Anzahl der anzuzeigenden Puffer an. Möglicherweise bedeutet die Hilfe, obwohl ich das nicht überprüft habe, dass den für die Berechnung verwendeten Puffern keine Nummer durch SetIndexBuffer() gegeben werden muss. Ich habe jedoch festgestellt, dass der Wert des für die Berechnung verwendeten Puffers über iCustom() abgerufen werden kann, wenn ihm mit SetIndexBuffer() eine Zahl zugewiesen wird.

 
Das verstehe ich nicht.
 

Da die Entwickler den Thread besuchen - es gibt eine Frage über "Feinheiten und Tricks":

Beispiel für einen formatierten Ausdruck: PrintFormat("Bid=%.5f", Bid)

Frage: Gibt es eine Möglichkeit, anstelle einer festen Genauigkeit (hier5) eine Bedingung in der Formatbeschreibung anzugeben, so dass die Genauigkeit von _Digits abhängt? Ohne 'Vorverarbeitung' wie PrintFormat("Bid=%s", DoubleToString(Bid, _Digits))

 

In MQL4 kann derselbe Code je nach dem Zustand von #property strict unterschiedliche Ergebnisse liefern. Und das ist der Fall, wenn die Kompilierung in beiden Fällen erfolgreich ist. Wenn also die Ausführung "aus dem Ruder läuft", kann man lange Zeit an der falschen Stelle (streng) nach der Ursache suchen.

 
Alexander Puzanov:

Frage: Ist es möglich, anstelle einer festen Genauigkeit (hier5) eine Bedingung in der Formatbeschreibung anzugeben, so dass die Genauigkeit von _Digits abhängt?

Nein, Beispiele sind unter https://www.mql5.com/ru/docs/common/printformat zu finden.
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Описание проблемы

Ich schreibe einen Indikator in MQL4. Ich bin auf eine undokumentierte Funktion des Stils DRAW_HISTOGRAM gestoßen.

Um die Werte im Diagramm anzuzeigen, benötige ich zwei Puffer: für den oberen Wert des Histogramms und für den unteren Wert. Bei der Zuordnung der Indikator-Array-Puffer, wenn die Puffer für den Stil die Werte 0 und 1, 2 und 3, 4 und 5 usw. haben, wird alles normal angezeigt. Wenn den Stilpuffern jedoch Werte zugewiesen werden, die mit OTHER beginnen, d. h. 1 und 2, 3 und 4, 5 und 6, werden die Histogrammlinien im Diagramm nicht korrekt angezeigt, obwohl die Werte im Datenfenster korrekt sind.

Bitte fügen Sie einen Hinweis auf diese Besonderheit in die Dokumentation ein oder korrigieren Sie sie, denn es ist nicht immer der Fall, dass die DRAW_HISTOGRAM-Stilbeschreibung mit einem geraden Puffer beginnt!

Von der SD.
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

-Aleks-, 2017.02.07 18:21

Können Sie mir bitte sagen, ob in MT4 Expert Advisor, wenn ein benutzerdefinierter Indikator mit mehr als einem grafischen Puffer konsequent aufgerufen wird, dann geschieht Neuberechnung bei jedem Aufruf oder alle Puffer werden auf einmal berechnet und Sie können auf den Indikator im Code viele Male und nicht erwarten, Ressourcen zu verschwenden. Mich interessiert auch, was passiert, wenn der Code nicht abgeschlossen wird (länger als ein Tick läuft), aber der Indikatorwert sich ändert.


Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

Slawa, 2017.02.08 08:20

Alle Puffer werden auf einmal berechnet. Ruhige Abfrage der Werte des Indikators - es findet keine Neuberechnung statt

In MT4 arbeitet der vom Expert Advisor aufgerufene Indikator im Fluss dieses EAs und auf einer Kopie seiner historischen Daten. Sie können den Expert Advisor in einer Schleife laufen lassen, aber gleichzeitig erhalten Sie die zum Zeitpunkt des OnTick-Aufrufs berechneten Indikatordaten. Bis Sie RefreshRates aufrufen. RefreshRates aktualisiert die historischen Daten des Expert Advisors, danach werden alle seine Daten beim ersten Aufruf des Indikators neu berechnet

 
Alexey Viktorov:
Um einen Auftrag zu schließen, müssen Sie die Auftragsart und den Preis, die dieser Art entsprechen, nicht angeben. Es genügt, den Abschluss zum Preis OrderClosePrice() zu schreiben.

Sie können OrderClosePrice also erst NACH dem entsprechenden OrderSelect verwenden. Denn OrderSelect kopiert die Daten für Order(const)-Funktionen einmal, und der gleiche RefreshRates kann sie nicht aktualisieren.

Wenn also z. B. OrderClosePrice nicht geschlossen werden kann, müssen Sie OrderSelect vor dem nächsten Versuch erneut ausführen (RefreshRates ist nicht erforderlich).

ZS Dieses Thema ist von 2005! Hier sind detaillierte Argumente der Entwickler.

 
Rashid Umarov:
Nein, es gibt Beispiele unter https://www.mql5.com/ru/docs/common/printformat

Es ist eine Schande...

---

Damit der Beitrag nicht nutzlos ist:

anstelle von StringGetCharacter("a", 0) kann man auch nur 'a' schreiben - wird oft benötigt, wenn man Strings mit StringSplit in Teile zerlegt