Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1501

 
Николай К:

Bitte teilen Sie mir mit, wie ich den Fehler 4806 - angeforderte Daten nicht gefunden - beheben kann. Ich möchte die Daten verschiedener Mittelungszeiträume für Bolinger aus dem Indikator abrufen. Das Handle wird in OnInit empfangen, aber für meinen Zweck sollte es inOnCalculate sein, daher der Fehler. Helfen Sie mir, es durch ein Beispiel zu verstehen.


Code
 
//+------------------------------------------------------------------+
//|                                                          вап.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  int limit=rates_total-prev_calculated;
   if(limit>1) 
     {
      limit=rates_total-1;                 
     }
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(i>=rates_total-10) 
         continue;

      ArrayInitialize(middle1,0);
      ArrayInitialize(middle2,0);


      for(BandsPeriod=2; BandsPeriod<=5; BandsPeriod++)
        {
         int T=3;
         Handle1=iMA(Symbol(),PERIOD_CURRENT,BandsPeriod,InpBandsShift,MODE_SMA,PRICE_HIGH);
         Handle2=iMA(Symbol(),PERIOD_CURRENT,BandsPeriod,InpBandsShift,MODE_SMA,PRICE_LOW);
         count=Bars(Symbol(),PERIOD_CURRENT)-10;
         if(!iGetArray(Handle1,BASE_LINE,start_pos,count,middle1) ||
            !iGetArray(Handle2,BASE_LINE,start_pos,count,middle2))// ||
            //CopyRates(Symbol(),PERIOD_CURRENT,start_pos,count,rates)!=count)

           {
            return(false);
           }
        }
      //--- return value of prev_calculated for next call
      return(rates_total);
     }
     }
//+------------------------------------------------------------------+
   
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      if(1==1)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      if(1==1)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                     __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+
Ungefähr so organisiert, sorry für die Integrität.
 
Николай К:
So organisiert, sorry für die Integrität.

Der Indikator-Handle in MQL5 muss in OnInit() erstellt werden!

 
Vladimir Karputov:

Der Indikator-Handle in MQL5 muss in OnInit() erstellt werden!

Dann wird es für jeden Mittelungszeitraum einen eigenen Griff geben?

 
Николай К:
Es ist so organisiert, entschuldigen Sie die Konsistenz.

Die Ressource wird nicht freigegeben... aber ansonsten ist es korrekt, wenn auch nicht effizient

nach iMA(...) und Operationen damit müssen Sie IndicatorRelease aufrufen, wenn Sie ihn nicht mehr benötigen

Die Funktion IndicatorRelease() dient dazu, den Indikator aus dem Speicher des Computers freizugeben, an den dieser Indikator-Handle übergeben wird.

Und ein Indikator-Handle kann überall erstellt werden, außer bei OnDeinit. Machen Sie sich nur Gedanken darüber, was im Falle eines Erstellungsfehlers zu tun ist".

 
@Vladimir Karputov @Maxim Kuznetsov Kleber oder Nagel? )) Einfache Aufgabe - komplexe Vorbereitung, in mql4 war es in ein oder zwei erledigt. Wie kann ich also die Bolinger-Daten für verschiedene Zeitrahmen und Mittelungszeiträume in einem Array zusammenfassen, ohne dass Fehler auftreten?
 
Николай К:
@Vladimir Karputov @Maxim Kuznetsov Nageln oder nageln? )) Einfache Aufgabe - komplexe Vorbereitung, in mql4 wurde in einem zwei getan. Wie kann ich also die Bolinger-Daten für verschiedene Zeitrahmen und Mittelungszeiträume in einem Array zusammenfassen, ohne dass Fehler auftreten?

Du hast recht, du hast gerade alle Griffe gegessen, es ist eine erschöpfbare Ressource... du musst sie befreien.

hdl=iMA(....)

if (hdl!=INVALID_HANDLE) {

    /// do something

   IndicatorRelease(hdl);

}

siehe, wie fxsaber es in seinen Bibliotheken gemacht hat, um den Wechsel von 4 zu 5 zu erleichtern

 
MakarFX:
Das erste, was mir in den Sinn kommt, ist, die Funktionsweise des Indikators zu überprüfen und dann den EA zu beobachten

Ich kann dort nichts finden, im Indikator gibt es keine Zeilen wie - Ausgaben wenn..., jeder Tick wird verarbeitet, und im Roboter kommt jeder Tick.

Die gesamte m1 hat kein Signal, bis die Bar Änderungen und ein neues Signal, erinnern das Signal alle Zecken beobachten, die Verarbeitung eines neuen bar ist nicht.

Und ich erinnere Sie daran, dass ich 3 Terminals auf einmal testen muss. Ich werde mit 3 Terminals in der Hand begraben werden.

 
Fast235:

Ich kann dort nichts finden, im Indikator gibt es keine Zeilen wie - Ausgaben wenn..., jeder Tick wird verarbeitet, und im Roboter kommt jeder Tick.

Die gesamte m1 hat kein Signal, bis die Bar Änderungen und ein neues Signal, erinnern das Signal alle Zecken beobachten, die Verarbeitung eines neuen bar ist nicht.

Der Roboter hat in allen Bereichen des Roboters kein Signal.

Vielleicht im Indikator das Signal nur, wenn der Balken ändert...

Es ist natürlich besser, den Code zu sehen.

 
Hallo Artem!
Ich bin neidisch, wenn ich sehe, wie schnell die Kameraden in MQL5 mit CTrade und anderen Klassen programmieren, die ursprünglich in MT5 entwickelt wurden.
Aufgrund verschiedener Umstände muss ich in MQL4 programmieren und mir meine eigenen umständlichen Konstrukte ausdenken.
Vielleicht gibt es eine solche Reihe von Klassen für MQL4 bereits?
Vielen Dank im Voraus)