Array fuera de rango en Necesidad de ayuda - página 7

 
Valeriy Yastremskiy:

Los extremos diarios, y lo que estás encontrando son esencialmente extremos, los mínimos (o máximos) tienen distancias bastante largas del precio actual. La diferencia entre el mínimo y el máximo en los 132 días de la víspera es de más de 12300 pips. Precio desde el mínimo más cercano de 2000, desde el máximo de 800.

Yo tampoco lo entiendo.

Lo siento, trataré de explicarlo mañana cansado hoy

 
MakarFX:

El AUDUSD no es así para mí

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

¿Qué copia y a dónde vuelve?

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

¿Qué se copia, dónde y a quién?

Alexei Tarabanov:

¿A qué copia y a qué vuelve?

de llamar a esta función:

intArrayCopyRates(
MqlRates&rates_array[],// matriz de MqlRates pasada por referencia
stringsymbol=NULL,// la herramienta
inttimeframe=0// timeframe
);

Copia los datos de las barras del gráfico especificado en una matriz bidimensional de la forma double RateInfo[][6] y devuelve el número de barras copiadas.

intArrayCopyRates(
void&dest_array[][],// array pasado por referencia
stringsymbol=NULL,// herramienta
inttimeframe=0// timeframe
);

Parámetros

ArrayCopyRates

Cuando se utiliza la segunda forma de llamada, los datos se copian realmente en la matriz dest_array[][], la propia matriz se reasigna automáticamente para que coincida con el tamaño del marco temporal (incluso si la matriz se ha declarado estática).

La primera dimensión de la matriz contiene el número de barras. La segunda dimensión tiene 6 elementos con los valores:

0 - hora (time),
1 - precio de apertura (open),
2 - precio mínimo (low),
3 - precio máximo (high),
4 - precio de cierre (close),

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

intArrayCopyRates(
MqlRates&rates_array[],// matriz de MqlRates pasada por referencia
stringsymbol=NULL,// la herramienta
inttimeframe=0// timeframe
);

Copia los datos de las barras del gráfico especificado en una matriz bidimensional de la forma double RateInfo[][6] y devuelve el número de barras copiadas.

intArrayCopyRates(
void&dest_array[][],// array pasado por referencia
stringsymbol=NULL,// herramienta
inttimeframe=0// timeframe
);

Parámetros

ArrayCopyRates

Cuando se utiliza la segunda forma de llamada, los datos se copian realmente en la matriz dest_array[][], la propia matriz se reasigna automáticamente para que coincida con el tamaño del marco temporal (incluso si la matriz se ha declarado estática).

La primera dimensión de la matriz contiene el número de barras. La segunda dimensión tiene 6 elementos con los valores:

0 - hora (time),
1 - precio de apertura (open),
2 - precio mínimo (low),
3 - precio máximo (high),
4 - precio de cierre (close),

¿Y dónde se guarda el valor devuelto del tipo int? Has pasado todos los datos a la función, pero no has obtenido nada de ella.

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

¿Dónde se guarda el valor de retorno del tipo int? Has pasado todos los datos a la función, pero no has sacado nada de ella.

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

Parece que se almacena aquí

double Min_D_Level ; //nivel D mínimo más cercano

¿o no entiendo algo?

¿Y dónde se guarda el valor devuelto de tipo int?

???

Realmente estoy haciendo una lluvia de ideas.

¿Es posible hacerlo de forma más sencilla?

Como usted (usted) cometió un error aquí, la forma correcta de hacerlo sería este ejemplo de código, etc.

 

He estado sentado aquí durante un tiempo:

#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));
   }
Debemos intentar evitar los ciclos innecesarios. Nos llegan muchos presupuestos y hay que hacer las entradas correctas sobre la marcha, para no tener que rebuscar en el historial y desperdiciar recursos informáticos.
 
Dark Kchlyzov:

Más o menos así

double Min_D_Level ; //nivel D mínimo más cercano

¿O me estoy perdiendo algo?

Sí, no entiendes algo. Debería ser así:

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

Y entonces...

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

Sí, hay algo que no entiendes. Así es como tiene que ser:

Y entonces...

¡Muchas gracias!

 
Dark Kchlyzov:

¡¡¡Muchas gracias por eso también !!!

De nada.

 

3.47 Me voy a la cama.

¡Mañana lo digeriré todo y si tengo alguna duda os lo haré saber !

¡¡¡Muchas gracias a todos!!!

Razón de la queja: