Также заметил "интересную" работу функции 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() при переходе на новый таймфрейм.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Выводим на график в отдельное окно индикатор, в котором вычисляются функции WindowPriceMax() и WindowPriceMin().
При первичной установке индикатора функции вычисляются верно.
При переключении таймфрейма функции вычисляются для того таймфрейма, который был первоначально установлен.
А необходимо, чтобы данные функции вычислялись на том таймфрейме, на который переключаемся.
В результате получаем неверные значения и неверные построения индикатора после переключения графика на другой таймфрейм..