Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 202

 
Yurij Kozhevnikov:

=

Das scheint der Fall zu sein, wenn ich das Substitutionsprinzip richtig verstehe.

Zusätzliche Semikolons nach den geschweiften Klammern. Und es ist nicht klar, was sonst noch gemeint ist.

Es ist schade, dass es offenbar keine einfache Möglichkeit gibt, die Makroexpansion zu automatisieren, um zu sehen, was passiert. Es sei denn, ich kann mir ein eigenes Drehbuch ausdenken.

Ich danke Ihnen! Es gibt einen Grund, warum nach while in einem Makro kein Semikolon steht.

Makros sind eine gute Sache, aber die Grenze zwischen Gut und Böse ist in ihrem Fall noch feiner als bei einer Frau))) Man muss sehr, sehr vorsichtig mit ihnen sein. Und ja, in meinem Beispiel, nicht ';', sondern genau else, das sich auf if bezieht, das im Makro steht, nachdem Sie ; entfernt haben.

Ich kann sehr gut mit Makros umgehen, und in einem Fall wie dem Ihren verwende ich sie schon seit etwa 1,5 Jahren nicht mehr, das ist optimal:

inline bool CheckRead(){
   ...
}

if (!CheckRead()) return;
 

Nur kann ich hier nichts über Inline finden.

Und ich kann kein C++.

 

Guten Tag! Bitte helfen Sie mir!

Es gibt einen recht einfachen Code zum Öffnen und Ändern einer Bestellung. Die Funktionen OrderSend, OrderSelect und OrderModify werden in einer Schleife mit einer kleinen Verzögerung zwischen den Versuchen ausgeführt. Zur Minimierung von Kommunikationsfehlern usw.

Es passiert Folgendes: Der Auftrag wird normal geöffnet, dann wird StopLoss erfolgreich geändert und TakeProfit erfolgreich geändert. Aber wenn ich TP setze, wird StopLoss annulliert. Ich kann den Grund dafür nicht verstehen.

Hier ist dieser Teil des Codes:

send = 5; //maximale Anzahl von Versuchen, einen Auftrag zu erteilen

tick=0;

sendschet=0; //Versuchszähler

while(!tick && sendschet<=send)

{

tick=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lot,2),Bid,150,0.0,0.0,komm,MagNum,0,Yellow);

sendschet++;

Sleep(1000); //Verzögere 1 Sekunde bis zum nächsten Versuch

}

select = 5; //Maximale Anzahl von Versuchen, eine Bestellung auszuwählen

slschet=0; //Versuchszähler für Auftragsauswahl

while(!OrderSelect(tick,SELECT_BY_TICKET) && slschet<=select)

{

slschet++;

Sleep(500); //Verzögere 0,5 Sekunden bis zum nächsten Versuch

}

if(slschet<select) //die Anzahl der Versuche war geringer als die maximale Anzahl, das bedeutet, dass die Bestellung erfolgreich ausgewählt wurde

{

modify = 5; //Maximale Anzahl von Versuchen, die Bestellung zu ändern

mdschet=0;

while(!OrderModify(tick,OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Yellow)

&& mdschet<=modify)

{

mdschet++;

Sleep(500); //Verzögere 0,5 Sekunden bis zum nächsten Versuch

}

*Hier ist alles in Ordnung - SL ist eingestellt

mdschet=0; //Zähler vor Änderung des TP zurücksetzen

while(!OrderModify(tick,OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(TP,Digits),0,Yellow)

&& mdschet<=modify)

{

mdschet++;

Schlaf(500);

}

}

*Wo TP normal gesetzt wird, aber SL bereits gleich 0,0 ist. Es stellt sich also heraus, dass OrderStopLoss() gleich 0,0 ist.

Die Auswahl der Aufträge hat sich jedoch nicht geändert.

Wenn wir OrderSelect noch einmal zwischen SL und TP einfügen, scheint alles zu funktionieren. Aber das widerspricht der Logik.

Ich danke Ihnen im Voraus für Ihre Hilfe in dieser Angelegenheit.

 

Guten Tag!

Bitte helfen Sie mir bei der Änderung der Größe eines dynamischen Arrays.

Nehmen wir an, ich möchte ein Array einrichten:

int DB[][8];

Dann in der ersten Subroutine in der Schleife, möglicherweise mehrmals (keine Fragen dazu - bisher funktioniert es wie vorgesehen):

ushort i = 0;
ArrayResize(DB,i+1);

Im nächsten Unterprogramm werde ich Elemente in der ersten Dimension der Schleife hinzufügen. Ich weiß nicht, wie viele im Voraus. Ich weiß, dass es langsamer ist, als wenn man die Dimension vorher angibt. Aber ich denke, dass bis zu 500 zusätzliche Einträge pro Jahr keinen Unterschied machen.

Die Frage ist, wie ich die vorhandene Größe des Arrays in diesem Unterprogramm herausfinden kann. Man nimmt sie als Basisgröße und fügt ihr einen neuen Wert hinzu.

ArraySize() nehmen und durch 8 dividieren? Oder gibt es eine andere Funktion, die für mich besser geeignet wäre?

Vielen Dank im Voraus!

 
Oleg_Ko:

Guten Tag!

Bitte helfen Sie mir bei der Änderung der Größe eines dynamischen Arrays.

Nehmen wir an, ich möchte ein Array einrichten:

Dann in der ersten Subroutine in der Schleife, möglicherweise mehrmals (keine Fragen dazu - bisher funktioniert es wie vorgesehen):

Im nächsten Unterprogramm werde ich Elemente in der ersten Dimension der Schleife hinzufügen. Ich weiß nicht, wie viele im Voraus. Ich weiß, dass es langsamer ist, als wenn man die Dimension vorher angibt. Aber ich denke, dass bis zu 500 zusätzliche Einträge pro Jahr keinen Unterschied machen.

Die Frage ist, wie ich die vorhandene Größe des Arrays in diesem Unterprogramm herausfinden kann. Man nimmt sie als Basisgröße und fügt ihr einen neuen Wert hinzu.

ArraySize() nehmen und durch 8 dividieren? Oder gibt es eine andere Funktion, die für mich besser geeignet wäre?

Vielen Dank im Voraus!

ArrayRange()

Документация по MQL5: Операции с массивами / ArrayRange
Документация по MQL5: Операции с массивами / ArrayRange
  • www.mql5.com
Операции с массивами / ArrayRange - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin:

ArrayRange()

Artem, ich danke dir.
 

Guten Tag.

Ich habe schon sehr lange nicht mehr mit MT4 gehandelt und habe beschlossen, es wieder zu versuchen. Ich habe zuvor das Skript (im Anhang) verwendet, aber jetzt läuft es nicht mehr, bitte sehen Sie nach, was schief gelaufen ist.

Dateien:
RiskAdvisor.mq4  12 kb
 
Nauris Zukas:

Hallo!
Gibt es eine Möglichkeit, sofort CopyHigh die Anzahl der Elemente eines Arrays in einem beliebigen Zeitraum zu erfahren?

Ich werde sie selbst beantworten, vielleicht stößt jemand über eine Suchmaschine auf die Frage.

SeriesInfoInteger(symbol_name,timeframe,SERIES_BARS_COUNT);
 
Nauris Zukas:

Ich werde sie selbst beantworten, vielleicht stößt jemand über eine Suchmaschine auf die Frage.

Auch Bars(), iBars()
 
Artyom Trishkin:
Auch Bars(), iBars()

Mit Bars() können Sie nicht die Anzahl der Array-Elemente in einem beliebigen Zeitraum ermitteln, sondern nur im aktuellen Diagramm.

Grund der Beschwerde: