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

 
Dark Kchlyzov:

No parece haber un error, pero está en el registro.


En un principio tenías razón, debido a la falta de un mínimo cercano

corrió desde 2002 y en 2016 todo está bien.

 
MakarFX:

Al principio tenías razón, a falta de un mínimo cercano

corrió desde 2002 y en 2016 todo está bien .

AUDUSD 2020 lo mismo. Si quitamos del ciclo por 2 expresiones hay un error, si lo dejamos no hay error, solo que ese día no redibujamos la línea

¿Tiene usted la misma comprobación?

Es extraño que el bucle se rompa casi siempre a las 1001 barras (¿tal vez el límite de la matriz?)


2020.12.10 09:56:40.177 2020.03.02 00:01:00 Test_Level AUDUSD,H1: array fuera de rango en 'Test_Level.mq4' (51,59)

2020.12.10 09:56:40.177 2020.03.02 00:01:00 Test_Level AUDUSD,H1: i = 1001 Bar_data_D1 [i][2] = 0.77324

2020.12.10 09:56:40.177 2020.03.02 00:01:00 Test_Level AUDUSD,H1: i = 1000 Bar_data_D1 [i][2] = 0.76934

2020.12.10 09:56:40.177 2020.03.02 00:01:00 Test_Level AUDUSD,H1: i = 999 Bar_data_D1 [i][2] = 0.76907

2020.12.10 09:56:40.177 2020.03.02 00:01:00 Test_Level AUDUSD,H1: i = 998 Bar_data_D1 [i][2] = 0.76963

2020.12.10 09:56:40.177 2020.03.02 00:01:00 Nivel_de_prueba AUDUSD,H1: i = 997 Bar_data_D1 [i][2] = 0.7548



//+------------------------------------------------------------------+
//|                                                   Test_Level.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
double   Bar_data_D1 [][6]; // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров D1
double   Low_D1_Level;      // Возвращает значение минимальной цены бара  D1
double   Min_D_Level ;      // ближайшей минимальный  D уровень
datetime  Time_Day;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Level();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  On_Timer();
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                        Функция Level 
//+------------------------------------------------------------------+
void Level()
{
 ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров

 Low_D1_Level   = iLow (_Symbol,PERIOD_D1,1);   // Возвращает значение минимальной цены бара  D1
    
//--- Min_D_Leve  
 //for(int i = 1; i<ArrayRange(Bar_data_D1,0) ;i++)
 for(int i = 1; ;i++)
    {
     Print(" i = ",i," Bar_data_D1 [i][2] = ",Bar_data_D1 [i][2]);
     if(Bar_data_D1 [i][2]>=0)
       {
        if( Bar_data_D1 [i][2] < Low_D1_Level)
          {
           Min_D_Level = Bar_data_D1 [i][2];break;
          }
       }   
    } 

 //+-------------------------Low_D1_Level----------------------------+ 
 if(ObjectFind("Low_D1")!=Low_D1_Level) 
   {
    ObjectDelete("Low_D1");
    if(ObjectFind("Low_D1")!=0)
      {
       ObjectCreate("Low_D1",OBJ_HLINE, 0, Time[0],Low_D1_Level);
       ObjectSet("Low_D1", OBJPROP_COLOR, clrMaroon);
       ObjectSet("Low_D1", OBJPROP_WIDTH, 1);
      }
   } 
   
 if(ObjectFind("Low_D1_label")!=Low_D1_Level)
   {
    ObjectDelete("Low_D1_label"); 
    if(ObjectFind("Low_D1_label") != 0)
      {
       ObjectCreate("Low_D1_label", OBJ_TEXT, 0, Time[13], Low_D1_Level);
       ObjectSetText("Low_D1_label", "Low_D1: " + DoubleToStr(Low_D1_Level,_Digits), 8,"Verdana", Brown);
      }
   } 
   
 //+-------------------------Min_D_Level----------------------------+ 
 if(ObjectFind("Min_D")!= Min_D_Level) 
   {
    ObjectDelete("Min_D");
    if(ObjectFind("Min_D")!=0)
      {
       ObjectCreate("Min_D",OBJ_HLINE, 0, Time[0],Min_D_Level);
       ObjectSet("Min_D", OBJPROP_COLOR, clrMaroon);
       ObjectSet("Min_D", OBJPROP_WIDTH, 1);
      }
   } 
   
 if(ObjectFind("Min_D_label")!=Min_D_Level)
   {
    ObjectDelete("Min_D_label"); 
    if(ObjectFind("Min_D_label") != 0)
      {
       ObjectCreate("Min_D_label", OBJ_TEXT, 0, Time[30], Min_D_Level);
       ObjectSetText("Min_D_label", "Min_D: " + DoubleToStr(Min_D_Level,_Digits), 8,"Verdana", Brown);
      }
   }  
 
}
//+------------------------------------------------------------------+
//|        функция удаление всех объектов созданных советником
//+------------------------------------------------------------------+
void DestroyObject()
{
 int tot=ObjectsTotal();
 for( int i=tot; i>=0; i--)
    {
     
     if(ObjectName(i)=="Low_MN1"){ObjectDelete(0,"Low_MN1");Print("<< Объект Low_MN удалён >>");}
     if(ObjectName(i)=="Low_MN1_label"){ObjectDelete(0,"Low_MN1_label");Print("<< Объект Low_MN1_label удалён >>");}
     

     if(ObjectName(i)=="Min_D"){ObjectDelete(0,"Min_D");Print("<< Объект Min_D удалён >>");}
     if(ObjectName(i)=="Min_D_label"){ObjectDelete(0,"Min_D_label");Print("<< Объект Min_D_label удалён >>");}


   }
}
//+-------------------------------------------------------------------------+   
//                         функция Timer                    
//+-------------------------------------------------------------------------+
void On_Timer()
{

     
 if(Day()!= Time_Day)
   {
    Level();
    Time_Day = Day();
   }
}

 
Aleksei Stepanenko:

Hay una pregunta. ¿Por qué se inicia el bucle desde el primer elemento y no desde el cero?

Si Nivel_Bajo_D1 es el nivel del día anterior, entonces Nivel_Mínimo_D debe buscarse a partir deNivel_Bajo_D1 y es igual a i=1 , ¿o me equivoco?

 
Dark Kchlyzov:


es extraño que el bucle se rompa casi siempre a las 1001 barras (¿tal vez el límite de la matriz?)


no siempre

2020.12.10 08:16:47.604 EURUSD,H1: 265 tick events (265 bars, 13782 bar states) processed in 0:00:53.781 (total time 0:00:55.813)
2020.12.10 08:16:47.604 2016.12.16 00:00:00  Testing pass stopped due to a critical error in the EA
2020.12.10 08:16:47.604 2016.12.16 00:00:00  Array EURUSD,H1: array out of range in 'Array.mq4' (51,59)
2020.12.10 08:16:47.604 2016.12.16 00:00:00  Array EURUSD,H1:  i = 1011 Bar_data_D1 [i][2] = 1.32667
2020.12.10 08:16:47.604 2016.12.16 00:00:00  Array EURUSD,H1:  i = 1010 Bar_data_D1 [i][2] = 1.32642
2020.12.10 08:16:47.604 2016.12.16 00:00:00  Array EURUSD,H1:  i = 1009 Bar_data_D1 [i][2] = 1.32857
2020.12.10 08:16:47.604 2016.12.16 00:00:00  Array EURUSD,H1:  i = 1008 Bar_data_D1 [i][2] = 1.335
2020.12.10 08:16:47.604 2016.12.16 00:00:00  Array EURUSD,H1:  i = 1007 Bar_data_D1 [i][2] = 1.34244
2020.12.10 08:16:47.604 2016.12.16 00:00:00  Array EURUSD,H1:  i = 1006 Bar_data_D1 [i][2] = 1.3414
2020.12.10 08:16:47.604 2016.12.16 00:00:00  Array EURUSD,H1:  i = 1005 Bar_data_D1 [i][2] = 1.34815
2020.12.10 08:16:47.604 2016.12.16 00:00:00  Array EURUSD,H1:  i = 1004 Bar_data_D1 [i][2] = 1.35409
2020.12.10 08:16:47.604 2016.12.16 00:00:00  Array EURUSD,H1:  i = 1003 Bar_data_D1 [i][2] = 1.35726
 

El AUDUSD no es así para mí

2020.12.10 08:22:28.794 AUDUSD,H1: 121 tick events (121 bars, 3166 bar states) processed in 0:00:00.000 (total time 0:00:02.016)
2020.12.10 08:22:28.794 2020.03.10 00:00:00  Testing pass stopped due to a critical error in the EA
2020.12.10 08:22:28.794 2020.03.10 00:00:00  Array AUDUSD,H1: array out of range in 'Array.mq4' (51,59)
2020.12.10 08:22:28.794 2020.03.10 00:00:00  Array AUDUSD,H1:  i = 1049 Bar_data_D1 [i][2] = 0.71997
2020.12.10 08:22:28.794 2020.03.10 00:00:00  Array AUDUSD,H1:  i = 1048 Bar_data_D1 [i][2] = 0.71453
2020.12.10 08:22:28.794 2020.03.10 00:00:00  Array AUDUSD,H1:  i = 1047 Bar_data_D1 [i][2] = 0.71557
2020.12.10 08:22:28.794 2020.03.10 00:00:00  Array AUDUSD,H1:  i = 1046 Bar_data_D1 [i][2] = 0.7117599999999999
2020.12.10 08:22:28.794 2020.03.10 00:00:00  Array AUDUSD,H1:  i = 1045 Bar_data_D1 [i][2] = 0.7108
2020.12.10 08:22:28.794 2020.03.10 00:00:00  Array AUDUSD,H1:  i = 1044 Bar_data_D1 [i][2] = 0.71086
2020.12.10 08:22:28.794 2020.03.10 00:00:00  Array AUDUSD,H1:  i = 1043 Bar_data_D1 [i][2] = 0.7160300000000001
2020.12.10 08:22:28.794 2020.03.10 00:00:00  Array AUDUSD,H1:  i = 1042 Bar_data_D1 [i][2] = 0.7281
2020.12.10 08:22:28.794 2020.03.10 00:00:00  Array AUDUSD,H1:  i = 1041 Bar_data_D1 [i][2] = 0.73392
 
Dark Kchlyzov:

No estoy seguro, pero creo que hay que insertar algo como

if(Bar_data_D1 [i][2]==EMPTY_VALUE)Bar_data_D1 [i][2]=Low_D1_Level;
 
MakarFX:

No estoy seguro, pero creo que hay que poner algo como


¿Como para un indicador?

VALOR_VACÍO

Valor vacío en la memoria intermedia del indicador

 
Dark Kchlyzov:


¿Como para un indicador?

VALOR_VACÍO

Valor vacío en la memoria intermedia del indicador

Ahora es el momento de estudiar las estructuras

cómo y dónde declarar correctamente MqlRates

Bar_data_D1[i].high; Максимум свечи
Bar_data_D1[i].low; Минимум свечи

puedes hacerlo si tienes algo de tiempo y no te supone demasiados problemas ( ejemplo en el código )

El código C++ está lleno de información, pero MQL4 no da una explicación clara de qué es qué.

 

Dark Kchlyzov:

Puedo hacerlo si tengo algo de tiempo y no es mucha molestia (ejemplo en el código).


Lo siento, no soy programador, sólo tengo curiosidad.

En lugar de EMPTY_VALUE puede utilizarNULL


 
Dark Kchlyzov:

Ahora es el momento de estudiar las estructuras

cómo y dónde declarar correctamente MqlRates

Si tienes algo de tiempo y no es mucha molestia ( ejemplo en el código )

Tengo mucha información en C++, pero MQL4 en cuanto a mí, no explica bien cómo y qué hacer.

Ni siquiera sé qué más añadir. En principio, he dado los principales ejemplos. Este es el código. Por eso te recomiendo que me digas qué es lo que no está claro.