Array außerhalb der Reichweite in Need of help - Seite 4

 
Dark Kchlyzov:

Es scheint kein Fehler vorzuliegen, aber er ist im Protokoll enthalten.


Ursprünglich hatten Sie Recht, weil das Mindestmaß nicht erreicht wurde.

lief von 2002 und 2016 ist alles in Ordnung.

 
MakarFX:

Ursprünglich hatten Sie recht, denn es gab kaum ein Minimum.

lief von 2002 und im Jahr 2016 ist alles gut.

AUDUSD 2020 - das Gleiche. Entfernen Sie aus dem Zyklus für 2 Ausdruck gibt es einen Fehler, wenn wir es verlassen, gibt es keinen Fehler, nur an diesem Tag wir nicht neu zeichnen die Linie

Haben Sie denselben Scheck?

Seltsam, dass die Schleife fast immer bei 1001 Takten abbricht (vielleicht die Array-Grenze?)


2020.12.10 09:56:40.177 2020.03.02 00:01:00 Test_Level AUDUSD,H1: array out of range in '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 Test_Level 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:

Es stellt sich eine Frage. Warum beginnen Sie die Schleife beim ersten Element und nicht bei Null?

Wenn Low_D1_Level der Pegel des Vortages ist, dann sollte Min_D_Level ausLow_D1_Level gesucht werden und ist gleich i=1, oder irre ich mich?

 
Dark Kchlyzov:


Es ist seltsam, dass die Schleife fast immer bei 1001 Takten abbricht (vielleicht die Arraygrenze?)


nicht immer

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
 

AUDUSD ist nicht wie das für mich

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:

Ich bin mir nicht sicher, aber ich glaube, Sie müssen etwas einfügen wie

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

Ich bin mir nicht sicher, aber ich glaube, Sie müssen etwas schreiben wie


Wie bei einem Indikator ?

EMPTY_VALUE

Leerer Wert im Indikatorpuffer

 
Dark Kchlyzov:


Ähnlich wie bei einem Indikator ?

EMPTY_VALUE

Leerer Wert im Indikatorpuffer

Jetzt ist es an der Zeit, die Strukturen zu untersuchen

wie und wo man MqlRates korrekt deklariert

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

Sie können, wenn Sie etwas Zeit haben und es nicht zu viel Mühe ist ( Beispiel im Code )

Der C++-Code ist voll von Informationen, aber MQL4 gibt keine klare Erklärung, was was ist.

 

Dark Kchlyzov:

Ich kann, wenn ich etwas Zeit habe und es nicht zu viel Mühe ist ( Beispiel im Code )


Entschuldigung, ich bin kein Programmierer, ich bin nur neugierig.

Anstelle von EMPTY_VALUE können Sie auchNULL verwenden


 
Dark Kchlyzov:

Jetzt ist es an der Zeit, die Strukturen zu untersuchen

wie und wo man MqlRates korrekt deklariert

Wenn Sie etwas Zeit haben und es nicht zu viel Mühe ist ( Beispiel im Code )

Ich habe eine Menge Informationen in C++, aber MQL4 wie für mich, es nicht richtig erklären, wie und was zu tun.

Ich weiß gar nicht, was ich noch hinzufügen soll. Im Prinzip habe ich die wichtigsten Beispiele genannt. Dies ist der Code. Deshalb empfehle ich Ihnen, mir mitzuteilen, was unklar ist.