Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1501

 
Николай К:

Veuillez m'indiquer comment résoudre l'erreur 4806 - données demandées non trouvées. Je veux obtenir les données de différentes périodes de moyenne pour bolinger à partir de l'indicateur. Le Handle est reçu dans OnInit, mais pour mon objectif, il devrait être dansOnCalculate, d'où l'erreur. Aidez-moi à le comprendre par l'exemple.


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);
  }
//+------------------------------------------------------------------+
Organisé grossièrement comme ça, désolé pour l'intégrité.
 
Николай К:
Organisé comme ça, désolé pour l'intégrité.

Le handle de l'indicateur dans MQL5 doit être créé dans OnInit() !

 
Vladimir Karputov:

Le handle de l'indicateur dans MQL5 doit être créé dans OnInit() !

Il y aura donc une poignée distincte pour chaque période de calcul de la moyenne ?

 
Николай К:
C'est organisé comme ça, désolé pour la cohérence.

La ressource n'est pas libérée... mais sinon c'est correct, bien que non efficace.

après iMA(...) et les opérations avec celui-ci, vous devez appeler IndicatorRelease si vous n'en avez plus besoin.

La fonction IndicatorRelease() sert à libérer l'indicateur de la mémoire de l'ordinateur, à laquelle ce handle d'indicateur est passé.

Et une poignée d'indicateur peut être créée n'importe où, sauf à OnDeinit. Il suffit de se préoccuper de "ce qu'il faut faire en cas d'erreur de création".

 
@Vladimir Karputov @Maxim Kuznetsov Colle ou clou ? )) Tâche simple - préparation complexe, dans le mql4 cela se faisait en une ou deux fois. Alors, comment puis-je rassembler les données bolinger pour différents délais et périodes de calcul de la moyenne dans un seul tableau sans erreurs ?
 
Николай К:
@Vladimir Karputov @Maxim Kuznetsov Stick or Nail ? )) Tâche simple - préparation complexe, dans mql4 a été fait en un deux. Alors, comment puis-je rassembler les données bolinger pour différents délais et périodes de calcul de la moyenne dans un seul tableau sans erreurs ?

Vous avez raison, vous venez de manger toutes les poignées, c'est une ressource épuisable... vous devez les libérer.

hdl=iMA(....)

if (hdl!=INVALID_HANDLE) {

    /// do something

   IndicatorRelease(hdl);

}

voyez comment fxsaber l'a fait dans ses bibliothèques pour faciliter le passage de 4 à 5

 
MakarFX:
La première chose qui vient à l'esprit est de vérifier le fonctionnement de l'indicateur, puis de regarder l'EA.

Je n'y trouve rien, dans l'indicateur il n'y a pas de lignes comme - sorties si..., chaque tick est traité, et dans le robot vient chaque tick.

La m1 entière n'a pas de signal jusqu'à ce que la barre change et qu'un nouveau signal, rappelle le signal que tous les ticks regardent, le traitement d'une nouvelle barre ne l'est pas.

Et je vous rappelle que je dois tester dans 3 terminaux à la fois. Je serai enterré avec 3 terminaux dans ma main.

 
Fast235:

Je n'y trouve rien, dans l'indicateur il n'y a pas de lignes comme - sorties si..., chaque tick est traité, et dans le robot vient chaque tick.

La m1 entière n'a pas de signal jusqu'à ce que la barre change et qu'un nouveau signal, rappelle le signal que tous les ticks regardent, le traitement d'une nouvelle barre ne l'est pas.

Le robot n'a aucun signal dans tous les aspects du robot.

Peut-être dans l'indicateur le signal seulement quand la barre change...

Il est préférable de voir le code, bien sûr.

 
Bonjour Artem !
Je suis envieux de voir avec quelle rapidité les camarades de MQL5 codent en utilisant CTrade et d'autres classes, construites à l'origine dans MT5.
En raison de diverses circonstances, je dois coder en MQL4 et inventer mes propres constructions maladroites.
Peut-être existe-t-il déjà un tel ensemble de classes pour MQL4 ?
Merci d'avance)