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

 
Aleksei Stepanenko :

나는 무엇이 잘못되었는지 이해하지 못했다. 이것은 낮은 라인입니다.

만약을 대비하여 새로운 방식으로 코드를 복사하고 주기적으로 변경했는데 이전 버전이 있을 수 있습니다.

예, 예, 코드를 편집할 때 버전을 변경해야 합니다.

평소와 같은 AUDUSD

나는 납땜 년 동안 EURUSD를 통해 갈 것입니다. 길 것이다

어렵지 않다면 바로 일주일하고 한달을 더하면 될까요? 그리고 눈이 밖으로 움직이지 않도록 예와 같이 레이블을 즉시 이동합니다 .

이 차트를 열 번 보지 않기 위해. (그래서 나는 마음으로 전체 이야기를 알고 있습니다)

한 달에 8켤레를 관리할 것 같은데 테스트를 해야 합니다.

나는 아직 당신의 코드에 들어가지 않을 것입니다 (나는 당신의 예를 사용하여 클래스 등으로 조용히 프로세스를 이해할 것입니다)

나는 거의 잊었다 (기록이 없거나 행이 값을 변경하지 않은 경우 경고와 같은 경고를 표시하십시오)

 

새 버전입니다. 일, 주, 월의 세 가지 기간을 그립니다. 한 가지가 있지만 아래에 쓰겠습니다.

 #property version    "2.00"
#property strict

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

long ChartId;
int Window;
string Name= "MiniMax" ;
MqlDateTime date; 

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)
      {
       if (eTime== 0 ) return ;
       int eShift= iBarShift (eSymbol,eFrame,eTime);
       double eHigh= iHigh (eSymbol,eFrame,eShift);
       double eLow= iLow (eSymbol,eFrame,eShift);
       bool eIsNew= false ;
       //если элементов ещё нет или период сменился
       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 (index== 0 )
            {
            max=eHigh;
            time_max=eTime;
            min=eLow;
            time_min=eTime;
            }
         else
            {
            eIsNew= true ;
            }
         }
       //если произошло обновление текущего максимума
       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 (eIsNew)
         {
         max=Arr[index- 1 ].high;
         time_max=Arr[index- 1 ].time_high;
         for ( int i=index- 2 ; i>= 0 ; i--)
            {
             if (Arr[i].high-Arr[index- 1 ].high> 0 )
               {
               max=Arr[i].high;
               time_max=Arr[i].time_high;
               break ;
               }
            }
         }
       //если произошло обновление предыдущего минимума
       if (eIsNew)
         {
         min=Arr[index- 1 ].low;
         time_min=Arr[index- 1 ].time_low;
         for ( int i=index- 2 ; i>= 0 ; i--)
            {
             if (Arr[index- 1 ].low-Arr[i].low> 0 )
               {
               min=Arr[i].low;
               time_min=Arr[i].time_low;
               break ;
               }
            }
         }
      }
      
   double GetHigh() { return (index> 0 ?Arr[index- 1 ].high:Arr[index].high);}
   double GetLow() { return (index> 0 ?Arr[index- 1 ].low:Arr[index].low);}
   } day, week, month;

int OnInit ()
   {
   symbol= Symbol ();
   frame=( ENUM_TIMEFRAMES ) Period ();
   digits=( int ) SymbolInfoInteger (symbol, SYMBOL_DIGITS );
   //идентификатор графика и номер окна индикатора
   ChartId= ChartID ();
   Window= 0 ;
   return ( INIT_SUCCEEDED );
   }

void OnTick ()
   {
   //текущее время закрытого бара
   current= iTime (symbol,frame, 1 );
   do
      {    
       TimeToStruct (time,date);
       //делаем записи каждого периода
      day.WriteBar(date.day,symbol,frame,time);
      week.WriteBar(GetWeekNumber(time),symbol,frame,time);
      month.WriteBar(date.mon,symbol,frame,time);
      
       if (time<current) {time= iTime (symbol,frame,( iBarShift (symbol,frame,time)- 1 ));} else break ;
      }
   while (time<=current);
   
   //рисуем дневные линии
   RedrawHLine(ChartId,Window,Name+ "_Day_1_High" ,day.GetHigh(), clrBlue , 1 , DoubleToString (day.GetHigh(),digits),digits);
   RedrawHLine(ChartId,Window,Name+ "_Day_1_Low" ,day.GetLow(), clrBlue , 1 , DoubleToString (day.GetLow(),digits),digits);
   RedrawText(ChartId,Window,Name+ "_Day_1_High_Text" , iTime (symbol,frame, 20 ),day.GetHigh(), "Day 1:  " + DoubleToString (day.GetHigh(),digits), ANCHOR_RIGHT_LOWER , "Arial" , 8 , clrBlue , "" ,digits);
   RedrawText(ChartId,Window,Name+ "_Day_1_Low_Text" , iTime (symbol,frame, 20 ),day.GetLow(), "Day 1:  " + DoubleToString (day.GetLow(),digits), ANCHOR_RIGHT_UPPER , "Arial" , 8 , clrBlue , "" ,digits);

   RedrawHLine(ChartId,Window,Name+ "_Day_Max_High" ,day.max, clrRed , 1 , DoubleToString (day.max,digits),digits);
   RedrawHLine(ChartId,Window,Name+ "_Day_Min_Low" ,day.min, clrRed , 1 , DoubleToString (day.min,digits),digits);
   RedrawText(ChartId,Window,Name+ "_Day_Max_Text" , iTime (symbol,frame, 70 ),day.max, "Day Max:  " + DoubleToString (day.max,digits), ANCHOR_RIGHT_LOWER , "Arial" , 8 , clrRed , "" ,digits);
   RedrawText(ChartId,Window,Name+ "_Day_Min_Text" , iTime (symbol,frame, 70 ),day.min, "Day Min:  " + DoubleToString (day.min,digits), ANCHOR_RIGHT_UPPER , "Arial" , 8 , clrRed , "" ,digits);
   
   //рисуем недельные линии
   RedrawHLine(ChartId,Window,Name+ "_Week_1_High" ,week.GetHigh(), clrBlue , 1 , DoubleToString (week.GetHigh(),digits),digits);
   RedrawHLine(ChartId,Window,Name+ "_Week_1_Low" ,week.GetLow(), clrBlue , 1 , DoubleToString (week.GetLow(),digits),digits);
   RedrawText(ChartId,Window,Name+ "_Week_1_High_Text" , iTime (symbol,frame, 120 ),week.GetHigh(), "Week 1:  " + DoubleToString (week.GetHigh(),digits), ANCHOR_RIGHT_LOWER , "Arial" , 8 , clrBlue , "" ,digits);
   RedrawText(ChartId,Window,Name+ "_Week_1_Low_Text" , iTime (symbol,frame, 120 ),week.GetLow(), "Week 1:  " + DoubleToString (week.GetLow(),digits), ANCHOR_RIGHT_UPPER , "Arial" , 8 , clrBlue , "" ,digits);

   RedrawHLine(ChartId,Window,Name+ "_Week_Max_High" ,week.max, clrRed , 1 , DoubleToString (week.max,digits),digits);
   RedrawHLine(ChartId,Window,Name+ "_Week_Min_Low" ,week.min, clrRed , 1 , DoubleToString (week.min,digits),digits);
   RedrawText(ChartId,Window,Name+ "_Week_Max_Text" , iTime (symbol,frame, 170 ),week.max, "Week Max:  " + DoubleToString (week.max,digits), ANCHOR_RIGHT_LOWER , "Arial" , 8 , clrRed , "" ,digits);
   RedrawText(ChartId,Window,Name+ "_Week_Min_Text" , iTime (symbol,frame, 170 ),week.min, "Week Min:  " + DoubleToString (week.min,digits), ANCHOR_RIGHT_UPPER , "Arial" , 8 , clrRed , "" ,digits);
   
   //рисуем месячные линии
   RedrawHLine(ChartId,Window,Name+ "_Month_1_High" ,month.GetHigh(), clrBlue , 1 , DoubleToString (month.GetHigh(),digits),digits);
   RedrawHLine(ChartId,Window,Name+ "_Month_1_Low" ,month.GetLow(), clrBlue , 1 , DoubleToString (month.GetLow(),digits),digits);
   RedrawText(ChartId,Window,Name+ "_Month_1_High_Text" , iTime (symbol,frame, 220 ),month.GetHigh(), "Month 1:  " + DoubleToString (month.GetHigh(),digits), ANCHOR_RIGHT_LOWER , "Arial" , 8 , clrBlue , "" ,digits);
   RedrawText(ChartId,Window,Name+ "_Month_1_Low_Text" , iTime (symbol,frame, 220 ),month.GetLow(), "Month 1:  " + DoubleToString (month.GetLow(),digits), ANCHOR_RIGHT_UPPER , "Arial" , 8 , clrBlue , "" ,digits);

   RedrawHLine(ChartId,Window,Name+ "_Month_Max_High" ,month.max, clrRed , 1 , DoubleToString (month.max,digits),digits);
   RedrawHLine(ChartId,Window,Name+ "_Month_Min_Low" ,month.min, clrRed , 1 , DoubleToString (month.min,digits),digits);
   RedrawText(ChartId,Window,Name+ "_Month_Max_Text" , iTime (symbol,frame, 270 ),month.max, "Month Max:  " + DoubleToString (month.max,digits), ANCHOR_RIGHT_LOWER , "Arial" , 8 , clrRed , "" ,digits);
   RedrawText(ChartId,Window,Name+ "_Month_Min_Text" , iTime (symbol,frame, 270 ),month.min, "Month Min:  " + DoubleToString (month.min,digits), ANCHOR_RIGHT_UPPER , "Arial" , 8 , clrRed , "" ,digits);
   }

