(Résolu - Bug C_Ilchimoku) Erreur fréquemment rencontrée : 4806

 

Bonjour à tous, 

Je tiens à dire que j'ai passé ma journée à faire des recherches avant de poster, mais je n'ai pas encore compris comment corriger ce problème. 

Contexte : stratégie basée sur Ichimoku. 

Problématique : Si TF H4 tout va bien, si TF D1 je récupère une 4806 (je suis donc sur 2 TF)


Voici le code nettoyé, que j'utilise pour cibler l'erreur

//+------------------------------------------------------------------+
//| Global : Create Ichimoku                                         |
//+------------------------------------------------------------------+
CiIchimoku*m_Ichimoku;
ENUM_TIMEFRAMES HighestTF = PERIOD_W1;
ENUM_TIMEFRAMES MiddleTF = PERIOD_D1;

int OnInit()
  {
   m_symbol.Refresh();
//--- Start Ichimoku
   m_Ichimoku = new CiIchimoku();
   m_Ichimoku.Create(_Symbol,MiddleTF, 9, 26, 52);
   return(INIT_SUCCEEDED);
  }
void OnTick()
  {
    ResetLastError();
//--- C'est sur cette ligne que je rencontre l'anomalie 4806
   m_Ichimoku.Refresh(); // BIPBIP
// Print last error
   if(GetLastError() > 0)
     {
      Print("error : ", GetLastError());
     }
}

J'ai donc retrouvé la classe CiIchimoku (native), et regardé la méthode : 

//+------------------------------------------------------------------+
//| Refreshing of data in buffer                                     |
//+------------------------------------------------------------------+
bool CIndicatorBuffer::Refresh(const int handle,const int num)
  {
//--- check
   if(handle==INVALID_HANDLE)
     {
      SetUserError(ERR_USER_INVALID_HANDLE);
      return(false);
     }
//--- La ligne qui semble me poser problème
   m_data_total=CopyBuffer(handle,num,-m_offset,m_size,m_data);
//---
   return(m_data_total>0);
  }

Et là j'avoue je bloque, je ne sais pas comment gérer cette situation :s


Auriez vous une piste à me transmettre ? 


Je vous remercie d'avance de votre aide :)

 
Votre sujet a été déplacé vers la section : Expert Advisors et trading automatisé — Veuillez déterminer quelle section est la plus appropriée — https://www.mql5.com/en/forum/172166/page6#comment_49114893
 
Hello. Je suis sur mon smartphone c'est pas très pratique pour lire du code.
Mais je ne vois qu'un create...
m_Ichimoku.Create(_Symbol,MiddleTF

Il est où l'autre pour ton autre TF ?
 

J'utilise Ichimoku sur une seule TF (daily dans le cas présent), sur les autres TF j'utilise d'autres indicateurs - aucun problème de ce côté. 

Si je change la TF Ichimoku pour passer en weekly ou 4h, plus d'anomalie ... 

 

J'ai trouvé un post sans réponse, ou l'utilisateur semble avoir le même problème que moi : 

https://www.mql5.com/en/forum/367773

Failed to copy data from the iIchimoku indicator, error code 4806
Failed to copy data from the iIchimoku indicator, error code 4806
  • 2021.04.22
  • www.mql5.com
Hi, I want to use custom indicators in multi timeframe and multi symbols , but when I try to copy buffer of a time frame other than current chart t...
 
Lâches l'affaire avec la classe et passe par iichimoku(). Il se peut qu'il est au un bug "natif lol"

J'ai fais un code dans codebase
Penses a mettre une étoile
 

A priori la classe en question utilise iIchimoku :d


 

Bon, du coup j'ai refait une classe en me basant notamment sur ton travail :)

En revanche c'est loin d'être parfait, mais à priori utilisable en l'état et je n'ai pas eu l'erreur à nouveau. 

Si vous avez envie de tester faites vous plaisir ! 


//+------------------------------------------------------------------+
//|                                                   C_Ichimoku.mqh |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
class C_Ichimoku
  {
private:
   int               C_Handle;
   double            C_TenkanSen[];
   double            C_KijunSen[];
   double            C_SenkouSpanA[];

   double            C_SenkouSpanB[];
   double            C_ChikouSpan[];


public:
   double            TenkanSen(int i) { return this.C_TenkanSen[i]; }
   double            KijunSen(int i) { return this.C_KijunSen[i]; }
   double            SenkouSpanA(int i) { return this.C_SenkouSpanA[i]; }
   double            SenkouSpanB(int i) { return this.C_SenkouSpanB[i]; }
   double            ChikouSpan(int i) { return this.C_ChikouSpan[i]; }
   int               Init(string CS_Symbol, ENUM_TIMEFRAMES CS_Timeframe, int CS_TenkanSen, int CS_KijunSen, int CS_SenkouSpanB);
   bool              Refresh();
                     C_Ichimoku();
                    ~C_Ichimoku();
  };
//+------------------------------------------------------------------+
//| Init Ichimoku                                                    |
//+------------------------------------------------------------------+
int C_Ichimoku::Init(string CS_Symbol, ENUM_TIMEFRAMES CS_Timeframe, int CS_TenkanSen, int CS_KijunSen, int CS_SenkouSpanB)
  {

      ArraySetAsSeries(this.C_TenkanSen, true);
      ArraySetAsSeries(this.C_KijunSen, true);
      ArraySetAsSeries(this.C_SenkouSpanA, true);
      ArraySetAsSeries(this.C_SenkouSpanB, true);
      ArraySetAsSeries(this.C_ChikouSpan, true);

      /*--- Transforms the array into display buffer */          
      SetIndexBuffer( 0, this.C_TenkanSen, INDICATOR_DATA);
      SetIndexBuffer( 1, this.C_KijunSen, INDICATOR_DATA);
      SetIndexBuffer( 2, this.C_SenkouSpanA, INDICATOR_DATA);
      SetIndexBuffer( 3, this.C_SenkouSpanB,  INDICATOR_DATA);
      SetIndexBuffer( 4, this.C_ChikouSpan, INDICATOR_DATA);
      
      PlotIndexSetInteger(2, PLOT_SHIFT, CS_KijunSen);
      
      this.C_Handle = iIchimoku(CS_Symbol, CS_Timeframe, CS_TenkanSen, CS_KijunSen, CS_SenkouSpanB);

      if( this.C_Handle == INVALID_HANDLE)
      {
         Print("Erreur lors de la création de Ichimoku : ", GetLastError());
         return INIT_FAILED;
      }
      
      return INIT_SUCCEEDED;
  }
  
//+------------------------------------------------------------------+
//| Refresh Values Ichimoku                                          |
//+------------------------------------------------------------------+
bool C_Ichimoku::Refresh(void) {
   if (CopyBuffer(this.C_Handle, 0, 0, 27, this.C_TenkanSen) < 0) { return false; }
   if (CopyBuffer(this.C_Handle, 1, 0, 27, this.C_KijunSen) < 0) { return false; }
   if (CopyBuffer(this.C_Handle, 2, 0, 27, this.C_SenkouSpanA) < 0) { return false; }
   if (CopyBuffer(this.C_Handle, 3, 0, 27, this.C_SenkouSpanB) < 0) { return false; }
   if (CopyBuffer(this.C_Handle, 4, 0, 27, this.C_ChikouSpan) < 0) { return false; }
   return true;
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
C_Ichimoku::C_Ichimoku()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
C_Ichimoku::~C_Ichimoku()
  {
  }
//+------------------------------------------------------------------+

Exemple d'utilisation : 

//+------------------------------------------------------------------+
//| Create Ichimoku & MACD & ATR                                     |
//+------------------------------------------------------------------+
C_Ichimoku*m_Ichimoku;
//+------------------------------------------------------------------+
//| Define 3 timeframes for analyze                                  |
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES HighestTF = PERIOD_W1;
ENUM_TIMEFRAMES MiddleTF = PERIOD_D1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Start Ichimoku
   m_Ichimoku = new C_Ichimoku();
   m_Ichimoku.Init(_Symbol,MiddleTF, 9, 26, 52);
   
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    ResetLastError();
//--- Ichimoku refresh values
   m_Ichimoku.Refresh();

   Comment(
   "TenkanSen : ", m_Ichimoku.TenkanSen(0), "\n"
   "KijunSen : ", m_Ichimoku.KijunSen(0), "\n"
   "SenkuSpanA : ", m_Ichimoku.SenkouSpanA(0), "\n"
   "SenkuSpanB : ", m_Ichimoku.SenkouSpanB(0), "\n"
   "ChikouSpan : ", m_Ichimoku.ChikouSpan(26), "\n"
   );
// Print last error
   if(GetLastError() > 0)
     {
      Print("error : ", GetLastError());
     }
  }
 
Bonjour. C'est cool 
Très content que mon code est pu servir de base pour repartir sur quelque chose de plus complexe.

C' était aussi un des buts que je cherchais à faire, car mql5 demande beaucoup de code pour ne pas faire grand chose et donc de chance de créer un bug.

Tu as pensé à mettre une étoile ?
 
mcorgnet #:

Bon, du coup j'ai refait une classe en me basant notamment sur ton travail :)

En revanche c'est loin d'être parfait, mais à priori utilisable en l'état et je n'ai pas eu l'erreur à nouveau. 

Si vous avez envie de tester faites vous plaisir ! 



Exemple d'utilisation : 

Vous n'avez rien résolu. Juste masqué l'erreur.

Votre classe est buguée car elle peut donner des résultats non synchronisé pour les différents buffers (l'un étant mis à jour et l'autre pas).