Глюк - изменение числа баров графика

 
Этот вопрос уже поднимался. Я надеялся, что в 184 билде он будет решен, но увы ...

У меня стоит Макс. число баров в окне - 50000.
При запуске МТ грузит в окно (конкретно - EURUSD,M1) 50000 баров. Дальше (по идее)
число баров может со временем только расти. Но это только по идее.
МТ работает без перерывов все 5 рабочих суток недели. За это время по несколько раз
в сутки возникает ситуация, когда количество баров на графике подрезается. В результате
графики непрерывных индикаторов не страдают, но вот график ЗигЗага сбивается совершенно.

В принципе решить эту проблему можно было бы внутри самого индикатора через его
перезапуск. Что я и сделал. Однако это не помогло. Почему-то после этого график ЗигЗага
начинает отрисовываться неправильно.

Имею подозрение, что вся эта ситуация (и подрезание числа баров, и последующая
неправильная отрисовка ЗигЗага) каким-то образом связаны с опцией DRAW_SECTION.
Можно было бы, конечно, на все это закрыть глаза - в конце концов ЗигЗаг на практике
полезен мало, но все это говорит о проблемах в самой системе МТ. Если не убрать их
сейчас, то они вылезут в реальной торговле, причем неизвестно каким боком.

Вот часть сообщений индикатора на прошлой неделе:
Перезапуск ZZ. Текущее Bars: 49999 Текущее начало: 2005.09.12 10:26:00 Текущее время: 2005.11.04 11:16:32
Изменение Bars. Прежнее Bars: 50767 Прежнее начало: 2005.09.12 10:26:00 Текущее время: 2005.11.04 13:28:20
Перезапуск ZZ. Текущее Bars: 50639 Текущее начало: 2005.09.12 12:52:00 Текущее время: 2005.11.04 13:28:21
Изменение Bars. Прежнее Bars: 50767 Прежнее начало: 2005.09.12 12:52:00 Текущее время: 2005.11.04 15:42:16
Перезапуск ZZ. Текущее Bars: 50639 Текущее начало: 2005.09.12 15:14:00 Текущее время: 2005.11.04 15:42:21
Изменение Bars. Прежнее Bars: 50767 Прежнее начало: 2005.09.12 15:14:00 Текущее время: 2005.11.04 17:50:10
Перезапуск ZZ. Текущее Bars: 50639 Текущее начало: 2005.09.12 17:23:00 Текущее время: 2005.11.04 17:50:14
Перезапуск ZZ. Текущее Bars: 50676 Текущее начало: 2005.09.12 17:23:00 Текущее время: 2005.11.04 18:27:17
Изменение Bars. Прежнее Bars: 50767 Прежнее начало: 2005.09.12 17:23:00 Текущее время: 2005.11.04 20:05:04
Перезапуск ZZ. Текущее Bars: 50639 Текущее начало: 2005.09.12 20:20:00 Текущее время: 2005.11.04 20:05:07


Ниже выкладываю код ЗиЗага. Алгоритм примерно тот же, что выкладывал когда-то Quark. Может чуть лучше, поскольку работает на всех ТФ, при всех значениях параметра и в реальном времени. Хотя все равно несовершенен, поскольку, как уже обсуждалось на этом форуме, нет возможности нарисовать максимум и минимум на одном баре. Дело не в индикаторе, а в той ошибке, которую он инициирует.
Просто повесьте его в том окне, где число баров превышает ваш параметр "Макс. число баров в окне".
Как только ЗигЗаг оторвется от баров - это случилось, можете проверить по первому бару в окне.

//+------------------------------------------------------------------+
//|                                              MY_ZigZag Index.mq4 |
//|                                              Copyright © 2005, yurixx|
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, yurixx"
#property link      "yurixx"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

//---- indicator parameters
extern int ZZ_Range=5;  // Minimum Points Range for High,Low apexes

//---- indicator buffers
double ZZ_Buffer[];

//---- variables
int    Flag, Dig, Mult, NumBars, handle, 
       limit, cntBars, oldBars, tikBar;
double lastLow,lastHigh,delLow,delHigh;
bool   OnStart;

//+------------------------------------------------------------------+
//| MY_ZigZag Index initialization function                          |
//+------------------------------------------------------------------+
int init()
{
//---- indicator buffers mapping
   SetIndexBuffer(0,ZZ_Buffer);
   SetIndexEmptyValue(0,0.0);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION); //,STYLE_SOLID,2,Blue);
   SetIndexDrawBegin(0,0);
//---- name for DataWindow
   IndicatorShortName("ZZ("+ZZ_Range+")");

   if (ZZ_Range < 1) ZZ_Range = 1;
   Dig = Digits;
   Mult = 1/Point;
   OnStart = true;
   cntBars = 0;
   oldBars = 1;
      
//---- initialization done
   return(0);
}
//+------------------------------------------------------------------+
//|  MY_ZigZag Index indicator function                              |
//+------------------------------------------------------------------+
int start()
{  if (OnStart)
   {  NumBars = Bars-1;
      lastLow = Low[NumBars];
      lastHigh = High[NumBars];
      ArrayInitialize(ZZ_Buffer,0.0);
      for (tikBar=NumBars-1; tikBar>=0; tikBar--)
      {  if ((Low[tikBar]<lastLow)&&(High[tikBar]<lastHigh))
         {  ZZ_Buffer[NumBars] = lastLow; Flag = -1; break; }
         if ((Low[tikBar]>lastLow)&&(High[tikBar]>lastHigh))
         {  ZZ_Buffer[NumBars] = lastHigh; Flag = 1; break; }
      }
      OnStart = false;
   }

   limit = Bars-1-cntBars;
   cntBars += limit;
   for (tikBar=limit; tikBar>0; tikBar--)
   {  delLow  = NormalizeDouble(Low[tikBar]-lastLow,Dig);
      delHigh = NormalizeDouble(High[tikBar]-lastHigh,Dig);
      if (Flag > 0)
      {  if ((delHigh>0)||(delHigh==0 && MathRound(Mult*(lastHigh-Low[tikBar]))<ZZ_Range))
         {  lastHigh = High[tikBar];
            if (delLow>0) lastLow = Low[tikBar];
            ZZ_Buffer[tikBar] = lastHigh;
            ZZ_Buffer[Bars - oldBars] = 0.0;
            oldBars = Bars - tikBar;    }
         else if (MathRound(Mult*(lastHigh-Low[tikBar]))>=ZZ_Range)
              {  Flag = -1;
                 lastLow = Low[tikBar];
                 lastHigh = High[tikBar];
                 ZZ_Buffer[tikBar] = lastLow;
                 oldBars = Bars - tikBar;   }
      }
      else 
      {  if ((delLow<0)||(delLow==0 && MathRound(Mult*(High[tikBar]-lastLow))<ZZ_Range))
         {  lastLow = Low[tikBar];
            if (delHigh<0) lastHigh = High[tikBar];
            ZZ_Buffer[tikBar] = lastLow;
            ZZ_Buffer[Bars - oldBars] = 0.0;
            oldBars = Bars - tikBar;    }
         else if (MathRound(Mult*(High[tikBar]-lastLow))>=ZZ_Range)
              {  Flag = 1;
                 lastLow = Low[tikBar];
                 lastHigh = High[tikBar];
                 ZZ_Buffer[tikBar] = lastHigh;
                 oldBars = Bars - tikBar;   }
      }
   }

//---- done
   return(0);
}
 
У меня стоит Макс. число баров в окне - 50000.
При запуске МТ грузит в окно (конкретно - EURUSD,M1) 50000 баров. Дальше (по идее)
число баров может со временем только расти. Но это только по идее.
МТ работает без перерывов все 5 рабочих суток недели. За это время по несколько раз
в сутки возникает ситуация, когда количество баров на графике подрезается.

не было ли запрошено обновление данных (например, через контекстное меню графика - Refresh)?
хотелось бы узнать сопутствующие обстоятельства перед подрезанием количества баров
 
У меня стоит Макс. число баров в окне - 50000.
При запуске МТ грузит в окно (конкретно - EURUSD,M1) 50000 баров. Дальше (по идее)
число баров может со временем только расти. Но это только по идее.
МТ работает без перерывов все 5 рабочих суток недели. За это время по несколько раз
в сутки возникает ситуация, когда количество баров на графике подрезается.

не было ли запрошено обновление данных (например, через контекстное меню графика - Refresh)?
хотелось бы узнать сопутствующие обстоятельства перед подрезанием количества баров


Абсолютно никаких обстоятельств. Просто МТ работает (кроме него больше никаких программ не
запущено) и в какой-то момент это происходит. Несколько раз мне повезло - наблюдал это своими
глазами. Никаких действий до этого не предпринимал, Refresh не нажимал, просто наблюдал процесс
на форексе. Часто это событие происходит ночью, когда к компьютеру вообще никто не касается.

Если обратите внимание на приведенные мной сообщения индикатора, то увидите, что какое-то время
подрезание происходит всегда до одного и того же числа баров. Потом это "магическое чило" как-то преодолевается и возникает новое, которое держится некоторое время. Потом опять.

В приведенном куске подрезание происходило после 50767 баров и всегда до 50639 баров. Но в числах этих нет никакого смысла, поскольку 50767 было в конце концов преодолено и возникла новая пара. Да и в других случаях возникали другие числа.

Простейший способ проверить это - повесить индикатор на график, чтобы он поработал достаточное время без перезагрузки. Нужно только чтобы в файле истории было больше, чем 50000 баров, а параметр Макс. число баров в окне был равен 50000.

АУ, ЭНТУЗИАСТЫ ! Поддержите разработчиков, потестируйте ситуацию на своих компьютерах.
Разве трудно повесить простенький индикатор туда же, где непрерывно трудятся ваши экспетры ? :-)
Кроме графика ЗигЗага, ничего при этом событии не пострадает.
 
Попробовал ситуацию на сервере реального брокера (Брезан) на реальном счету.
Все то же самое. Вот сообщения индикатора за неделю:

Перезапуск ZZ. Bars: 49999 Текущее начало: 2005.09.12 18:56:00 Текущее время: 2005.11.14 01:00:00
Изменение Bars. Было: 51157 Прежнее начало: 2005.09.12 18:56:00 Текущее время: 2005.11.16 00:50:04

Перезапуск ZZ. Bars: 51029 Текущее начало: 2005.09.12 21:50:00 Текущее время: 2005.11.16 00:50:29
Изменение Bars. Было: 51157 Прежнее начало: 2005.09.12 21:50:00 Текущее время: 2005.11.16 03:55:33

Перезапуск ZZ. Bars: 51029 Текущее начало: 2005.09.13 00:58:00 Текущее время: 2005.11.16 03:55:58
Изменение Bars. Было: 51157 Прежнее начало: 2005.09.13 00:58:00 Текущее время: 2005.11.16 07:38:32

Перезапуск ZZ. Bars: 51030 Текущее начало: 2005.09.13 04:11:00 Текущее время: 2005.11.16 07:38:43
Изменение Bars. Было: 51157 Прежнее начало: 2005.09.13 04:11:00 Текущее время: 2005.11.16 10:18:01

Перезапуск ZZ. Bars: 51029 Текущее начало: 2005.09.13 06:59:00 Текущее время: 2005.11.16 10:18:01
Изменение Bars. Было: 51157 Прежнее начало: 2005.09.13 06:59:00 Текущее время: 2005.11.16 12:41:17

Перезапуск ZZ. Bars: 51029 Текущее начало: 2005.09.13 09:53:00 Текущее время: 2005.11.16 12:41:31
Изменение Bars. Было: 51157 Прежнее начало: 2005.09.13 09:53:00 Текущее время: 2005.11.16 14:54:15

Перезапуск ZZ. Bars: 51029 Текущее начало: 2005.09.13 12:03:00 Текущее время: 2005.11.16 14:54:17
Изменение Bars. Было: 53377 Прежнее начало: 2005.09.13 12:03:00 Текущее время: 2005.11.18 14:04:01

Перезапуск ZZ. Bars: 53250 Текущее начало: 2005.09.13 14:18:00 Текущее время: 2005.11.18 14:04:21

Видно, что подрезание долго происходило при 51157 барах на графике и всегда на 128 баров.
Потом, 18 числа, этот барьер как-то был преодолен и возник новый - 53377. А единственное
случившееся подрезание было на 127 баров, то есть практически то же число.

Разработчики, что-нибудь в этом направлении происходит или это никому не нужно ?
Если не нужно так я и надоедать не буду.