Copybuffer no data Error

 

Also Leute ihr wist selber manchmal macht der Metatrader einfach Sachen die man nicht kapiert, ich probiere gerade ganz einfach den Buffer von einer Moving Average in ein Array zu laden und bekomme immer die Fehlermeldung "no data" sobald ich den wert fuer die Anzahl zu kopierender Candels von 1 auf 2 stelle oder eine noch groesere Zahl, ich will ja eigentlich nur mehr als ein Wert von der Moving Average in das Array kopieren und kapiere nicht warum das nicht funktioniert; schaut mal bitte mein derzeitiger Code:


//+------------------------------------------------------------------+
//|                        Copyright 2022, MetaQuotes Software Corp. |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property description "EA"
#property strict
//----

//+------------------------------------------------------------------+
//| Einstellungen                                                    |
//+------------------------------------------------------------------+

input int                  MA1_Period=5;                     // period of ma 
input int                  MA1_Shift=0;                      // shift 
input ENUM_MA_METHOD       MA1_Method=MODE_SMA;              // type of smoothing 
input ENUM_APPLIED_PRICE   MA1_Applied_Price=PRICE_CLOSE;    // type of price

//+------------------------------------------------------------------+
//| Globale variablen                                                |
//+------------------------------------------------------------------+

int Handle_MA_1;
bool Function_init_error = false;



//+------------------------------------------------------------------+
//| Function OnInit                                                  |
//+------------------------------------------------------------------+

int OnInit()
  {
//----
   //--- create handle of the indicator Moving Average
   Handle_MA_1=iMA(Symbol(),PERIOD_CURRENT,MA1_Period,MA1_Shift,MA1_Method,MA1_Applied_Price);
   //--- if the handle is not created
   if(Handle_MA_1==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the IMA indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(PERIOD_CURRENT),
                  GetLastError());
      //--- the indicator is stopped early
      Function_init_error=true;
      return(INIT_SUCCEEDED);
     }
   return(INIT_SUCCEEDED);
//----
  }

//+--------------------------------------------------------------------+
//| Function OnDeinit                                                  |
//+--------------------------------------------------------------------+

void OnDeinit(const int reason)
  {
//----
//----
  }


//+--------------------------------------------------------------------+
//| Function OnTimer                                                   |
//+--------------------------------------------------------------------+
void OnTick()
  {
//---
   //+------------------------------------------------------------------+
   //| Error bei Laden                                                  |
   //+------------------------------------------------------------------+

   if(Function_init_error)return;

   double MA1_Indikator_Array[10];

   if(CopyBuffer(Handle_MA_1,0,0,1,MA1_Indikator_Array)!=1)
     {
      Print("CopyBuffer from iMA 1 failed, no data");
      return;
     } 


   
     Comment(MA1_Indikator_Array[0],"  ",MA1_Indikator_Array[1]);


   return;
//----
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+


Wenn ich also einfach nur bei CopyBuffer folgendes schreibe 

CopyBuffer(Handle_MA_1,0,0,2,MA1_Indikator_Array)

dann gibt es eine Fehlermeldung "no data", aber in der Beschreibung fuer die Funktion CopyBuffer steht das man dort einstellt wieviel Werte von der Moving Average in das Array geladen werden sollen, ich bin mal gespannt ob jemand mir hier sagen kann was ich falsch mache?

 
Warum benutzt Du den MA1_Infikator_Buffer als statisches Array? Ich würde versuchsweise einfach mal die 10 weglassen.
 
Tobias Johannes Zimmer #:
Warum benutzt Du den MA1_Infikator_Buffer als statisches Array? Ich würde versuchsweise einfach mal die 10 weglassen.

Wenn ich folgende Kombination in den Code schreibe bekomme ich ein "array out of range" error


double MA1_Indikator_Array[];
   ArraySetAsSeries(MA1_Indikator_Array,true);

   if(CopyBuffer(Handle_MA_1,0,0,1,MA1_Indikator_Array)!=1)
     {
      Print("CopyBuffer from iMA 1 failed, no data");
      return;
     } 

also das ist schon echt schade wie der Metatarder hin und weider nicht will funktioniert es bei dir wenn du mein code in ein EA packst und mal testet?

 

ich habe jetzt zufaellig die Loesung gefunden, folgender Code funktioniert

if(CopyBuffer(Handle_MA_1,0,0,5,MA1_Indikator_Array)<0)
     {
      Print("CopyBuffer from iMA 1 failed, no data");
      return;
     } 
   ArraySetAsSeries(MA1_Indikator_Array,true);


Die Ryeckgabe von CopyBuffer < 0 muss man schreiben irgendwo hatte ich vorher von einem anderen EA den Code kopiert und da stand einfach !=1 deswegen funktionierte es nicht, aber insgesamt bin ich oft enttaeuscht von MT5 ich frage mich warum die das so kompliziert aufgebaut haben frueher konnte man doch ganz gemuetlich einfach die iMA() Funktion benutzen und alles damit ablesen, naja.

 

Hat es jetzt eigenetlich mit statischem oder dynamischem Array geklappt?

 
Tobias Johannes Zimmer #:

Hat es jetzt eigenetlich mit statischem oder dynamischem Array geklappt?

ja klappt beides lag nicht daran, ich bekam die Fehlermeldung weil die Pruefung der Rueckgabe von CopyBuffer war nicht korrekt, dort stand wenn Rueckgabe !=1 dann Fehlermeldung druecken, aber man muss schreiben wenn rueckgabe < 0 weil die rueckgabe 1 bedeutet im prinzip das es auch geklappt hat, ich hatte da einfach auf die schnelle ein Code von jemand kopiert und deswegen nicht gemerkt

 
Email Account #:

ja klappt beides lag nicht daran, ich bekam die Fehlermeldung weil die Pruefung der Rueckgabe von CopyBuffer war nicht korrekt, dort stand wenn Rueckgabe !=1 dann Fehlermeldung druecken, aber man muss schreiben wenn rueckgabe < 0 weil die rueckgabe 1 bedeutet im prinzip das es auch geklappt hat, ich hatte da einfach auf die schnelle ein Code von jemand kopiert und deswegen nicht gemerkt

Und was lernen wir daraus ?


Es macht Sinn, in der Dokumentation nach Informationen zu suchen. Auch wenn sie zugegeben extrem schlecht gemacht ist. Sei es drum sie ist aber da.

Dort stand der Beispielcode mit der Zeile

//--- try to copy
   if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0);
//--- return value of prev_calculated for next call
   return(rates_total);
  }

https://www.mql5.com/de/docs/series/copybuffer