Структура торговой транзакции - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Ich versuche, dem Benutzer die Möglichkeit zu geben, beide Zeitrahmen und deren Anzahl aus dem Menü des Indikatoreinrichtungsfensters auszuwählen:
und ich möchte, dass die ausgewählten Zeiträume direkt in PArray gespeichert werden. Aus dem obigen Beispiel geht jedoch hervor, dass ich dem Array die im Programm voreingestellten Werte zuweise und nicht die von einem Benutzer eingegebenen Werte. Darüber hinaus erzeugt der Compiler Warnungen:
Wenn ich versuche, die letzte Zeile zu ersetzen durch:
erzeugt der Compiler insgesamt einen Fehler:
Außerdem bedeutet NO_PERIOD=0PERIOD_CURRENT, und das brauche ich nicht, ich brauche etwas wie false oder EMPTY_VALUE, aber die passen überhaupt nicht.
Die Symboleinstellungen im Tester halten nicht, die Handelszeiten werden am Donnerstag und Freitag gekürzt, deshalb gibt es immer einen Fehler Markt geschlossen, Positionen werden nicht eröffnet, Optimierung ist unmöglich, der Roboter funktioniert nicht richtig, andere Broker sind in Ordnung, aber ich brauche diesen, was soll ich tun? Ich weiß es nicht, aber ich hatte noch nie ein solches Problem. Ich weiß nicht, ob ich den Handelsroboter bereits registriert habe, aber ich konnte noch nie eine Position eröffnen. Wer weiß, was zu tun ist? Ein neues Konto registriert, das Terminal von temporären Dateien bereinigt, ein anderes Terminal ausprobiert, keine Hilfe. Videoprobleme https://radikal.ru/video/1HA3UfUNVZt
Können Sie uns sagen, welche Methoden zur Bekämpfung des Fehlers "array out of range" zur Verfügung stehen? Erstens kann ich Print nicht verwenden, um ein Array-Element zu drucken, das den Bereich verlassen hat, weil der Fehler zu weit vor dem Element liegt und es nie zum Drucken kommt. Zweitens tritt dieser Fehler nicht systematisch auf, sondern nach Belieben: Er ist einmal aufgetreten, und der Indikator hat nicht funktioniert (er ist jedoch in der Indikatorliste im Diagramm vorhanden), alle anderen Male ist er nicht aufgetreten, ohne dass der Indikator neu kompiliert wurde, was nichts über seine Änderung aussagt.
x572intraday: Sagen Sie mir, welche Methoden der Bekämpfung gibt es für das Abfangen und Korrigieren von "Array out of range" Fehler?
ArrayResize() vor dem Schreiben eines Array-Elements die Anzahl der Elemente zählen und dort eingeben, die im Array sein sollen, oder ein dynamisches Array verwenden, das selbst fett wird. Du gehst einfach über das Array hinaus, z. B. gibst du eine Größe von 100 Elementen an, aber da das erste Element die Nummer 0 ist, kommen manche Leute durcheinander. Wenn du die Zahlen in eine Reihe schreibst, passen 0-99. Ich bin kein professioneller Programmierer, wenn überhaupt (aber ich kann), das erste, was in meinem Kopf kam, es funktioniert)))
Объект динамического массива - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Führen Sie ArrayResize() aus, bevor Sie ein Element des Arrays schreiben, zählen Sie die Anzahl der Elemente, die im Array sein sollen, und geben Sie sie dort ein, oder verwenden Sie ein dynamisches Array, das selbst wächst.
Eigentlich ist es sowieso dynamisch. Aus der Hilfe:"Die Funktion kann nur auf dynamische Arrays angewendet werden. Beachten Sie, dass dynamische Arrays, die von der Funktion SetIndexBuffer() als Indikatorpuffer zugewiesen werden, nicht in ihrer Größe verändert werden sollten. Bei Indikatorpuffern werden alle Größenänderungsoperationen vom ausführenden Subsystem des Terminals durchgeführt. "Aber es ist kein Indikatorpuffer, man muss also mit den Händen und dem Kopf denken...
Eigentlich ist sie bereits dynamisch. Aus der Hilfe:"Die Funktion kann nur auf dynamische Arrays angewendet werden. Sie sollten bedenken, dass dynamische Arrays, die von der Funktion SetIndexBuffer() als Indikatorpuffer zugewiesen werden, nicht in ihrer Größe verändert werden können. Bei Indikatorpuffern werden alle Größenänderungsoperationen vom ausführenden Subsystem des Terminals durchgeführt. "Aber es ist kein Indikatorpuffer, also musst du mit deinen Händen und deinem Kopf denken...
Today we're starting a patchy subject, which will combine many different things. This is why I decided to split it into parts. Out final goal is exception handling, but before we can address it, we
2020.12.3015:25:38.629 Experts automated trading is enabled
2020.12.3015:25:39.159 Test1 (EURUSD,M1) 4752 Торговля для эксперта запрещена
2020.12.3015:25:40.297 Test1 (EURUSD,M1) 4752 Торговля для эксперта запрещена
2020.12.3015:25:40.397 Test1 (EURUSD,M1) 4752 Торговля для эксперта запрещена
2020.12.3015:25:40.499 Test1 (EURUSD,M1) 4752 Торговля для эксперта запрещена
2020.12.3015:25:40.725 Test1 (EURUSD,M1) 4752 Торговля для эксперта запрещена
2020.12.3015:25:42.781 Test1 (EURUSD,M1) 4752 Торговля для эксперта запрещена
2020.12.3015:25:43.129 Test1 (EURUSD,M1) 4752 Торговля для эксперта запрещена
2020.12.3015:25:43.758 Experts automated trading is disabled
Das Ergebnis sollte wie folgt aussehen:
2020.12.3015:29:58.406 Experts automated trading is enabled
2020.12.3015:30:02.247 Test1 (EURUSD,M1) 4756 Не удалось отправить торговый запрос
2020.12.3015:30:02.368 Test1 (EURUSD,M1) 4756 Не удалось отправить торговый запрос
2020.12.3015:30:02.486 Test1 (EURUSD,M1) 4756 Не удалось отправить торговый запрос
2020.12.3015:30:04.320 Experts automated trading is disabled
Offensichtlich muss immer ArraySize(Arr)=1. Dies ist der Fall bei erfolgreichem Kopieren. Aber in welchen Fällen könnte das Kopieren der Bar scheitern? Denn wennder Fehler "array out of range" auftritt, zeigt das Terminal auf Arr[0].
x572intraday: Offensichtlich sollte es immer ArraySize(Arr)=1 sein. Dies ist der Fall bei erfolgreichem Kopieren. Aber in welchen Fällen könnte das Kopieren der Bar scheitern? Wenn derFehler "array out of range" auftritt, zeigt das Terminal auf Arr[0].
Habe den Fehler doch noch gefunden, Zitat aus der Hilfe:
4401
Angeforderter Verlauf nicht gefunden.
In das Logbuch ausgedruckt - verstanden:
2020.12.3114:45:20.474 test (EURUSD,H2) ArraySize(Arr)=0; copied=-1; TF=PERIOD_H22020.12.3114:45:20.474 test (EURUSD,H2) Error Code = 4401
Was mache ich jetzt damit, wohin soll ich gehen? Bin ich ein schlechtes Blatt oder...? Ich kopiere ja nur einen Balken von 0 auf 1. Wie kann sie (die Geschichte) nicht sein? Dies umso mehr, als der Fehler nicht immer vorhanden ist. Oder muss man den Verlauf vorher zwangsweise überprüfen und herunterladen?
Fehler in der Beschreibung:
Struktur eines Handelsgeschäfts (MqlTradeTransaction)
Dieses Feld heißt: time_type
Ich versuche, dem Benutzer die Möglichkeit zu geben, beide Zeitrahmen und deren Anzahl aus dem Menü des Indikatoreinrichtungsfensters auszuwählen:
und ich möchte, dass die ausgewählten Zeiträume direkt in PArray gespeichert werden. Aus dem obigen Beispiel geht jedoch hervor, dass ich dem Array die im Programm voreingestellten Werte zuweise und nicht die von einem Benutzer eingegebenen Werte. Darüber hinaus erzeugt der Compiler Warnungen:
Wenn ich versuche, die letzte Zeile zu ersetzen durch:
erzeugt der Compiler insgesamt einen Fehler:
Außerdem bedeutet NO_PERIOD=0PERIOD_CURRENT, und das brauche ich nicht, ich brauche etwas wie false oder EMPTY_VALUE, aber die passen überhaupt nicht.
Wie kann ich es reparieren?
Ich habe es fast geschafft.
Sagen Sie mir, welche Methoden der Bekämpfung gibt es für das Abfangen und Korrigieren von "Array out of range" Fehler?
ArrayResize() vor dem Schreiben eines Array-Elements die Anzahl der Elemente zählen und dort eingeben, die im Array sein sollen, oder ein dynamisches Array verwenden, das selbst fett wird. Du gehst einfach über das Array hinaus, z. B. gibst du eine Größe von 100 Elementen an, aber da das erste Element die Nummer 0 ist, kommen manche Leute durcheinander. Wenn du die Zahlen in eine Reihe schreibst, passen 0-99. Ich bin kein professioneller Programmierer, wenn überhaupt (aber ich kann), das erste, was in meinem Kopf kam, es funktioniert)))
Führen Sie ArrayResize() aus, bevor Sie ein Element des Arrays schreiben, zählen Sie die Anzahl der Elemente, die im Array sein sollen, und geben Sie sie dort ein, oder verwenden Sie ein dynamisches Array, das selbst wächst.
Eigentlich ist es sowieso dynamisch. Aus der Hilfe:"Die Funktion kann nur auf dynamische Arrays angewendet werden. Beachten Sie, dass dynamische Arrays, die von der Funktion SetIndexBuffer() als Indikatorpuffer zugewiesen werden, nicht in ihrer Größe verändert werden sollten. Bei Indikatorpuffern werden alle Größenänderungsoperationen vom ausführenden Subsystem des Terminals durchgeführt. "Aber es ist kein Indikatorpuffer, man muss also mit den Händen und dem Kopf denken...
Eigentlich ist sie bereits dynamisch. Aus der Hilfe:"Die Funktion kann nur auf dynamische Arrays angewendet werden. Sie sollten bedenken, dass dynamische Arrays, die von der Funktion SetIndexBuffer() als Indikatorpuffer zugewiesen werden, nicht in ihrer Größe verändert werden können. Bei Indikatorpuffern werden alle Größenänderungsoperationen vom ausführenden Subsystem des Terminals durchgeführt. "Aber es ist kein Indikatorpuffer, also musst du mit deinen Händen und deinem Kopf denken...
Das Problem, solche Fehler abzufangen, wird nur durch die Verwendung von "Schichten" gelöst, z. B. durch eine benutzerdefinierte Array-Klasse, die die Adressierung abfängt.
Wenn der EA bei deaktiviertem Algotrading gestartet und dann das Algotrading aktiviert wird:
Dem Fehlercode zufolge bleibt das Handelsverbot bestehen, obwohl die Eigenschaft TERMINAL_TRADE_ALLOWED wahr ist
Das Ergebnis sollte wie folgt aussehen:
Offensichtlich sollte es immer ArraySize(Arr)=1 sein. Dies ist der Fall bei erfolgreichem Kopieren. Aber in welchen Fällen könnte das Kopieren der Bar scheitern? Wenn derFehler "array out of range" auftritt, zeigt das Terminal auf Arr[0].
Habe den Fehler doch noch gefunden, Zitat aus der Hilfe:
4401
Angeforderter Verlauf nicht gefunden.
In das Logbuch ausgedruckt - verstanden:
Was mache ich jetzt damit, wohin soll ich gehen? Bin ich ein schlechtes Blatt oder...? Ich kopiere ja nur einen Balken von 0 auf 1. Wie kann sie (die Geschichte) nicht sein? Dies umso mehr, als der Fehler nicht immer vorhanden ist. Oder muss man den Verlauf vorher zwangsweise überprüfen und herunterladen?