Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 846

 
Pokrov:

Ich habe GetLastError nach Funktionen und wenn ein Fehler auftritt, wird es nicht zu diesem Block gehen (wie geschrieben) und Befehle werden nicht ausgeführt werden? Ich verstehe die Kette, z. B. OrderSend() -> GetLastError -> Fehlerblock Sleep(3000) RefreshRates() -> den Block verlassen und wenn die Bedingungen bestehen bleiben, wird OrderSend() erneut angefordert. Oder meine Überlegungen und Konzepte sind falsch. Ich verstehe, dass Sie den Rückgabewert 1 oder 0 in den Block schreiben wollen, aber meine Funktionen sind einfach nicht auf boolesche Werte wie SignalBuy bezogen, wenn ich richtig verstehe, sollten die Rückgabewerte dort zurückgegeben werden.

Machen Sie eine Schleife über die Anzahl der Handelsversuche bei Fehlern. Aktualisieren Sie das Handelsumfeld. Setzen Sie den Wert des vorherigen Fehlers zurück und senden Sie eine Handelsanfrage mit einer Prüfung des zurückgegebenen Ergebnisses. Wenn ein Fehler zurückgegeben wird, analysieren Sie diesen und beenden Sie je nach Fehlercode entweder den Zyklus vollständig oder führen Sie die erforderlichen Maßnahmen zur Behebung des Fehlers durch und fahren mit der nächsten Iteration des Zyklus fort. Wenn der Handel erfolgreich war, wird die Schleife unterbrochen und der Wert an das aufrufende Programm zurückgegeben, der der Programmlogik für die weitere Verarbeitung des Ergebnisses der Handelsanfrage entspricht (entweder das Flag für die erfolgreiche Ausführung der Funktion oder die Nummer des offenen Auftragstickets usw.).
 
Pokrov:

Ich habe GetLastError nach Funktionen und wenn ein Fehler auftritt, wird es nicht zu diesem Block gehen (wie geschrieben) und Befehle werden nicht ausgeführt werden? Ich verstehe die Kette, z. B. OrderSend() -> GetLastError -> Fehlerblock Sleep(3000) RefreshRates() -> den Block verlassen und wenn die Bedingungen bestehen bleiben, wird OrderSend() erneut angefordert. Oder meine Überlegungen und Konzepte sind falsch. Ich verstehe, dass Sie den Rückgabewert 1 oder 0 in den Block schreiben wollen, aber meine Funktionen sind einfach nicht auf boolesche Werte wie SignalBuy bezogen, wenn ich richtig verstehe, sollten die Rückgabewerte dort zurückgegeben werden.

Ich möchte noch hinzufügen, dass es in Ihrem Beispiel keine Reaktion gibt, wenn ein Fehler auftritt. Wir haben es überprüft, und es war nicht der Fall, außer dass wir beschlossen haben, ein bisschen zu schlafen oder die Daten zu aktualisieren. Beenden Sie einfach nach Beendigung der Funktion OnTick()
 
Guten Tag!

Ich brauche einen Rat. Je nach den Bedingungen sollte die Position geschlossen und nach 121 Sekunden eine neue Position eröffnet werden. Wie kann ich das mit Sleep(121000) machen?

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
Sleep(121000);
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}
 
abeiks:
Guten Tag!

Ich brauche einen Rat. Je nach den Bedingungen sollte die Position geschlossen und nach 121 Sekunden eine neue Position eröffnet werden. Wie kann ich das mit Sleep(121000) machen?

Hilfe: OnTimer()
 
artmedia70:
OnTimer() zur Rettung
Ich danke Ihnen! Ich habe OnTimer() nie verwendet und dieser Teil des Codes befindet sich in void OnTick(). Kann ich die Funktion OpenPosition() mit OnTimer() behandeln? Wenn Sie können, korrigieren Sie bitte Code, wie man OnTimer() dort richtig einfügen...
void OnTick()
{
...

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
EventSetTimer(121); 
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}

...   
}
 

Ich habe gerade Windows 7 neu installiert und wollte Mt4 installieren, das Problem ist, dass die Dateien nicht heruntergeladen werden, was soll ich tun?

 
Alexej und Artem, ich danke Ihnen für Ihre fachkundigen Kommentare und Ratschläge!
 