//получаем номер недели в году
int GetWeekNumber( datetime eTime)
   {
   MqlDateTime eDate;
   //получаем дату начала года
   TimeToStruct (eTime,eDate);
   eDate.mon= 1 ;
   eDate.day= 1 ;
   eDate.hour= 0 ;
   eDate.min= 0 ;
   eDate.sec= 0 ;
   datetime StartTime= StructToTime (eDate);
   //возвращаем дату назад в структуру, чтобы определить день недели начала года
   TimeToStruct (StartTime,eDate);
   return ( int ((eTime-StartTime+ 86400 *eDate.day_of_week)/ 604800 ));
   }

//перерисовывает линию по новым координатам, если её нет, то создаёт
void RedrawHLine( long eChartId, int eWindow, string eName, double ePrice, color eColor, int eWidth, string eTooltip, int eDigits)
   {
   if ( ObjectFind (eChartId,eName)==- 1 )
      {
       if (! ObjectCreate (eChartId,eName, OBJ_HLINE ,eWindow, 0 , 0 )) return ;
       ObjectSetInteger (eChartId,eName, OBJPROP_STYLE , STYLE_SOLID );
       ObjectSetInteger (eChartId,eName, OBJPROP_WIDTH ,eWidth);
       ObjectSetInteger (eChartId,eName, OBJPROP_BACK , true );
       ObjectSetInteger (eChartId,eName, OBJPROP_SELECTABLE , false );
       ObjectSetInteger (eChartId,eName, OBJPROP_SELECTED , false );
       ObjectSetInteger (eChartId,eName, OBJPROP_HIDDEN , true );
      }
   if ( ObjectFind (eChartId,eName)==- 1 ) return ;   
   if ( NormalizeDouble ( ObjectGetDouble (eChartId,eName, OBJPROP_PRICE )-ePrice,eDigits)!= 0 ) ObjectSetDouble (eChartId,eName, OBJPROP_PRICE ,ePrice);
   if ( ObjectGetInteger (eChartId,eName, OBJPROP_COLOR )!=eColor) ObjectSetInteger (eChartId,eName, OBJPROP_COLOR ,eColor);
   if ( ObjectGetString (eChartId,eName, OBJPROP_TOOLTIP )!=eTooltip) ObjectSetString (eChartId,eName, OBJPROP_TOOLTIP ,eTooltip);
   }

//перерисовываем текст по новым координатам, если его нет, то создаём
void RedrawText( long eChartId, int eWindow, string eName, datetime eTime, double ePrice, string eText, ENUM_ANCHOR_POINT eAnchor, string eFont, int eSize, color eColor, string eTooltip, int eDigits)
   {
   if ( ObjectFind (eChartId,eName)==- 1 )
      {
       if (! ObjectCreate (eChartId,eName, OBJ_TEXT ,eWindow, 0 , 0 )) return ;
       ObjectSetString (eChartId,eName, OBJPROP_FONT ,eFont);
       ObjectSetInteger (eChartId,eName, OBJPROP_FONTSIZE ,eSize);
       ObjectSetDouble (eChartId,eName, OBJPROP_ANGLE , 0.0 );
       ObjectSetInteger (eChartId,eName, OBJPROP_ANCHOR ,eAnchor);
       //на переднем  плане
       ObjectSetInteger (eChartId,eName, OBJPROP_BACK , false );
       ObjectSetInteger (eChartId,eName, OBJPROP_SELECTABLE , false );
       ObjectSetInteger (eChartId,eName, OBJPROP_SELECTED , false );
       ObjectSetInteger (eChartId,eName, OBJPROP_HIDDEN , true );
       ObjectSetString (eChartId,eName, OBJPROP_TOOLTIP ,eTooltip);
      }
   if ( ObjectFind (eChartId,eName)==- 1 ) return ;
   //координаты метки
   if ( ObjectGetInteger (eChartId,eName, OBJPROP_TIME )!=eTime) ObjectSetInteger (eChartId,eName, OBJPROP_TIME ,eTime);
   if ( NormalizeDouble ( ObjectGetDouble (eChartId,eName, OBJPROP_PRICE )-ePrice,eDigits)!= 0 ) ObjectSetDouble (eChartId,eName, OBJPROP_PRICE ,ePrice);
   if ( ObjectGetInteger (eChartId,eName, OBJPROP_COLOR )!=eColor) ObjectSetInteger (eChartId,eName, OBJPROP_COLOR ,eColor);
   if ( ObjectGetString (eChartId,eName, OBJPROP_TEXT )!=eText) ObjectSetString (eChartId,eName, OBJPROP_TEXT ,eText);
   }
 

미묘한 차이는 한 경우에는 전날을 기록과 비교하고 다른 경우에는 이전 주를 비교한다는 것입니다. 어제 우리는 현재 주에 속할 수 있지만 최대값은 이전 주의 최대값보다 클 수 있습니다.

그리고 우리는 일과 일, 주와 주를 비교하기 때문에 요일의 상위 라인이 주별 라인보다 높을 수 있습니다. 여기처럼:

그러나 이것은 당신의 논리입니다. 필요한지 여부를 생각하십시오.

 //--- Max_W_Level
 for ( int i = 1 ; i< ArrayRange (Bar_data_D1, 0 ) ;i++)
    {
     //Print(" i = ",i);
     if (Bar_data_D1 [i][ 3 ]>= 0 )
       {
         if (Bar_data_W1 [i][ 3 ] > High_W1_Level)    
          {
           Max_W_Level = Bar_data_W1 [i][ 3 ]; break ;
          }
       }  
    } 
 

그건 그렇고, 다음은 배열을 넘어서는 오류입니다.

 //--- Max_W_Level
 for ( int i = 1 ; i< ArrayRange ( Bar_data_D1 , 0 ) ;i++)
    {
     if ( Bar_data_D1 [i][ 3 ]>= 0 )
       {
         if ( Bar_data_W1 [i][ 3 ] > High_W1_Level)    
          {
           Max_W_Level = Bar_data_W1 [i][ 3 ]; break ;
          }
       }  
    } 

루프는 일일 막대 배열을 통해 이동하고 주간 막대 배열에서 요소를 선택합니다.

 

나는 올해의 주 번호를 얻는 아이디어에 대해 Dmitry Fedoseev 에게 감사를 표합니다.

나는 이 기사를 감시했다: https://www.mql5.com/ru/articles/599

잘했어, 디마!
Dmitry Fedoseev
Dmitry Fedoseev
  • www.mql5.com
Добавил тему А как часто это бывает у вас? Согласен с модераторами, вопрос совершенно не по теме форума. Так что если удалите не обижусь. Надеюсь на забаните. Собственно вопрос всем - как часто ваш мобильный оператор подписывает вас на какую-нибудь фигню? И естественно потом доказывает, что Добавил опрос Как у вас с электропитанием? Добавил...
 
Aleksei Stepanenko :

그건 그렇고, 다음은 배열을 넘어서는 오류입니다.

루프는 일일 막대 배열을 통해 이동하고 주간 막대 배열에서 요소를 선택합니다.


예, 명백한 실수가 있습니다. 이 라인은 토론 중에 추가되었으며 복사-붙여넣기가 역할을 했습니다.

처음에는 이런 식이었고 어레이를 넘어서는 것은 여전히 적합합니다.

당신이 너무 게으르지 않고 많은 고급 코드를 제공했기 때문에 오류가 있는 범위를 벗어난 배열을 잊어버릴 수 있는 것처럼 보이지만(이에 대해 특별히 감사합니다)

그러나 여전히 실제 문제가 무엇인지 파악하고 싶습니다(어드바이저의 다른 곳에서 이 배열에 대한 호소가 있고 거기서 무슨 일이 일어나는지는 미스터리로 남아 있기 때문에)

( 그리고 int형의 반환값은 어디에 저장되어 있나요? 함수에 모든 데이터를 넘겼는데 아무것도 얻지 못했습니다.) 라는 말이 추가되었습니다.

다음과 같았습니다.

ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // 지정된 차트의 막대 데이터를 배열에 복사하고 복사된 막대의 수를 반환합니다.

ArrayCopyRates(Bar_data_W1,_Symbol,PERIOD_W1); // 지정된 차트의 막대 데이터를 배열에 복사하고 복사된 막대의 수를 반환합니다.

ArrayCopyRates(Bar_data_MN1,_Symbol,PERIOD_MN1); // 지정된 차트의 막대 데이터를 배열에 복사하고 복사된 막대의 수를 반환합니다.

다음과 같이 되었습니다.

ACR_D1 = ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // 지정된 차트의 막대 데이터를 배열에 복사하고 복사된 막대의 수를 반환합니다.

ACR_W1 = ArrayCopyRates(Bar_data_W1,_Symbol,PERIOD_W1); // 지정된 차트의 막대 데이터를 배열에 복사하고 복사된 막대의 수를 반환합니다.

ACR_MN1 = ArrayCopyRates(Bar_data_MN1,_Symbol,PERIOD_MN1); // 지정된 차트의 막대 데이터를 배열에 복사하고 복사된 막대의 수를 반환합니다.

전류에 대한 출력 값



2020.12.12 16:51:31.536 2020.02.10 00:05:00 _테스트 AUDUSD,H1: i = 1001 Bar_data_D1[i][2] = 0.7633799999999999

2020.12.12 16:51:31.536 2020.02.10 00:05:00 _테스트 AUDUSD,H1: i = 1002 Bar_data_D1[i][2] = 0.76147

2020.12.12 16:51:31.536 2020.02.10 00:05:00 _테스트 AUDUSD,H1: i = 1003 Bar_data_D1[i][2] = 0.75097

2020.12.12 16:51:31.536 2020.02.10 00:05:00 _Test AUDUSD,H1: '_Test.mq4'(150.59)의 범위를 벗어난 배열

2020.12.12 16:51:31.537 2020.02.10 00:05:00 EA의 치명적인 오류로 인해 테스트 통과가 중지되었습니다.

2020.12.12 16:51:31.537 AUDUSD,H1: 0:00:02.407(총 시간 0:00:05.672)에 처리된 65147개의 틱 이벤트(73개 막대, 9291875개 막대 상태)

 #property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.4"
#property strict

#include <stderror.mqh>
#include <stdlib.mqh>
//------------------------------------------------------------------+
int Order_MagicNumber; // для авто торговли 
int Magic = 0 ;         //для ручная торговля
//------------------------------------------------------------------+
extern color   Color               = clrBlue ;   // Color линия Bid

//+------------------------------------------------------------------+
//|                  переменные Функция Level 
//+------------------------------------------------------------------+
double    Bar_data_D1  [][ 6 ]; // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров D1
int       ACR_D1;             // Возвращает количество скопированных баров D1
double    Bar_data_W1  [][ 6 ]; // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров W1
int       ACR_W1;             // Возвращает количество скопированных баров W1
double    Bar_data_MN1 [][ 6 ]; // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров MN1
int       ACR_MN1;             // Возвращает количество скопированных баров MN1
double    High_D1_Level;       // Возвращает значение максимальной цены бара D1
double    Low_D1_Level;       // Возвращает значение минимальной цены бара  D1
double    High_W1_Level;       // Возвращает значение максимальной цены бара W1
double    Low_W1_Level ;       // Возвращает значение минимальной цены бара  W1
double    High_MN1_Level;     // Возвращает значение максимальной цены бара MN1
double    Low_MN1_Level;       // Возвращает значение минимальной цены бара  MN1
double    Max_D_Level;         // ближайшей максимальный D уровень
double    Min_D_Level ;       // ближайшей минимальный  D уровень
double    Max_W_Level ;       // ближайшей максимальный W уровень
double    Min_W_Level ;       // ближайшей минимальный  W уровень
double    Max_MN_Level ;       // ближайшей максимальный MN уровень
double    Min_MN_Level ;       // ближайшей минимальный  MN уровень

//-------------------------------------------------------------------+
int        Time_Seconds;         // сохроняем секунду 
int        Time_Minute;         // сохроняем минуту 
int        Time_Hour;           // сохроняем час
datetime   Time_Day;             // сохроняем день

//-------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
 Level();
 return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
 DestroyObject();
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
{
 On_Timer();             // функция Timer
 Comment ( "\n" ,
           "\n" ,
           "\n" , " Возвращает количество скопированных баров D1  = " ,ACR_D1,
           "\n" , " Возвращает количество скопированных баров W1  = " ,ACR_W1,
           "\n" , " Возвращает количество скопированных баров MN1 = " ,ACR_MN1,
           "\n" ,
           "\n" );    
}    
//+------------------------------------------------------------------+
//|                        Функция Level 
//+------------------------------------------------------------------+
void Level()
{
 ACR_D1  = ArrayCopyRates(Bar_data_D1, _Symbol , PERIOD_D1 ); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров
 ACR_W1  = ArrayCopyRates(Bar_data_W1, _Symbol , PERIOD_W1 ); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров
 ACR_MN1 = ArrayCopyRates(Bar_data_MN1, _Symbol , PERIOD_MN1 ); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров
 
 High_D1_Level  = iHigh ( _Symbol , PERIOD_D1 , 1 );   // Возвращает значение максимальной цены бара D1
 Low_D1_Level   = iLow ( _Symbol , PERIOD_D1 , 1 );   // Возвращает значение минимальной цены бара  D1
 
//--- Max_D_Level
 //for(int i = 1; i<ArrayRange(Bar_data_D1,0) ;i++) // (если с этим то пролетаем со свистом (просто не перерисовываем линию этим днём)
   for ( int i = 1 ;  ;i++)                             // (так выход за массив)
    {
     Print ( "i = " ,i, " Bar_data_D1 [i][3] = " ,Bar_data_D1 [i][ 3 ]);
     if (Bar_data_D1 [i][ 3 ] > High_D1_Level)  
       {
        Max_D_Level = Bar_data_D1 [i][ 3 ]; break ;
       }
    } 
    
//--- 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 ] < Low_D1_Level)
        {
         Min_D_Level = Bar_data_D1 [i][ 2 ]; break ;
        }
     }      
    
 //+-----------------------High_D1_Level-----------------------------+  
 if ( ObjectFind ( "High_D1" )!=High_D1_Level) 
   {
     ObjectDelete ( "High_D1" );
     if ( ObjectFind ( "High_D1" )!= 0 )
      {
       ObjectCreate ( "High_D1" , OBJ_HLINE , 0 , Time[ 0 ],High_D1_Level);
       ObjectSet( "High_D1" , OBJPROP_COLOR , clrMaroon );
       ObjectSet( "High_D1" , OBJPROP_WIDTH , 1 );
      }
   } 
 if ( ObjectFind ( "High_D1_label" )!=High_D1_Level)
   {
     ObjectDelete ( "High_D1_label" ); 
     if ( ObjectFind ( "High_D1_label" ) != 0 )
      {
       ObjectCreate ( "High_D1_label" , OBJ_TEXT , 0 , Time[ 13 ], High_D1_Level);
       ObjectSetText( "High_D1_label" , "High_D1: " + DoubleToStr(High_D1_Level, _Digits ), 8 , "Verdana" , Brown);
      }
   } 
 //+-------------------------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);
      }
   } 
   
     //+-----------------------Max_D_Level-----------------------------+  
 if ( ObjectFind ( "Max_D" )!=Max_D_Level) 
   {
     ObjectDelete ( "Max_D" );
     if ( ObjectFind ( "Max_D" )!= 0 )
      {
       ObjectCreate ( "Max_D" , OBJ_HLINE , 0 , Time[ 0 ],Max_D_Level);
       ObjectSet( "Max_D" , OBJPROP_COLOR , clrMaroon );
       ObjectSet( "Max_D" , OBJPROP_WIDTH , 1 );
      }
   } 
 if ( ObjectFind ( "Max_D_label" )!=Max_D_Level)
   {
     ObjectDelete ( "Max_D_label" ); 
     if ( ObjectFind ( "Max_D_label" ) != 0 )
      {
       ObjectCreate ( "Max_D_label" , OBJ_TEXT , 0 , Time[ 30 ], Max_D_Level);
       ObjectSetText( "Max_D_label" , "Max_D: " + DoubleToStr(Max_D_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)== "High_D1" ){ ObjectDelete ( 0 , "High_D1" ); Print ( "<< Объект High_D1 удалён >>" );}
     if ( ObjectName (i)== "High_D1_label" ){ ObjectDelete ( 0 , "High_D1_label" ); Print ( "<< Объект High_D1_label удалён >>" );}
     
     if ( ObjectName (i)== "Low_D1" ){ ObjectDelete ( 0 , "Low_D1" ); Print ( "<< Объект Low_D1 удалён >>" );}
     if ( ObjectName (i)== "Low_D1_label" ){ ObjectDelete ( 0 , "Low_D1_label" ); Print ( "<< Объект Low_D1_label удалён >>" );}
     
   }
}
//+-------------------------------------------------------------------------+   
//                         функция Timer                    
//+-------------------------------------------------------------------------+
void On_Timer()
{
 if (Seconds() != Time_Seconds)
   {
    Time_Seconds = Seconds();
   }
     
 if (Minute() != Time_Minute)
   {   
    Time_Minute = Minute();
   }
     
 if (Hour() != Time_Hour)
   {
    
    Time_Hour = Hour();
   }
     
 if (Day()!= Time_Day)
   {
    Level();
    Time_Day = Day();
   }
}
 

왜 그렇게 적은 기록이 어레이에 복사됩니까?

이러한 가치는 어디에서 어떻게 오는가?

 
Aleksei Stepanenko :

그건 그렇고, 다음은 배열을 넘어서는 오류입니다.

루프는 일일 막대 배열을 통해 이동하고 주간 막대 배열에서 요소를 선택합니다.

그리고 일일 TF 어레이의 크기를 즉시 이해하고 시간을 감지하고 시간을 벗어나지 않습니다.

나는 아마 주간과 다르게 결정할 것이다. 나는 필요한 경우 날짜와 함께 할당 가격 수준을 얻을 것이고, 그것들을 별도의 배열에 던져 이 배열과 비교할 것입니다. 사실 그게 내가 하는 일이다. 각 TF에는 고유한 극값 배열이 있습니다.

나는 비교를 하지 않고 배열에 대해 이야기하고 있습니다.

Индикатор экстремумов по Вильямсу
Индикатор экстремумов по Вильямсу
  • www.mql5.com
Экстремумы первого порядка ищутся скользящим окном средний бара между соседними и разделяются на максимумы и минимумы первого порядка. Условие средний бар больше или меньше соседних. Максимумы и минимумы второго и третьего порядка ищутся раздельно среди максимумов и минимумов меньшего порядка. Максимумы второго ищутся между максимумами первого...
 
Valeriy Yastremskiy :

그리고 일일 TF 어레이의 크기를 즉시 이해하고 시간을 감지하고 시간을 벗어나지 않습니다.

나는 아마 주간과 다르게 결정할 것이다. 나는 필요한 경우 날짜와 함께 할당 가격 수준을 얻을 것이고, 그것들을 별도의 배열에 던져 이 배열과 비교할 것입니다. 사실 그게 내가 하는 일이다. 각 TF에는 고유한 극값 배열이 있습니다.

나는 비교를 하지 않고 배열에 대해 이야기하고 있습니다.

(필요한 경우 날짜와 함께 할당 가격 수준을 얻고 별도의 배열에 던져 이 배열과 비교합니다)

우리는 어떤 것이 필요하고 어떤 것이 필요하지 않을지 모릅니다. 모든 바의 가능한 전체 기록이 필요합니다.

ArrayCopyRates

지정된 차트의 막대 데이터를 배열에 복사하고 복사된 막대의 수를 반환합니다.

int ArrayCopyRates (
    MqlRates&    rate_array[] , // 참조에 의해 전달된 MqlRates 배열
          symbol=NULL , // 기기
    정수          기간=0      // 기간
);


어떻게 명확하지 않습니까?

연결을 이해할 수 없습니다.

323개월은 대략 27년 1403주 7015일 정도

1993년 이후 AUDUSD 내역, 2020-1993= 27


 Comment ( "\n" ,
           "\n" ,
           "\n" , " Возвращает количество скопированных баров D1  = " ,ACR_D1, всего получили 1003
           "\n" , " Возвращает количество скопированных баров W1  = " ,ACR_W1, здесь 1001
           "\n" , " Возвращает количество скопированных баров MN1 = " ,ACR_MN1,здесь 323
           "\n" ,
           "\n" );
 
Dark Kchlyzov :

(필요한 경우 날짜와 함께 할당 가격 수준을 얻고 별도의 배열에 던져 이 배열과 비교합니다)

우리는 어떤 것이 필요하고 어떤 것이 필요하지 않을지 모릅니다. 모든 바의 가능한 전체 기록이 필요합니다.

ArrayCopyRates

지정된 차트의 막대 데이터를 배열에 복사하고 복사된 막대의 수를 반환합니다.

int ArrayCopyRates (
    MqlRates&    rate_array[] , // 참조에 의해 전달된 MqlRates 배열
          symbol=NULL , // 기기
    정수          기간=0      // 기간
);


어떻게 명확하지 않습니까?

연결을 이해할 수 없습니다.

323개월은 대략 27년 1403주 7015일 정도

1993년 이후 AUDUSD 내역, 2020-1993= 27



우리는 무엇을 측정하거나 정의할 수 있는지 모릅니다. 먼저 범위를 측정하고 압니다.

그리고 27년 동안 낮에 모든 극단이 기록되고 평등한 극단이 드러난다면 그 극단이 너무 많을 것입니다. 이 작업은 디스크에서 복사본을 감지하는 것과 비슷하지만 더 쉽습니다.