Array out of range in Besoin d'aide - page 7

 
Valeriy Yastremskiy:

Les extrema quotidiens, et ce que vous trouvez sont essentiellement des extrema, les points bas (ou les points hauts) sont assez éloignés du prix actuel. La différence entre le bas et le haut de 132 jours sur l'UE est de plus de 12300 pips. Prix à partir du plus bas de 2000, du plus haut de 800.

Je ne comprends pas non plus.

Désolé, j'essaierai d'expliquer demain ce qui est fatigué aujourd'hui.

 
MakarFX:

L'AUDUSD n'est pas comme ça pour moi.

ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров

Que copie-t-il et où retourne-t-il ?

 
Алексей Тарабанов:

Qu'est-ce qui est copié, où et à qui ?

Alexei Tarabanov:

Vers quoi se dirige-t-il et revient-il ?

d'appeler cette fonction:

intArrayCopyRates(
MqlRates&rates_array[],// tableau de MqlRates passé par référence
stringsymbol=NULL,// l'outil
inttimeframe=0// timeframe
) ;

Copie les données des barres du graphique spécifié dans un tableau bidimensionnel du type double RateInfo[][6] et renvoie le nombre de barres copiées.

intArrayCopyRates(
void&dest_array[][],// tableau passé par référence
stringsymbol=NULL,// outil
inttimeframe=0// timeframe
) ;

Paramètres

Taux de copie des tableaux

Lorsque vous utilisez la deuxième forme d'appel, les données sont réellement copiées dans le tableau dest_array[][], le tableau lui-même est automatiquement réalloué pour correspondre à la taille de l'intervalle de temps (même si le tableau a été déclaré statique).

La première dimension du tableau contient le nombre de barres. La deuxième dimension comporte 6 éléments avec les valeurs :

0 - heure (time),
1 - cours d'ouverture (open),
2 - cours le plus bas (low),
3 - cours le plus haut (high),
4 - cours de clôture (close),

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 
Dark Kchlyzov:
d'appeler cette fonction:

intArrayCopyRates(
MqlRates&rates_array[],// tableau de MqlRates passé par référence
stringsymbol=NULL,// l'outil
inttimeframe=0// timeframe
) ;

Copie les données des barres du graphique spécifié dans un tableau bidimensionnel de la forme double RateInfo[][6] et renvoie le nombre de barres copiées.

intArrayCopyRates(
void&dest_array[][],// tableau passé par référence
stringsymbol=NULL,// outil
inttimeframe=0// timeframe
) ;

Paramètres

Taux de copie des tableaux

Lorsque vous utilisez la deuxième forme d'appel, les données sont réellement copiées dans le tableau dest_array[][], le tableau lui-même est automatiquement réalloué pour correspondre à la taille de l'intervalle de temps (même si le tableau a été déclaré statique).

La première dimension du tableau contient le nombre de barres. La deuxième dimension comporte 6 éléments avec les valeurs :

0 - heure (time),
1 - cours d'ouverture (open),
2 - cours le plus bas (low),
3 - cours le plus haut (high),
4 - cours de clôture (close),

Et où est sauvegardée la valeur retournée du type int ? Vous avez transmis toutes les données à la fonction, mais n'avez rien obtenu de celle-ci.

 
Алексей Тарабанов:

Où est enregistrée la valeur de retour du type int ? Vous avez passé toutes les données dans la fonction, mais vous n'en avez rien retiré.

Min_D_Level = iLow(_Symbol,PERIOD_D1,i); break;

Il semble être stocké ici

double Min_D_Level ; //niveau minimal de D le plus proche

ou je ne comprends pas quelque chose ?

Et où est enregistrée la valeur retournée du type int?

? ??

Je suis en train de faire un brainstorming.

Est-il possible de le faire de manière plus simple ?

Comme vous (vous) avez fait une erreur ici, la bonne façon de le faire est cet exemple de code, etc.

 

Je suis assis ici depuis un moment :

#property version   "1.00"
#property strict

//символ и таймфрейм текущего графика
string symbol;
ENUM_TIMEFRAMES frame;
datetime time;
   

struct BarData
   {
   struct Elem
      {
      int      number;     //порядковый номер периода (дня, месяца или года)
      double   high;       //максимум периода
      double   low;        //минимум периода
      datetime time_high;  //время максимума
      datetime time_low;   //время минимума
      } Arr[];             //массив периода
   int index;              //текущий индекс массива
   double   max;           //последнее максимальное значение периода
   double   min;           //последнее минимальное значение периода
   datetime time_max;      //время максимума
   datetime time_min;      //время минимума

   //при создании структуры указываем, что массив пустой
   BarData(){index=-1;}    
   
   //функция записывает текущие экстремумы
   void WriteBar(int eNumber, string eSymbol, ENUM_TIMEFRAMES eFrame, datetime eTime)
      {
      int eShift=iBarShift(eSymbol,eFrame,eTime);
      double eHigh=iHigh(eSymbol,eFrame,eShift);
      double eLow=iLow(eSymbol,eFrame,eShift);
      //если элементов ещё нет или период сменился
      if(index<0 || eNumber!=Arr[index].number)
         {
         ArrayResize(Arr,++index+1);
         Arr[index].number=eNumber;
         Arr[index].high=eHigh;
         Arr[index].low=eLow;
         Arr[index].time_high=eTime;
         Arr[index].time_low=eTime;
         }
      //если произошло обновление текущего максимума
      if(eHigh-Arr[index].high>0)
         {
         Arr[index].high=eHigh;
         Arr[index].time_high=eTime;
         }
      //если произошло обновление текущего минимума
      if(Arr[index].low-eLow>0)
         {
         Arr[index].low=eLow;
         Arr[index].time_low=eTime;
         }
      //если произошло обновление предыдущего максимума
      if(eHigh-max>0)
         {
         for(int i=index+1; i>=0; i--)
            {
            if(Arr[index].high-eHigh>0)
               {
               max=Arr[index].high;
               time_max=Arr[index].time_high;
               break;
               }
            }
         }
      //если произошло обновление предыдущего минимума
      if(min-eLow>0)
         {
         for(int i=index+1; i>=0; i--)
            {
            if(eLow-Arr[index].low>0)
               {
               min=Arr[index].low;
               time_min=Arr[index].time_low;
               break;
               }
            }
         }
      }
   } day, month, year;

int OnInit()
   {
   symbol=Symbol();
   frame=(ENUM_TIMEFRAMES)Period();
   return(INIT_SUCCEEDED);
   }

void OnTick()
   {
   //текущее время закрытого бара
   time=iTime(symbol,frame,1);
   
   MqlDateTime date; 
   TimeToStruct(time,date);
   
   //делаем записи каждого периода
   day.WriteBar(date.day,symbol,frame,time);
   month.WriteBar(date.mon,symbol,frame,time);
   year.WriteBar(date.year,symbol,frame,time);
   
   //теперь имеем значения   
   Comment(TimeToString(day.time_max)+" : "+DoubleToString(day.max)+" : "+DoubleToString(day.Arr[day.index].high)+"\n"+TimeToString(day.time_min)+" : "+DoubleToString(day.Arr[day.index].low)+" : "+DoubleToString(day.min));
   }
Nous devrions essayer d'éviter les cycles inutiles. Nous recevons un grand nombre de devis et nous devons effectuer les bonnes entrées à la volée, afin de ne pas avoir à fouiller dans l'historique et à gaspiller les ressources informatiques.
 
Dark Kchlyzov:

Un peu comme ça

double Min_D_Level ; //niveau D minimum le plus proche

Ou est-ce que je rate quelque chose ?

Oui, vous ne comprenez pas quelque chose. Ça devrait être comme ça :

Количество_баров=ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров

Et puis...

 
Алексей Тарабанов:

Oui, il y a quelque chose que vous ne comprenez pas. C'est comme ça que ça doit être :

Et puis...

Merci beaucoup !

 
Dark Kchlyzov:

Merci beaucoup sur ce point aussi ! !!

Vous êtes les bienvenus.

 

3 h 47, je vais me coucher.

Je vais digérer tout cela demain et si j'ai des questions, je vous en ferai part !

Merci beaucoup à tous ! !!