Copy Rates

 

Hallo,


kann mir hier mal wer weiterhelfen? darf ich die Variablen nicht so deklarieren? muss ich hier noch einen weiteren Arry deklarieren?


   MqlTick tick;
   if(!SymbolInfoTick(Symbol(),tick)) GetLastError();

   MqlRates rates[];
   int copied=CopyRates(NULL,0,0,8,rates);
      if(copied<=0) 
      Print("Fehler des Kopieren von Preisdaten ",GetLastError()); 
   //else Print("Kopiert ",ArraySize(rates)," Bars"); 
   

   double hoch[],tief[],close[], TP[];
   
  // Print(rates[8].high);
   
   for(int i=0;i < 8; i++)
     {
      hoch[i] = rates[i].high;
      tief[i] = rates[i].low;
      close[i]= rates[i].close;
      
      TP[i] = (hoch[i] + tief[i] + close[i] ) /3;
      Print(TP[i]);
      
     }


in der for schleife kommt immer ein Error. Mir ist aber nicht ganz klar warum?


lg

amando

 
amando:

Hallo,


kann mir hier mal wer weiterhelfen? darf ich die Variablen nicht so deklarieren? muss ich hier noch einen weiteren Arry deklarieren?



in der for schleife kommt immer ein Error. Mir ist aber nicht ganz klar warum?


lg

amando

 

 

   ArrayResize(hoch,8);
   ArrayResize(tief,8);
   ArrayResize(close,8);
  
  

Dynamische musst du vor dem Füllen eine feste Größe zuweisen
 
Christian:

 

 

   ArrayResize(hoch,8);
   ArrayResize(tief,8);
   ArrayResize(close,8);
  
  

Dynamische musst du vor dem Füllen eine feste Größe zuweisen

Danke, auf die Idee wäre ich nicht gekommen, ist ja fast ganz logisch.

jetzt funktioniert es


ist das generell, das ich einen Array festlegen muss und anschliessend die Größe zuweise? 

wenn ich in einem EA einen iCustom einbaue dann definiere ich ja auch nur den Array ohne einen Array Resize?

 
amando:

Danke, auf die Idee wäre ich nicht gekommen, ist ja fast ganz logisch.

jetzt funktioniert es


ist das generell, das ich einen Array festlegen muss und anschliessend die Größe zuweise? 

wenn ich in einem EA einen iCustom einbaue dann definiere ich ja auch nur den Array ohne einen Array Resize?

Es geht darum das der Compiler weis wieviel Speicher er für die Variable  reservieren muss.

Bei iCustom steht das eventuell schon fest, bin mir da aber nicht sicher . Hab die nie benutzt.

Bei x[] auf jeden Fall immer.

 
iCustom klingt nach einem Indikator. Indikatoren verwenden intern mindestens ein Array zum Ablegen von Indikator-Daten, ob es der gemittelte Preis, eine Farbe etc. ist. Man nennt sollche Arrays auch oft Puffer oder Buffer und deren Größe wird durch MetaTrader verwaltet, man sollte also nicht mit ArrayResize() an einem Indikator-Puffer rum werkeln.
Hier bei Dir sind hoch, tief, close, TP ja erstmal (per Deiner Deklaration) dynamische Arrays, welche Du lokal(d.h. Variable existiert zwischen den äußeren geschweiften Klammern) verwendest.
Dynamisch sind sie, weil Du bei der Deklaration keine Größe festgelegt hast.
 
TutenchAmun:
iCustom klingt nach einem Indikator. Indikatoren verwenden intern mindestens ein Array zum Ablegen von Indikator-Daten, ob es der gemittelte Preis, eine Farbe etc. ist. Man nennt sollche Arrays auch oft Puffer oder Buffer und deren Größe wird durch MetaTrader verwaltet, man sollte also nicht mit ArrayResize() an einem Indikator-Puffer rum werkeln.
Hier bei Dir sind hoch, tief, close, TP ja erstmal (per Deiner Deklaration) dynamische Arrays, welche Du lokal(d.h. Variable existiert zwischen den äußeren geschweiften Klammern) verwendest.
Dynamisch sind sie, weil Du bei der Deklaration keine Größe festgelegt hast.

das heist eigentlich, ich könnte auch schon bei der Dekleration die Größe festlegen oder?

 

@amando:

Du verwendest CopyRates(...) und verteilst dann die einzelnen Werte in einer Schleife in die anderen Arrays.

Das geht doch viel einfacher und schneller mit CopyHigh(...), CopyLow(...), CopyOpen(...),CopyClose(...)

Diese Funktionen kümmern sich selber um die Größe der dynamischen Arrays.

Bei dynamischen Arrays kannst du ArraySetAsSeries anwenden, Bei statischen Arrays ist das nicht möglich.

Bei deinem Codebeispiel brauchts du dich lediglich um TP[] kümmern 'ArrayResize' und 'ArraySetAsSeries',

damit du mit Index 0 auf den aktuellsten Wert zugreifen kannst.

Die MQL5-Reference empfiehl aus Geschwindigkeitsgründen statische Array zu verwenden, sofern du den Umfang der Daten kennst. (lies auch selbst nach zB bei CopyHigh)

Dann ist die Indizierung allerdings anders. Is a bisserl kompex.

Grüße, Otto

Grund der Beschwerde: