Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114280
Forex Trader  
Этот вопрос уже поднимался. Я надеялся, что в 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);
}
Forex Trader
114280
Forex Trader  
У меня стоит Макс. число баров в окне - 50000.
При запуске МТ грузит в окно (конкретно - EURUSD,M1) 50000 баров. Дальше (по идее)
число баров может со временем только расти. Но это только по идее.
МТ работает без перерывов все 5 рабочих суток недели. За это время по несколько раз
в сутки возникает ситуация, когда количество баров на графике подрезается.

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

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


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

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

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

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

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

Перезапуск 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 баров, то есть практически то же число.

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