도움이 필요한 배열이 범위를 벗어났습니다. - 페이지 4

 
Dark Kchlyzov :

오류는 없지만 로그에 있습니다.


가장 가까운 최소값이 없기 때문에 처음에는 옳았습니다.

2002년에 시작했고 2016년에는 모든 것이 순조로웠습니다.

 
MakarFX :

가장 가까운 최소값이 없기 때문에 처음에는 옳았습니다.

2002년에 시작했고 2016년에는 모든 것이 순조로웠습니다.

AUDUSD 2020 같은 파슬리. for 2 루프에서 표현식 오류를 제거합니다. 그대로 두면 오류가 없습니다. 이 날에는 라인을 다시 그리지 않습니다.

당신도 확인하십시오.

루프가 거의 항상 1001 마디에서 끊어지는 것이 이상합니다(어쩌면 배열 예배당?)


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

질문이 있습니다. 그리고 왜 0이 아닌 첫 번째 요소에서 루프를 시작합니까?

여기서 자명한 것 같습니다. Low_D1_Level이 전날의 레벨이면 Low_D1_Level에서 Min_D_Level을 검색하기 시작하고 i=1과 같습니다. 아니면 제가 잘못 알고 있는 것입니까?

 
Dark Kchlyzov :


루프가 거의 항상 1001 마디에서 끊어지는 것이 이상합니다(어쩌면 배열 예배당?)


항상은 아니다

 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가 없다

 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 :

확실하지 않지만 다음과 같은 것을 삽입해야한다고 생각합니다.

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

확실하지 않지만 다음과 같은 것을 삽입해야한다고 생각합니다.


지표처럼?

EMPTY_VALUE

표시기 버퍼 의 빈 값

 
Dark Kchlyzov :


지표처럼?

EMPTY_VALUE

표시기 버퍼 의 빈 값

이제 구조를 연구할 시간입니다.

MqlRates 핸들을 올바르게 선언하는 방법과 위치

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

약간의 시간이 있고 어렵지 않다면 할 수 있습니다(코드의 예)

C++에 대한 많은 정보가 있지만 MQL4 아아, 어떻게 그리고 무엇에 대한 일반적인 설명이 없습니다.

 

Dark Kchlyzov :

약간의 시간이 있고 어렵지 않다면 할 수 있습니다(코드의 예)


아아, 저는 프로그래머가 아닙니다. 지금까지는 관심만 있습니다.

EMPTY_VALUE 대신 NULL


 
Dark Kchlyzov :

이제 구조를 연구할 시간입니다.

MqlRates 핸들을 올바르게 선언하는 방법과 위치

약간의 시간이 있고 어렵지 않다면 할 수 있습니다(코드의 예)

C++에 대한 많은 정보가 있지만 MQL4 아아, 어떻게 그리고 무엇에 대한 일반적인 설명이 없습니다.

무엇을 더 추가해야할지조차 모르겠습니다 ... 원칙적으로 주요 예를 들었습니다. 이것은 코드입니다. 그래서 정확히 무엇이 불분명한지 물어보십시오.