阵列超出范围,需要帮助 - 页 10

 
Aleksei Stepanenko:

我不明白什么是错的。这是一条最低限度的线。

以防万一,再次复制代码,我在那里定期修改,也许你有一个旧的版本

是的是的,我必须在编辑代码时改变版本。

澳元兑美元似乎还可以。

我将翻阅欧元兑美元的焊料年份。它将是漫长的。

我还添加了周和月作为例子,这样我的眼睛就不会漂移

这样就不会把图看十遍了。(已经对这个故事烂熟于心)。

我想我可以在一个月内管理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:

顺便说一下,也有一个阵列外 的错误。

循环遍历日线数组,同时我们从周线数组中选择元素。


这里有一个明显的错误,这一行是在讨论过程中添加的,复制粘贴发挥了作用。

从一开始就是这样,走出阵列仍然是有意义的。

我们似乎忘记了错误数组超出范围的问题,因为你不觉得自己偷懒,提供了更多的高级代码(为此非常感谢你)。

但我还是想了解问题出在哪里(因为这个数组是从EA的其他地方访问的,那里发生了什么仍然是个谜)。

我已经注意到(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); // 将指定图表中的条形数据复制到一个数组中,并返回复制的条形数量。

输出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.76337999999999

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 由于EA中的一个关键错误,测试通过停止。

2020.12.12 16:51:31.537 AUDUSD,H1: 在0:00:02.407中处理了65147个tick事件(73条,9291875条状态)(总时间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();
   }
}
 

为什么这么少的历史被复制到阵列中?

这些价值观首先从哪里来,怎么来的?

 
Aleksei Stepanenko:

顺便说一下,也有一个阵列外 的错误。

循环遍历日线数组,我们从周线数组中选择元素。

我们应该立即了解每天TF的阵列大小,并对其进行计时,不要超越时间。

我可能会以不同的方式解决每周一次的酒吧。如果需要的话,我会得到带有日期的价格水平,并把它们填入一个单独的数组,然后与这个数组进行比较。或者说,我就是这样 的。对于每个TF我都有自己的极值数组。

我不是在做比较,我说的是数组。

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

并立即了解每天TF阵列的大小,并为其计时,保持准时。

我可能会以不同的方式解决每周的问题。如果需要的话,我会在每周的价格水平上得到日期,并把它们填入一个单独的数组,然后与这个数组进行比较。或者说,我就是这样 的。每个TF都有我自己的极值数组。

我不是在做比较,我说的是数组。

(如果需要的话,我会得到带有日期的价格水平,并将它们填入一个单独的数组,然后与该数组进行比较)

我们不知道哪些是我们需要的,哪些是我们不需要的,我们需要所有酒吧的所有可能的历史。

ArrayCopyRates

将指定的图表条形图的数据复制到一个数组中,并返回复制的条形图的数量。

intArrayCopyRates(
MqlRates&rates_array[],// array MqlRates passed by reference
stringsymbol=NULL//工具
inttimeframe=0// timeframe
);


哪里不清楚?

我搞不清楚其中的联系

它看到323个月,接近27年,1403周,7015天。

澳元兑美元自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:

(如果需要的话,获得带有日期的价格水平,并把它们放在一个单独的数组中,与这个数组进行比较)。

我们不知道哪些是我们需要的,哪些是我们不需要的,我们需要所有酒吧的所有可能的历史。

ArrayCopyRates

将指定的图表条形图的数据复制到一个数组中,并返回复制的条形图的数量。

intArrayCopyRates(
MqlRates&rates_array[],// array MqlRates passed by reference
stringsymbol=NULL//工具
inttimeframe=0// timeframe
);


哪里不清楚?

我搞不清楚其中的联系

它看到323个月,接近27年,1403周,7015天。

澳元兑美元自1993年以来的历史,2020-1993=27



不知道在什么地方可以测量或确定。首先我们测量范围,我们知道。

如果我们写下27年来的每日数据中的 所有极值,并找出相等的极值,它们将是太多了。这项任务类似于识别光盘上的副本,只是更简单。