Array fuori portata in Bisogno di aiuto - pagina 10

 
Aleksei Stepanenko:

Non capisco cosa c'è che non va. È una linea di minimo.

Per sicurezza, copiate di nuovo il codice, l'ho cambiato periodicamente, forse avete una vecchia versione

Sì sì, devo cambiare la versione quando modifico il codice.

AUDUSD sembra essere a posto.

Andrò su EURUSD per gli anni della saldatura. Sarà lungo.

Vorrei aggiungere la settimana e il mese in una volta sola, se non è troppo difficile, e spostare le etichette come nell'esempio.

Per non guardare il grafico dieci volte. (già conoscono la storia a memoria).

Penso di poterne gestire 8 paia in un mese.

Non entrerò io stesso nel tuo codice (studierò tranquillamente il processo con le classi e così via usando il tuo esempio).

Quasi dimenticato (per fare un avviso come un avvertimento se non c'è storia o la linea non ha cambiato i suoi valori)

 

Nuova versione. Qui disegna tre periodi: giorno, settimana e mese. C'è un ma, che scriverò di seguito.

#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);
   }
 

La sfumatura è che in un caso stiamo confrontando il giorno precedente alla storia e nell'altro stiamo confrontando la settimana precedente. Si scopre che ieri può appartenere alla settimana in corso, ma il suo massimo può essere superiore al massimo della settimana precedente.

E poiché stiamo confrontando i giorni con i giorni e le settimane con le settimane, potrebbe risultare che le linee dei massimi giornalieri siano più alte dei massimi settimanali. Come qui:

Ma questa è la tua logica, pensa se ne hai bisogno o no.

//--- 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;
          }
       }  
    } 
 

A proposito, c'è anche un errore out-of-array:

//--- 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;
          }
       }  
    } 

Il ciclo passa attraverso l'array di barre giornaliere, e selezioniamo elementi dall'array di barre settimanali.

 

Grazie a Dmitry Fedoseev per l'idea di ottenere il numero della settimana dell'anno.

L'ho trovato in questo articolo:https://www.mql5.com/ru/articles/599

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

A proposito, c'è anche un errore out-of-array:

Il ciclo passa attraverso l'array di barre giornaliere, mentre noi selezioniamo elementi dall'array di barre settimanali.


C'è un errore evidente qui, questa linea è stata aggiunta nel processo di discussione e il copia-incolla ha giocato il suo ruolo.

Era così fin dall'inizio e andare fuori dalla matrice è ancora rilevante.

Può sembrare che ci dimentichiamo dell'errore array out of range in , perché non ti sei sentito pigro e hai fornito un codice molto più avanzato (molte grazie a te per questo).

Ma voglio ancora capire qual è il problema (dato che si accede a questo array da altri posti dell'EA, e quello che succede lì rimane un mistero)

Ho notato (Dove viene salvato il valore restituito del tipo int? Hai passato tutti i dati nella funzione, ma non hai ottenuto la merda) ho aggiunto .

Era così:

ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Copia i dati delle barre del grafico specificato in un array e restituisce il numero di barre copiate

ArrayCopyRates(Bar_data_W1,_Symbol,PERIOD_W1); // Copia i dati delle barre per un grafico specificato in un array e restituisce il numero di barre copiate

ArrayCopyRates(Bar_data_MN1,_Symbol,PERIOD_MN1); // Copia i dati delle barre di un grafico specificato in un array e restituisce il numero di barre copiate

Ora appare così:

ACR_D1 = ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Copia i dati delle barre del grafico specificato in un array e restituisce il numero di barre copiate

ACR_W1 = ArrayCopyRates(Bar_data_W1,_Symbol,PERIOD_W1); // Copia i dati delle barre per un grafico specificato in un array e restituisce il numero di barre copiate

ACR_MN1 = ArrayCopyRates(Bar_data_MN1,_Symbol,PERIOD_MN1); // Copia i dati delle barre in un grafico specificato in un array e restituisce il numero di barre copiate

Emettere il valore nella som



2020.12.12 16:51:31.536 2020.02.10 00:05:00 _Test AUDUSD,H1: i = 1001 Bar_data_D1 [i][2] = 0.7633799999999999

2020.12.12 16:51:31.536 2020.02.10 00:05:00 _Test AUDUSD,H1: i = 1002 Bar_data_D1 [i][2] = 0,76147

2020.12.12 16:51:31.536 2020.02.10 00:05:00 _Test 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: array fuori range in '_Test.mq4' (150,59)

2020.12.12 16:51:31.537 2020.02.10 00:05:00 Il passaggio dei test si è fermato a causa di un errore critico nell'EA

2020.12.12 16:51:31.537 AUDUSD,H1: 65147 eventi tick (73 barre, 9291875 stati delle barre) elaborati in 0:00:02.407 (tempo totale 0:00:05.672)

#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();
   }
}
 

Perché c'è così poca storia copiata nell'array?

Da dove e come vengono questi valori?

 
Aleksei Stepanenko:

A proposito, c'è anche un errore out-of-array:

Il ciclo passa attraverso l'array di barre giornaliere, e selezioniamo elementi dall'array di barre settimanali.

Dovremmo capire subito la dimensione della matrice del TF giornaliero e cronometrarla e non andare oltre il tempo.

Probabilmente risolverei le barre settimanali in modo diverso. Otterrei i livelli di prezzo con le date a quelle settimanali, se sono necessarie, e le riempirei in un array separato e le confronterei con questo array. O meglio, è così che faccio io. Per ogni TF ho il mio array di estremi.

Non sto facendo paragoni, sto parlando di array

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

E capire immediatamente la dimensione della matrice TF giornaliera e cronometrarla e rimanere in tempo.

Probabilmente risolverei quelli settimanali in modo diverso. Otterrei i livelli di prezzo con le date a quelle settimanali, se sono necessarie, e le riempirei in un array separato e le confronterei con questo array. O meglio, è così che faccio io. Per ogni TF ho il mio array di estremi.

Non sto facendo paragoni, sto parlando di array.

(Otterrei i livelli di prezzo con le date, se sono necessari, e li riempirei in un array separato e li confronterei con quell'array)

Non sappiamo quali ci servono e quali no, abbiamo bisogno di tutta la storia possibile di tutti i bar.

ArrayCopyRates

Copia i dati delle barre del grafico specificato in un array e restituisce il numero di barre copiate.

intArrayCopyRates(
MqlRates&rates_array[],// array MqlRates passato dal riferimento
stringasymbol=NULL,// lo strumento
inttimeframe=0// timeframe
);


Dove non è chiaro?

Non riesco a capire la connessione

Vede 323 mesi che è da qualche parte vicino a 27 anni, 1403 settimane, 7015 giorni

Storia di AUDUSD dal 1993, 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:

(Prendi i livelli di prezzo con le date, se necessario, e mettili in un array separato e confrontali con questo array).

Non sappiamo quali ci servono e quali no, abbiamo bisogno di tutta la storia possibile di tutti i bar.

ArrayCopyRates

Copia i dati delle barre del grafico specificato in un array e restituisce il numero di barre copiate.

intArrayCopyRates(
MqlRates&rates_array[],// array MqlRates passato dal riferimento
stringasymbol=NULL,// lo strumento
inttimeframe=0// timeframe
);


Dove non è chiaro?

Non riesco a capire la connessione

Vede 323 mesi che è da qualche parte vicino a 27 anni, 1403 settimane, 7015 giorni

Storia di AUDUSD dal 1993, 2020-1993= 27



Nessuna idea in ciò che può essere misurato o determinato. Prima misuriamo la portata e sappiamo.

Se scriviamo tutti gli estremi nei dati giornalieri su 27 anni e identifichiamo quelli uguali, saranno troppi. Il compito è simile all'identificazione delle copie su un disco, solo più semplice.