abeiks:
Danke! Ich habe OnTimer() nie verwendet. Dieser Teil des Codes befindet sich in void OnTick(). Wird die Funktion OpenPosition() dann von OnTimer() behandelt? Wenn Sie können, korrigieren Sie bitte Code, wie man OnTimer() dort korrekt einfügen...

Der Timer wird in OnInit() gestartet

EventSetTimer(1); // раз в секунду

Um den Countdown zu starten, müssen Sie die Schlusszeit der letzten Position im Timer ermitteln und ab dieser Zeit 121 Sukunden zählen. Um das Flag zu übergeben, das es Ihnen erlaubt, eine neue Position zu öffnen, verwenden Sie eine globale Variable, deren Geltungsbereich das gesamte Programm umfasst. Sie können dafür sorgen, dass sie anfangs einen höheren Wert als 121 enthält, z. B. 122 (Sie können die Wartezeit in den Einstellungen ändern).

In OnTick() wird diese Variable überprüft. Wenn sie größer als 121 ist und es keine Position gibt, öffnen Sie eine Position und setzen die Variable auf Null zurück, nachdem Sie überprüft haben, ob sie erfolgreich geöffnet wurde.

Sobald die Position geschlossen wird, sieht der Timer den Zeitpunkt des Schließens (er tut dies fortlaufend einmal pro Sekunde), und wenn von der aktuellen Zeit bis zum Schließzeitpunkt der Position weniger als 121 Sekunden vergangen sind, beginnt der Timer zu zählen - jede Sekunde wird der Variablenwert um 1 erhöht.

Ungefähr so. Möglicherweise liegt ein Fehler vor - wenn die Position noch nicht geschlossen wurde, ist ihre Schließungszeit gleich Null. Dies kann zu einem Problem beim Starten des Countdowns führen. Sie könnten die Variable z. B. auf -1 zurücksetzen.

Ja, vergessen Sie nicht, den Timer in OnDeinit() zu zerstören:

//+------------------------------------------------------------------+
   void OnDeinit(const int reason) {EventKillTimer();}
//+------------------------------------------------------------------+
 
artmedia70:

Der Timer wird in OnInit() gestartet

Um den Countdown zu starten, müssen Sie den Zeitpunkt im Timer finden, an dem die letzte Position geschlossen wurde, und von diesem Zeitpunkt an 121 Sekunden zählen. Um das Flag zu übergeben, das Ihnen erlaubt, eine neue Position zu öffnen, verwenden Sie eine globale Variable, die für das gesamte Programm skalierbar ist. Sie können dafür sorgen, dass er anfangs einen höheren Wert als 121 enthält, z. B. 122 (Sie können die Wartezeit in den Einstellungen ändern).

In OnTick() überprüfen Sie diese Variable. Wenn sie größer als 121 ist und es keine Position gibt - öffnen Sie eine Position - und setzen Sie die Variable auf Null zurück, nachdem Sie überprüft haben, ob sie erfolgreich geöffnet wurde.

Sobald die Position geschlossen wird, sieht der Timer den Zeitpunkt des Schließens (er tut dies kontinuierlich einmal pro Sekunde) und wenn von der aktuellen Zeit bis zum Schließen der Position weniger als 121 Sekunden vergangen sind, beginnt der Timer zu zählen - jede Sekunde wird der Wert der Variablen um 1 erhöht.

Ungefähr so. Möglicherweise liegt ein Fehler vor - wenn die Position noch nicht geschlossen wurde, ist ihre Schließungszeit gleich Null. Dies kann zu einem Problem beim Starten des Countdowns führen. Sie könnten die Variable z. B. auf -1 zurücksetzen.

Ja, vergessen Sie nicht, den Timer in OnDeinit() zu zerstören:

Verstanden, danke. Ich hatte gehofft, es in einer Zeile zu schaffen, aber es könnte etwas länger dauern.

 
abeiks:

Ich verstehe, danke. Ich hatte gehofft, es in einer Zeile zu schaffen, aber ich denke, es wird mehr Arbeit erfordern.