А как сделать индикатор диапазона окна?

 
Как можно сделать индикатор диапазона окна по вертикали в пунктах?

Очень удобно для тех, кто торгует discretionary. Допустим, выделил какую-то фигуру на графике, смотришь на показания этого индикатора (в виде надписи на графике, допустим, в левом верхнем углу большими жирными цифрами). Там указано - 150 пунктов. Ты прикидываешь - ага, окошка с низа до верху 150 пунктов, хороший размах, можно будет торговать. Или же выделил точно такую же ценовую структуру, а индикатор говорит - 70 пунктов. Ты тогда сразу прикидываешь, что потенциал движения маленький и не торгуешь.

Такой индикатор вообще очень хороший показатель субъективного восприятия волатильности рынка. Окно графика постоянно перемещается по оси времени. Мы можем там смотреть и на 15-минутки, и на 4-х часовки. Но даже независимо от таймфрейма сама по себе волатильность изменяется. Это не всегда оказывается корректно оцененным и замеченным, если трейдер уделяет внимание лишь структуре ценового движения, а не его амплитуде. В то же самое время из-за эффекта "фрактальности" не получается четко и быстро определить возможный потенциал в пунктах из-за субъективности восприятия.

Короче, теоретическое обоснование имеется. :-) А как это дело запрограммировать? Как определить верхнюю и нижнюю границы окна графика? Потом типа (Max - Min) преобразовать в пункты и отобразить на графике, и получаем чрезвычайно удобный и предельно простой индикатор субъективного восприятия амплитуды движения.
 
ф-ция FisrtVisibleBar() - первый бар в экране
0-й бар - последний бар в экране

( High[0] - Low[FisrtVisibleBar()] )/ Point - амплитуда экрана ;)


Не проверял, но должно работать ;)
 
Спасибо! :-)

Так это первый бар на экране, но ведь он не обязательно является экстремумом. Поэтому, скорее всего алгоритм будет такой

A=Highest(NULL,0,MODE_HIGH,FirstVisibleBar(),0);
B=Lowest(NULL,0,MODE_LOW,FirstVisibleBar(),0);
C=(A-B)/Point;

Не знаю даже, правильно ли написал, в MQL4 еще ни разу не программировал ;-)

В любом случае подобный алгоритм будет корректно работать с ограничением, что сейчас на экране присутствует последний бар. А если хотим сдвинуть экран налево, тогда что?
 
А тогда баров будет меньше. Указанные функции будут искать экстремумы в меньшем диапазоне.
 
Вообще я хотел сказать другое - сдвинуть график вправо :-) тогда у нас будут искаться экстремумы в большем диапазоне. Ведь нету функции LastVisibleBar.

Добавлено при редактировании: оказывается зато есть функция BarsPerWindow.
 
оказывается зато есть функция BarsPerWindow.
Вот и ответ ;)
 
Такое? Отсутствие глюков не гарантирую:-)

#property copyright "RealJin"
#property link      "much-love@yandex.ru"
#property indicator_chart_window
int deinit()
  {
   ObjectDelete("Window_Range_Label");
   return(0);
  }
int start()
  {      
      int First_Visible_Index=Bars-FirstVisibleBar()-2;
      int Last_Visible_Index=First_Visible_Index-BarsPerWindow()+1;
      if(Last_Visible_Index<0)Last_Visible_Index=0;
      double wr=(High[Highest(NULL,0,MODE_HIGH,First_Visible_Index-Last_Visible_Index+1,Last_Visible_Index)]-Low[Lowest(NULL,0,MODE_LOW,First_Visible_Index-Last_Visible_Index+1,Last_Visible_Index)])/Point;
      if(ObjectFind("Window_Range_Label")!=0){
         ObjectCreate("Window_Range_Label",OBJ_LABEL,0,0,0);
      }
      ObjectSetText("Window_Range_Label","Range: "+DoubleToStr(wr,0)+ " Points",28,"Arial",Yellow); 
   return(0);
  }
 
Такое? Отсутствие глюков не гарантирую:-)


Большое спасибо! То, что нужно! :-)

А то у меня идея сделать появилась, а когда попытался запрограммировать - руки опустились, не захотелось только ради этого индикатора изучать структуру написания программ в MQL4.

Единственно, индикатор пересчитывается при поступлении нового тика, а не при перемещении графика или переключении таймфреймов. Во всяком случае у меня при переключении с одного таймфрейма на другой вначале выскакивает какая-то определанная величина в пунктах, и лишь при поступлении нового тика она становится актуальной.
 
Только теперь это скрипт. Значение обновляется без прихода котировки. А индикатор с циклом виснит.

int deinit()
  {
   ObjectDelete("s_Window_Range_Label");
   return(0);
  }
int start()
  {
  
  while(true){
      RefreshRates();    
      int First_Visible_Index=Bars-FirstVisibleBar()-2;
      int Last_Visible_Index=First_Visible_Index-BarsPerWindow()+1;
      if(Last_Visible_Index<0)Last_Visible_Index=0;
      double wr=(High[Highest(NULL,0,MODE_HIGH,First_Visible_Index-Last_Visible_Index+1,Last_Visible_Index)]-Low[Lowest(NULL,0,MODE_LOW,First_Visible_Index-Last_Visible_Index+1,Last_Visible_Index)])/Point;
      if(ObjectFind("s_Window_Range_Label")!=0){
         ObjectCreate("s_Window_Range_Label",OBJ_LABEL,0,0,0);
      }
      ObjectSetText("s_Window_Range_Label","Range: "+DoubleToStr(wr,0)+ " Points",28,"Arial",Yellow); 
      Sleep(100);
  }
   return(0);
}
 
Только теперь это скрипт. Значение обновляется без прихода котировки. А индикатор с циклом виснит.


Даже не знаю, что сказать :-) МетаТрейдер при попытке прицепить индикатор зависает и его приходится перезапустить.

Теоретически алгоритм может быть таким
1. получить Range;
2. проверка Range на каждый новый тик (как стандартный индикатор);
3. дополнительно проверка каждые 100 миллисекунд (секунду?), изменился ли номер FirstVisibleBar или число BarsPerWindow, если изменились, то рассчитывается новый Range.

Интересно, эта дополнительная проверка в цикле в третьем пункте тоже "подвесит" индикатор?

Хотя наверное 1 и 2 пункты совмещены автоматически в логике расчета индикатора.
 
Если сделать индикатором, то у меня тоже виснит и надо перезапускать терминал. А если сделать скриптом и прицеплять скрипт на график, то все нормально. Правда в первый момент после присоединения скрипта терминал тоже зависает на несколько секунд, но потом работает нормально. При отсоединении скрипта тоже задержка происходит.
Причина обращения: