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

mcorgnet  

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 :)

mcorgnet  

A priori la classe en question utilise iIchimoku :d


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 ! 


//+------------------------------------------------------------------+
//|                                                   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());
     }
  }
Alain Verleyen  
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).

Raison: