Débutant - indicateur canal de donchian

 

Bonsoir
Je suis débutant dans le développement d'indicateur en MQL5 et là je ne vois pas
Un peu d'aide serait la bienvenu

Je voudrais un canal de donchian mais sans utiliser de boucle For ou autre
Mon code fonctionne mais quand j'ai voulu avoir la représentation graphique, je n'arrive pas à alimenter le buffer
j'ai une erreur tout en bas du code dans OnCalculate

'HighestPrice' - invalid array access

'LowestPrice' - invalid array access

Voici le code

//+------------------------------------------------------------------+
//|                                         Donchian sans boucle.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//---- indicator version number
#property version   "1.00"
//---- drawing the indicator in the main window
#property indicator_chart_window 
//---- number of indicator buffers
//#property indicator_buffers 3
#property indicator_buffers 2
//---- 3 plots are used
//#property indicator_plots   3
#property indicator_plots 2
//+-----------------------------------+
//|  parameters of indicator drawing  |
//+-----------------------------------+
//---- drawing of the indicator as a line
#property indicator_type1   DRAW_LINE
//---- use olive color for the indicator line
#property indicator_color1 OliveDrab
//---- indicator line is a solid curve
#property indicator_style1  STYLE_SOLID
//---- indicator line width is equal to 1
#property indicator_width1  1
//---- indicator label display
#property indicator_label1  "Upper Donchian"

//---- drawing of the indicator as a line
#property indicator_type2   DRAW_LINE
//---- use pale violet red color for the indicator line
#property indicator_color2 PaleVioletRed
//---- indicator line is a solid curve
#property indicator_style2  STYLE_SOLID
//---- indicator line width is equal to 1
#property indicator_width2  1
//---- indicator label display
#property indicator_label2  "Lower Donchian"


//+-----------------------------------+
//|  INPUT PARAMETERS OF THE INDICATOR|
//+-----------------------------------+
input int DonchianPeriod=19; 

//---- indicator buffers
double HighestPrice[],LowestPrice[];

void OnTick()
  {

  }
 
 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[])
  
    {
      // Création des points les plus hauts et bas
      int HighestCandle, LowestCandle;
      // Création arrays pour les hauts et bas à la bonne taille
      double High[], Low[];
      // On met les arrays à la taille
      ArrayResize(High, DonchianPeriod);
      ArrayResize(Low, DonchianPeriod);
      // Données triées par la plus récente
      ArraySetAsSeries(High,true);
      ArraySetAsSeries(Low,true);
      // Remplir les arrays avec les datas de 10 bougies
      CopyHigh(_Symbol,_Period,0,DonchianPeriod,High);
      CopyHigh(_Symbol,_Period,0,DonchianPeriod,Low);
      // Recherche des extremes
      HighestCandle = ArrayMaximum(High,0,DonchianPeriod);
      LowestCandle = ArrayMaximum(Low,0,DonchianPeriod);
      // Array pour les prix
      MqlRates PrixInformation[];
      // Optimisation array
      ArrayResize(PrixInformation, Bars(_Symbol, _Period));
      // Trié de la plus récente à la plus ancienne
      ArraySetAsSeries(PrixInformation, true);
      // Copier les prix dans l'array
      int Donnees = CopyRates(_Symbol,_Period,0,Bars(_Symbol,_Period),PrixInformation);
      
      HighestPrice = PrixInformation[HighestCandle].high;
      LowestPrice = PrixInformation[LowestCandle].low;
      return(rates_total);
    }
    
void OnInit()
  {
  
//---- turning a dynamic array into an indicator buffer
   SetIndexBuffer(0,HighestPrice,INDICATOR_DATA);
//---- shifting the indicator 1 horizontally by AroonShift
   //PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- shifting the start of drawing of the indicator 1
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,DonchianPeriod-1);
//--- create label to display in DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"Upper Donchian");
//---- setting values of the indicator that won't be visible on the chart
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- turning a dynamic array into an indicator buffer
   SetIndexBuffer(1,LowestPrice,INDICATOR_DATA);
//---- shifting the indicator 3 horizontally
   //PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- shifting the start of drawing of the indicator 3
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,DonchianPeriod-1);
//--- create label to display in DataWindow
   PlotIndexSetString(1,PLOT_LABEL,"Lower Donchian");
//---- setting values of the indicator that won't be visible on the chart
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- initialization of variable for indicator short name
   string shortname;
   StringConcatenate(shortname,"Donchian( DonchianPeriod = ",DonchianPeriod,")");
//--- creation of the name to be displayed in a separate sub-window and in a pop up help
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- determination of accuracy of displaying of the indicator values
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//---- end of initialization
  }    

//+------------------------------------------------------------------+


Merci pour vos aides car ça fait un bout de temps que je suis dessus sans en sortir


Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.02.26
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
William210:

Bonsoir
Je suis débutant dans le développement d'indicateur en MQL5 et là je ne vois pas
Un peu d'aide serait la bienvenu

Je voudrais un canal de donchian mais sans utiliser de boucle For ou autre
Mon code fonctionne mais quand j'ai voulu avoir la représentation graphique, je n'arrive pas à alimenter le buffer
j'ai une erreur tout en bas du code dans OnCalculate

'HighestPrice' - invalid array access

'LowestPrice' - invalid array access

Voici le code

//+------------------------------------------------------------------+
//|                                         Donchian sans boucle.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//---- indicator version number
#property version   "1.00"
//---- drawing the indicator in the main window
#property indicator_chart_window 
//---- number of indicator buffers
//#property indicator_buffers 3
#property indicator_buffers 2
//---- 3 plots are used
//#property indicator_plots   3
#property indicator_plots 2
//+-----------------------------------+
//|  parameters of indicator drawing  |
//+-----------------------------------+
//---- drawing of the indicator as a line
#property indicator_type1   DRAW_LINE
//---- use olive color for the indicator line
#property indicator_color1 OliveDrab
//---- indicator line is a solid curve
#property indicator_style1  STYLE_SOLID
//---- indicator line width is equal to 1
#property indicator_width1  1
//---- indicator label display
#property indicator_label1  "Upper Donchian"

//---- drawing of the indicator as a line
#property indicator_type2   DRAW_LINE
//---- use pale violet red color for the indicator line
#property indicator_color2 PaleVioletRed
//---- indicator line is a solid curve
#property indicator_style2  STYLE_SOLID
//---- indicator line width is equal to 1
#property indicator_width2  1
//---- indicator label display
#property indicator_label2  "Lower Donchian"


//+-----------------------------------+
//|  INPUT PARAMETERS OF THE INDICATOR|
//+-----------------------------------+
input int DonchianPeriod=19; 

//---- indicator buffers
double HighestPrice[],LowestPrice[];

void OnTick()
  {

  }
 
 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[])
  
    {
      // Création des points les plus hauts et bas
      int HighestCandle, LowestCandle;
      // Création arrays pour les hauts et bas à la bonne taille
      double High[], Low[];
      // On met les arrays à la taille
      ArrayResize(High, DonchianPeriod);
      ArrayResize(Low, DonchianPeriod);
      // Données triées par la plus récente
      ArraySetAsSeries(High,true);
      ArraySetAsSeries(Low,true);
      // Remplir les arrays avec les datas de 10 bougies
      CopyHigh(_Symbol,_Period,0,DonchianPeriod,High);
      CopyHigh(_Symbol,_Period,0,DonchianPeriod,Low);
      // Recherche des extremes
      HighestCandle = ArrayMaximum(High,0,DonchianPeriod);
      LowestCandle = ArrayMaximum(Low,0,DonchianPeriod);
      // Array pour les prix
      MqlRates PrixInformation[];
      // Optimisation array
      ArrayResize(PrixInformation, Bars(_Symbol, _Period));
      // Trié de la plus récente à la plus ancienne
      ArraySetAsSeries(PrixInformation, true);
      // Copier les prix dans l'array
      int Donnees = CopyRates(_Symbol,_Period,0,Bars(_Symbol,_Period),PrixInformation);
      
      HighestPrice = PrixInformation[HighestCandle].high;
      LowestPrice = PrixInformation[LowestCandle].low;
      return(rates_total);
    }
    
void OnInit()
  {
  
//---- turning a dynamic array into an indicator buffer
   SetIndexBuffer(0,HighestPrice,INDICATOR_DATA);
//---- shifting the indicator 1 horizontally by AroonShift
   //PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- shifting the start of drawing of the indicator 1
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,DonchianPeriod-1);
//--- create label to display in DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"Upper Donchian");
//---- setting values of the indicator that won't be visible on the chart
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- turning a dynamic array into an indicator buffer
   SetIndexBuffer(1,LowestPrice,INDICATOR_DATA);
//---- shifting the indicator 3 horizontally
   //PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- shifting the start of drawing of the indicator 3
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,DonchianPeriod-1);
//--- create label to display in DataWindow
   PlotIndexSetString(1,PLOT_LABEL,"Lower Donchian");
//---- setting values of the indicator that won't be visible on the chart
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- initialization of variable for indicator short name
   string shortname;
   StringConcatenate(shortname,"Donchian( DonchianPeriod = ",DonchianPeriod,")");
//--- creation of the name to be displayed in a separate sub-window and in a pop up help
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- determination of accuracy of displaying of the indicator values
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//---- end of initialization
  }    

//+------------------------------------------------------------------+


Merci pour vos aides car ça fait un bout de temps que je suis dessus sans en sortir


Bonjour, vous avez déclaré des tableaux ( HighestPrice[] et  LowestPrice[]) forcément il manque quelque chose non?

 HighestPrice [ ? ] = PrixInformation[HighestCandle].high;

 LowestPrice [ ? ] = PrixInformation[LowestCandle].low;


Peut être que votre erreur vient de la!

 

Bonjour

Merci pour votre réponse

C'est sûr qu'il manque qqch mais je ne sais pas comme l'écrire


Ce qui me perturbe le plus c'est que ce code fonctionnait, sans erreur quand les arrays highestPrice et LowestPrice étaient déclarés en local
Pour pouvoir le dessiner sur le graphe, j'ai du déplacer ces déclarations au global et là ça ne marche plus et bien entendu je ne vois pas ce qu'il attend 

Donnez moi plus d'aides et d'explications STP pour que je puisse progresser
Merci
Belle journée

 
William210 #:

Bonjour

Merci pour votre réponse

C'est sûr qu'il manque qqch mais je ne sais pas comme l'écrire


Ce qui me perturbe le plus c'est que ce code fonctionnait, sans erreur quand les arrays highestPrice et LowestPrice étaient déclarés en local
Pour pouvoir le dessiner sur le graphe, j'ai du déplacer ces déclarations au global et là ça ne marche plus et bien entendu je ne vois pas ce qu'il attend 

Donnez moi plus d'aides et d'explications STP pour que je puisse progresser
Merci
Belle journée

Bonjour, il y a plusieurs erreurs dans votre code. Sans indiscrétion comment l'avez vous codé? Vous l'avez récupéré et essayer de le modifier?

Je veux bien vous aider si c'est le cas.

Vous ne pouvez pas déclarer vos buffer en local et je suppose que quand ils étaient déclarés en local ce n'étaient pas des tableaux mais de simples variables. double  highestPrice ; au lieu de double  highestPrice [];

Réctifiez:

 // Remplir les arrays avec les datas de 10 bougies
      CopyHigh(_Symbol,_Period,0,DonchianPeriod,High);
      CopyHigh(_Symbol,_Period,0,DonchianPeriod,Low);

Car je pense qu'il y a une erreur (je vous laisse trouver).

Et essayez:

HighestPrice[rates_total-1] = PrixInformation[HighestCandle].high; ( rates_total-1 est égal a une bougie avant votre bougie en cour pour la bougie en cour il faudra écrire  rates_total)

LowestPrice[rates_total-1] = PrixInformation[LowestCandle].low;

 

Bonjour 
J'ai perdu mon message, je recommence.

Je me suis inspiré de plusieurs codes trouvés sur ce site car c'est mon premier script et il me faut tout découvrir et tout apprendre sur metrader

Téléchargement gratuit de l'indicateur 'Donchian channel - extended' par 'mladen' pour MetaTrader 5 dans la base de code MQL5, 2019.01.25


Pour un souci de performance, je souhaite me débarrasser des boucles et ne passer que pour les fonctions Array, si possible ... 

je vois les commandes pour les remplissages, les évènements, les fonctions array.


celui-ci https://www.mql5.com/fr/code/1601

je n'aime pas car la représentation n'est pas bonne, ça se voit d'ailleurs sur la page de présentation, les extrêmes sont décalés d'une bougie

Encore des boucles FOR, mais je vois bien que la réponse à mon souci est dans ce code "en parti"

La plus gros parti viens de ce code 

https://www.mql5.com/fr/code/402

j'ai pas mal appris avec. Les params externes et les fonctions internes comme les ihighest
D'ailleurs je trouve que c'est bien null dans ce code qu'il est révinventé la roue alors qu'elle était dispo et en plus de rajouter encre plus de boucle 

et pour finir ce code sur youtube
https://www.youtube.com/watch?v=eIXGRC0e6Ew

//+------------------------------------------------------------------+
//|                                         Donchian sans boucle.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
void OnTick()
  {
   // Création des points les plus hauts et bas
   int HighestCandle, LowestCandle;
   // Création arrays pour les hauts et bas
   double High[], Low[];//, PrixInformation[]; 
   // Données triées par la plus récente
   ArraySetAsSeries(High,true);
   ArraySetAsSeries(Low,true);
   // Remplir les arrays avec les datas de 10 bougies
   CopyHigh(_Symbol,_Period,0,10,High);
   CopyHigh(_Symbol,_Period,0,10,Low);
   // Recherche des extremes
   HighestCandle = ArrayMaximum(High,0,10);
   LowestCandle = ArrayMaximum(Low,0,10);
   // Array pour les prix
   MqlRates PrixInformation[];
   // Trié de la plus récente à la plus ancienne
   ArraySetAsSeries(PrixInformation, true);
   // Copier les prix dans l'array
   int Donnees = CopyRates(_Symbol,_Period,0,Bars(_Symbol,_Period),PrixInformation);
   
   double highestPrice = PrixInformation[HighestCandle].high;
   double LowestPrice = PrixInformation[LowestCandle].low;
   Print("Higest: ",highestPrice, " Lowest ", LowestPrice);
   
  }

//+------------------------------------------------------------------+

qui lui passe bien sans boucle

Donc comme tu peux voir j'apprends bien par l'exemple, mais là tout de suite, j'ai du mal à passer l'erreur en cours et je seche depuis un bout de temps

'HighestPrice' - undeclared identifier


Si tu veux bien m'aider, ça me rendra bien plus autonome pour mes autres développements 

Très belle journée


Donchian channel - extended
Donchian channel - extended
  • www.mql5.com
Donchian channel - extended
 
// Définition de l'array source
double sourceArray[10] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};

// Définition de notre filtre (dans cet exemple, nous copions les éléments supérieurs à 5)
bool filter(double value)
{
    return value > 5.0;
}

// Fonction récursive pour filtrer les éléments de l'array source
void filterArrayRecursive(const double& source[], const int& sourceSize, double& destination[], int& destinationIndex, bool (*filter)(double))
{
    if(sourceSize == 0) return;

    if(filter(source[0]))
    {
        destination[destinationIndex] = source[0];
        destinationIndex++;
    }

    filterArrayRecursive(source + 1, sourceSize - 1, destination, destinationIndex, filter);
}

// Appel de la fonction pour filtrer les éléments de l'array source
double destinationArray[5];
int destinationIndex = 0;
filterArrayRecursive(sourceArray, ArraySize(sourceArray), destinationArray, destinationIndex, filter);
Oh ce site et son wysyg
J'ai peu être une solution avec ce code 
Je pense déclarer les variables en 'static' qui serait plus propre pour le code et sa lecture et ma correction doit être par là
C'est pas idéal mais ça fonctionnerait 
Belle matinée
 

Jai répondu à ton problème, qui était à la base :

'HighestPrice' - invalid array access  

Je t'ai dis de rajouter l'index à ton tableau :  HighestPrice[rates_total-1] = PrixInformation[HighestCandle].high;

Je ne vois pas comment je peux être plus clair.

Maintenant tu me dis que ton problème c'est:

'HighestPrice' - undeclared identifier

Je ne comprend plus

 

Bonjour et merci pour ton aide j'ai trouvé une solution
Mon problème était du à cause d'une méconnaissance de ma part

je vais passer au problème suivant à savoir la représentation graphique puis l'Oo car ma stratégie à tester est assez compliqué et je veux un code simple à maintenir 
Très belle journée

Ps j'ai suivi votre lien vers votre site et je n'ai pas vu les prix de vos services

 

Bonjour, effectivement l'apprentissage n'est pas une chose aisée, surtout sans professeur. Avec quelqu'un, la réponse vient rapidement, par contre en autodidacte, il faut apprendre à chercher l'erreur (Print(); te sauve la mise souvent pour vérifier le bon déroulement du code et des valeurs de tes variables par exemple), ensuite il te faut chercher la solution. Concentre toi sur les buffers (essentiel pour les indicateurs et experts, c'est une chose que tu aurais du faire depuis le début). Peut être connais tu un autre langage de programmation et c'est pour cela que tu as mis les mains dans le cambouis des le début. Quoi qu'il en soit, avec la passion et du temps ca vient rapidement.

Et pour mon site, à la base, il sert juste de plateforme pour mon expert (je n'ai jamais trouvé un expert capable de faire ce qu'il fait, alors je l'ai conçu), mais avec le temps je rajouterais des choses. Parfois aussi je rend des services mais cela dépend aussi du Service en question.

Bonne journée et bon courage.

Raison: