Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   ArrayCopyRates() liefert out of range ??? (http://www.expert-advisor.com/forum/showthread.php?t=4887)

ralfbenker 14.04.16 22:00

ArrayCopyRates() liefert out of range ???
 
hab auch mal ein Problem. Ich möchte Ranges von bestimmten Zeitabschnitten bilden und lese dazu einmal täglich M30 Daten in ein Array.
Der EA läuft im M5

PHP-Code:

ArrayCopyRates(rates_m30,Symbol(),PERIOD_M30); 

danach lasse ich in einer Schleife Hochs/Tiefs der Periode bestimmen.

PHP-Code:

for (cnt=1;cnt<48;cnt++)
{
//Code für Hoch/Tief Bestimmung
if (rates_m30[cnt][3]>high)
high=rates_m30[cnt][3];
if (
rates_m30[cnt][2]<low)
low=rates_m30[cnt][2];


Wenn der EA in einem M30 Timeframe läuft funktioniert das wunderbar. Lasse ich den EA in einem M5 Timeframe laufen funktioniert das nur manchmal.
Der EA meldet dann Array out of range und das schon beim ersten Durchlauf der for-Schleife.

Woran kann das liegen, fehlende M30 Historie ??

Raul0 17.04.16 00:52

PHP-Code:

Woran kann das liegenfehlende M30 Historie ?? 

Du nutzt zur Berechnung in der Schleife doch nur die letzten 24 h, diese sollten da sein. Du rufst ein zweidimensionales Array auf zur Weiterverarbeitung in der Schleife, wurde das auch so angelegt?

Lasse Dir doch von dem Array mal die Gesamtgröße ausgeben.

ralfbenker 17.04.16 18:05

das ist ja das Verrückte, das Array ist als solches ausreichend dimensioniert mit.
ArrayDimension erhalte ich den Wert 2 und ArraySize liefert 25008.
Das Array ist als solches zweidimensional ausgelegt mit der Definition:

double rates_m30[60][6];

Wenn die Fehlermeldung kommt wird der EA bereits beim ersten Durchlauf der for Schleife abgebrochen. Ansonsten läuft der EA problemlos.

Top-SecreT 18.04.16 07:41

Dann lass dir doch
rates_m30[1][3]
und
rates_m30[1][2]
mal explizit ausgeben

traderdoc 18.04.16 10:24

Zitat:

Zitat von ralfbenker (Beitrag 34224)
das ist ja das Verrückte, das Array ist als solches ausreichend dimensioniert mit.
ArrayDimension erhalte ich den Wert 2 und ArraySize liefert 25008.
Das Array ist als solches zweidimensional ausgelegt mit der Definition:

double rates_m30[60][6];

Wieso liefert ArraySize() bei [60][6] 25008 und nicht 360?

traderdoc

ralfbenker 18.04.16 21:35

@traderdoc
das versteh ich auch nicht. Selbst wenn man die Null mitrechnet hätte das Array ja 61*7= 427 Felder. Oder wird durch ArrayCopyRates() automatisch ein Resize durchgeführt entsprechend der verfügbaren Bars in der Historie ?

Im Moment geht der Spaß. Sobald ne Historie auf'm Rechner ist funktioniert das Array ohne Fehler

traderdoc 18.04.16 21:57

Zitat:

Zitat von ralfbenker (Beitrag 34229)
@traderdoc
das versteh ich auch nicht. Selbst wenn man die Null mitrechnet hätte das Array ja 61*7= 427 Felder. Oder wird durch ArrayCopyRates() automatisch ein Resize durchgeführt entsprechend der verfügbaren Bars in der Historie ?

Im Moment geht der Spaß. Sobald ne Historie auf'm Rechner ist funktioniert das Array ohne Fehler

Nein, die Dimensionsbezeichnung [60][6] bedeutet:

1. Dimension: Elemente 0 .... 59 = 60
2. Dimension: Elemente 0 .... 5 = 6

Es bleibt bei 60 x 6 = 360

traderdoc

ralfbenker 19.04.16 06:23

@traderdoc
hab mir jetzt mal mit ArraySize() den Initialwert des Arrays anzeigen lassen, der ist 360.
Nach Ausführung der Funktion ArrayCopyRates() ändert sich der Wert von ArraySize(). Das bedeutet doch, dass durch das Füllen desArrays dessen Größe angepasst wird, wahrscheinlich an die Anzahl der Bars, die in der History verfügbar sind. Sonst kämen da nicht so hohe Werte wie 21804 Elemente raus.

Im Umkehrschluss schließe ich daraus, dass das Array auch verkleinert wird, wenn keine M30 Daten vorliegen.
Wie bringe ich dann also den EA der im M5 läuft dazu, M30 Daten in das Array zu laden?
Ich vermute mal, wenn in der History keine Daten vorliegen, lädt er auch keine ins Array und das liefert dann out of Range.

traderdoc 19.04.16 08:19

Das Sicherste wäre dann, immer vor der Benutzung der Arrays die Größe der Dimensionen zu ermitteln und nur innerhalb dieser, die Felder anzusprechen.

traderdoc

ralfbenker 19.04.16 18:50

@traderdoc
Danke für den Tipp, damit ist zumindest das Problem mit dem Fehler gelöst.
Allerdings tradet der EA dann nicht weil er ja die Vortagesrange nicht bestimmen kann. Hab keine Ahnung, wie ich enen EA im M5 dazu bringen kann, M30 Daten vom Broker zu laden.
Oder ich muss eben, da der EA im M5 läuft wirklich die M5 Daten zur Rangebestimmung verwenden. Das sind aber etliche Bars mehr und das wollte ich mir ersparen.

Im Moment läuft er auf allen Werten die ich teste problemlos. Vielleicht hatte ich auch nur wieder einen von meinen Schusslichkeitsfehlern in der for- Schleife
:-)


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:30 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum