Неправильная работа функций WindowPriceMax() и WindowPriceMin()

 

Выводим на график в отдельное окно индикатор, в котором вычисляются функции WindowPriceMax() и WindowPriceMin().

При первичной установке индикатора функции вычисляются верно.

При переключении таймфрейма функции вычисляются для того таймфрейма, который был первоначально установлен.

А необходимо, чтобы данные функции вычислялись на том таймфрейме, на который переключаемся.

В результате получаем неверные значения и неверные построения индикатора после переключения графика на другой таймфрейм..

 

Также заметил "интересную" работу функции WindowBarsPerChart()

Когда скрипт ставишь на график, то возвращается верное значение. А когда переключаешь на график другой пары, то выдает "с потолка".

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   while(!IsStopped()) {
      Print("WindowBarsPerChart() = ",WindowBarsPerChart());
      Sleep(5000);
   }
//----
   return(0);
  }

Лог:

22:31:46 _Test_WindowsBarsPerChart() EURJPY,H1: loaded successfully
22:31:46 _Test_WindowsBarsPerChart() EURJPY,H1: WindowBarsPerChart() = 199
22:31:50 _Test_WindowsBarsPerChart() EURJPY,H1: WindowBarsPerChart() = 199
22:32:01 _Test_WindowsBarsPerChart() EURJPY,H1: WindowBarsPerChart() = 199

==== переключение на другой график
22:32:01 _Test_WindowsBarsPerChart() EURJPY,H1: WindowBarsPerChart() = 173
22:32:06 _Test_WindowsBarsPerChart() EURJPY,H1: WindowBarsPerChart() = 173
22:32:11 _Test_WindowsBarsPerChart() EURJPY,H1: WindowBarsPerChart() = 173
22:32:16 _Test_WindowsBarsPerChart() EURJPY,H1: WindowBarsPerChart() = 173

==== обратное переключение на "родной" график
22:32:21 _Test_WindowsBarsPerChart() EURJPY,H1: WindowBarsPerChart() = 199
22:32:26 _Test_WindowsBarsPerChart() EURJPY,H1: WindowBarsPerChart() = 199

 

Если в работе данных функций подтвердятся ошибки, то необходимо проверить и остальные функции, работающие с параметрами окна...

 

nen, Вы берёте значения минимальной и максимальной цены в процессе расчёта индикатора. Что это значит? Необходимо учитывать факт, что отрисовка индикатора производится после его расчёта. Необходимо учитывать факт, что узнать значения максимальной и минимальной цен можно только после отрисовки!

Это значит, что если Вы берёте минимальную и максимальную цены с собственного окна индикатора, то Ваши построения, основанные на минимуме и максимуме, необходимо производить, не с первого после инициализации тика, а со второго! Вот фрагмент логов

13:42:34 Compiling 'OsMA'
13:42:42 OsMA EURUSD,M15: loaded successfully
13:42:54 OsMA EURUSD,M15: initialized
13:42:54 OsMA EURUSD,M15: WindowPriceMin=0  WindowPriceMax=0
13:42:55 OsMA EURUSD,M15: WindowPriceMin=-0.0003  WindowPriceMax=0.0002
13:43:10 OsMA EURUSD,M15: WindowPriceMin=-0.0003  WindowPriceMax=0.0002
13:43:10 OsMA EURUSD,M15: deinitialized
13:43:10 OsMA EURUSD,M15: uninit reason 3
13:43:10 OsMA EURUSD,M30: initialized
13:43:10 OsMA EURUSD,M30: WindowPriceMin=-0.0003  WindowPriceMax=0.0002
13:43:14 OsMA EURUSD,M30: WindowPriceMin=-0.0007  WindowPriceMax=0.0014
13:43:14 OsMA EURUSD,M30: WindowPriceMin=-0.0007  WindowPriceMax=0.0014
13:43:15 OsMA EURUSD,M30: WindowPriceMin=-0.0007  WindowPriceMax=0.0014
 
Спасибо, Слава. Все работает правильно.
 
а если я беру не с собственного окна, а с основного.

#property indicator_chart_window
double Ind_Buffer_0[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  SetIndexStyle(0,DRAW_LINE, STYLE_DOT, 1, DimGray);
  SetIndexBuffer(0,Ind_Buffer_0);
  return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    i, j, limit, counted_bars=IndicatorCounted();
   if(counted_bars <0) return(-1);
   if(counted_bars==0) limit=Bars-1;             // посчитанных баров еще нет, будет считать с бара,
   if(counted_bars >0) limit=Bars-counted_bars-1;// вычтем из числа доступных баров количество посчитанных
   for(i = limit; i >= 0; i--)
     {
     Ind_Buffer_0[i]=1.34;
     }// end for(i...
   double   top=WindowPriceMax();
   double   bottom=WindowPriceMin();
   Print("top=",top," bottom=",bottom," j=",j," counted_bars=",counted_bars);
  return(0);
  }
//+------------------------------------------------------------------+
почему нужно ждать второй тик ? ведь уже все нарисовалось. и размер окна определяется не индикатором, а видимыми барами (вродебы)
вот  лог
2010.04.30 02:11:50 333 EURUSD,M30: top=1.371 bottom=1.309 j=0 counted_bars=6512
2010.04.30 02:11:42 333 EURUSD,M30: top=1.371 bottom=1.309 j=0 counted_bars=6512
2010.04.30 02:11:31 333 EURUSD,M30: top=1.344 bottom=1.31 j=0 counted_bars=0


  что нужно тут исправить. чтобы сразу получить правильные значения WindowPriceMax() и WindowPriceMin() при переходе на новый таймфрейм.