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

 
Aleksei Stepanenko:

Ich verstehe nicht, was los ist. Es ist eine Linie von Minima.

Kopieren Sie den Code vorsichtshalber noch einmal, ich habe ihn dort regelmäßig geändert, vielleicht haben Sie eine alte Version

Ja, ich muss die Version beim Bearbeiten des Codes ändern.

AUDUSD scheint in Ordnung zu sein.

Ich werde über EURUSD für die Lotjahre gehen. Es wird lange dauern.

Ich würde gerne Woche und Monat auf einmal hinzufügen, wenn das nicht zu viel Mühe macht... Und ich würde gerne die Beschriftungen wie im Beispiel verschieben.

Damit ich mir das Diagramm nicht zehnmal ansehen muss. (Sie kennen die Geschichte bereits auswendig).

Ich glaube, ich schaffe 8 Paar in einem Monat.

Ich werde nicht selbst in Ihren Code einsteigen (ich werde den Prozess in aller Ruhe mit Klassen und so weiter anhand Ihres Beispiels studieren).

Beinahe hätte ich es vergessen (um eine Warnung auszugeben, wenn es keinen Verlauf gibt oder die Zeile ihre Werte nicht geändert hat)

 

Neue Version. Hier werden drei Zeiträume gezeichnet: Tag, Woche und Monat. Es gibt ein Aber, das ich weiter unten schreiben werde.

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

Der Unterschied besteht darin, dass wir im einen Fall den Vortag mit der Historie vergleichen und im anderen Fall die Vorwoche. Es stellt sich heraus, dass der gestrige Tag zwar zur aktuellen Woche gehört, sein Höchstwert aber höher sein kann als der Höchstwert der Vorwoche.

Und da wir Tage mit Tagen und Wochen mit Wochen vergleichen, kann sich herausstellen, dass die Linien der Tageshöchststände höher sind als die der Wochenhöchststände. Wie hier:

Aber das ist Ihre Logik, denken Sie nach, ob Sie es brauchen oder nicht.

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

Übrigens, es gibt auch einen Out-of-Array-Fehler:

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

Die Schleife durchläuft das Array der Tagesbalken, und wir wählen Elemente aus dem Array der Wochenbalken aus.

 

Dank an Dmitry Fedoseev für die Idee, die Nummer der Woche des Jahres zu erhalten.

Ich habe ihn in diesem Artikel gefunden:https://www.mql5.com/ru/articles/599

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

Übrigens, es gibt auch einen Out-of-Array-Fehler:

Die Schleife geht durch das Array der Tagesbalken, während wir Elemente aus dem Array der Wochenbalken auswählen.


Hier liegt ein offensichtlicher Fehler vor, diese Zeile wurde im Laufe der Diskussion hinzugefügt, und Copy-Paste spielte dabei eine Rolle.

Das war von Anfang an so, und das Überschreiten des Rahmens ist immer noch aktuell.

Wir können über den Fehler array out of range in vergessen, weil Sie nicht das Gefühl, faul und sofern viel mehr fortgeschrittenen Code (vielen Dank an Sie für das).

Aber ich möchte immer noch verstehen, was das Problem ist (da dieses Array von anderen Orten in der EA zugegriffen wird, und was dort vor sich geht bleibt ein Geheimnis)

Ich habe festgestellt (Wo wird der zurückgegebene Wert des Typs int gespeichert? Du hast alle Daten an die Funktion übergeben, aber nicht den ganzen Scheiß rausgeholt) habe ich hinzugefügt.

Es war folgendermaßen:

ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Kopiert die Balkendaten des angegebenen Charts in ein Array und gibt die Anzahl der kopierten Balken zurück

ArrayCopyRates(Bar_data_W1,_Symbol,PERIOD_W1); // Kopiert die Daten der Balken für ein bestimmtes Diagramm in ein Array und gibt die Anzahl der kopierten Balken zurück

ArrayCopyRates(Bar_data_MN1,_Symbol,PERIOD_MN1); // Kopiert die Daten der Balken eines angegebenen Charts in ein Array und gibt die Anzahl der kopierten Balken zurück

Jetzt sieht es so aus:

ACR_D1 = ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Kopiert die Balkendaten des angegebenen Charts in ein Array und gibt die Anzahl der kopierten Balken zurück

ACR_W1 = ArrayCopyRates(Bar_data_W1,_Symbol,PERIOD_W1); // Kopiert die Daten der Balken für ein bestimmtes Diagramm in ein Array und gibt die Anzahl der kopierten Balken zurück

ACR_MN1 = ArrayCopyRates(Bar_data_MN1,_Symbol,PERIOD_MN1); // Kopiert Daten von Balken in einem angegebenen Diagramm in ein Array und gibt die Anzahl der kopierten Balken zurück

Ausgabe des Wertes im 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 out of range in '_Test.mq4' (150,59)

2020.12.12 16:51:31.537 2020.02.10 00:05:00 Testdurchlauf gestoppt aufgrund eines kritischen Fehlers im EA

2020.12.12 16:51:31.537 AUDUSD,H1: 65147 Tick-Ereignisse (73 Balken, 9291875 Balkenzustände) verarbeitet in 0:00:02.407 (Gesamtzeit 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();
   }
}
 

Warum wird so wenig Geschichte in das Feld kopiert?

Und wo und wie kommen diese Werte überhaupt her?

 
Aleksei Stepanenko:

Übrigens, es gibt auch einen Out-of-Array-Fehler:

Die Schleife durchläuft das Array der Tagesbalken, und wir wählen Elemente aus dem Array der Wochenbalken aus.

Wir sollten sofort verstehen, wie groß das Feld der täglichen TF ist und es zeitlich einordnen und nicht über die Zeit hinausgehen.

Die wöchentlichen Balken würde ich wahrscheinlich anders lösen. Ich würde die Preisniveaus mit den wöchentlichen Daten abrufen, wenn sie benötigt werden, und sie in ein separates Array füllen und mit diesem Array vergleichen. Oder besser gesagt, so mache ich es. Für jede TF meine eigene Reihe von Extrema.

Ich mache keine Vergleiche, ich spreche über Arrays

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

Und sofort verstehen, wie groß das tägliche TF-Feld ist, und es zeitlich einordnen und pünktlich bleiben.

Die wöchentlichen Aufgaben würde ich wahrscheinlich anders lösen. Ich würde die Preisniveaus mit den wöchentlichen Terminen abfragen, wenn sie benötigt werden, und sie in ein separates Array eintragen und mit diesem Array vergleichen. Oder besser gesagt, so mache ich es. Für jede TF habe ich meine eigene Reihe von Extrema.

Ich ziehe keine Vergleiche, ich spreche von Arrays.

(Ich würde Preisniveaus mit Datumsangaben abrufen, wenn sie benötigt werden, und sie in ein separates Array füllen und mit diesem Array vergleichen)

Wir wissen nicht, welche wir brauchen und welche nicht, wir brauchen alle möglichen Geschichten von allen Bars.

ArrayCopyRates

Kopiert die Daten der angegebenen Diagrammbalken in ein Array und gibt die Anzahl der kopierten Balken zurück.

intArrayCopyRates(
MqlRates&rates_array[],// Array MqlRates übergeben durch die Referenz
stringsymbol=NULL,// das Werkzeug
intZeitrahmen=0// Zeitrahmen
);


Wo ist es nicht klar?

Ich kann den Zusammenhang nicht erkennen

Er sieht 323 Monate, was in etwa 27 Jahren, 1403 Wochen und 7015 Tagen entspricht.

AUDUSD-Verlauf seit 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:

(Ermitteln Sie bei Bedarf Preisniveaus mit Datumsangaben, legen Sie sie in ein separates Array und vergleichen Sie sie mit diesem Array).

Wir wissen nicht, welche wir brauchen und welche nicht, wir brauchen alle möglichen Geschichten von allen Bars.

ArrayCopyRates

Kopiert die Daten der angegebenen Diagrammbalken in ein Array und gibt die Anzahl der kopierten Balken zurück.

intArrayCopyRates(
MqlRates&rates_array[],// Array MqlRates übergeben durch die Referenz
stringsymbol=NULL,// das Werkzeug
intZeitrahmen=0// Zeitrahmen
);


Wo ist es nicht klar?

Ich kann den Zusammenhang nicht erkennen

Er sieht 323 Monate, was in etwa 27 Jahren, 1403 Wochen und 7015 Tagen entspricht.

AUDUSD-Verlauf seit 1993, 2020-1993= 27



Keine Vorstellung davon, was gemessen oder bestimmt werden kann. Zuerst messen wir die Reichweite, und wir wissen.

Wenn wir alle Extrema in den täglichen Daten über 27 Jahre aufschreiben und die gleichen identifizieren, werden es zu viele sein. Die Aufgabe ist ähnlich wie die Identifizierung von Kopien auf einer Disc, nur einfacher.

Grund der Beschwerde: