А как сделать индикатор диапазона окна?
Спасибо! :-)
Так это первый бар на экране, но ведь он не обязательно является экстремумом. Поэтому, скорее всего алгоритм будет такой
A=Highest(NULL,0,MODE_HIGH,FirstVisibleBar(),0);
B=Lowest(NULL,0,MODE_LOW,FirstVisibleBar(),0);
C=(A-B)/Point;
Не знаю даже, правильно ли написал, в MQL4 еще ни разу не программировал ;-)
В любом случае подобный алгоритм будет корректно работать с ограничением, что сейчас на экране присутствует последний бар. А если хотим сдвинуть экран налево, тогда что?
Так это первый бар на экране, но ведь он не обязательно является экстремумом. Поэтому, скорее всего алгоритм будет такой
A=Highest(NULL,0,MODE_HIGH,FirstVisibleBar(),0);
B=Lowest(NULL,0,MODE_LOW,FirstVisibleBar(),0);
C=(A-B)/Point;
Не знаю даже, правильно ли написал, в MQL4 еще ни разу не программировал ;-)
В любом случае подобный алгоритм будет корректно работать с ограничением, что сейчас на экране присутствует последний бар. А если хотим сдвинуть экран налево, тогда что?
А тогда баров будет меньше. Указанные функции будут искать экстремумы в меньшем диапазоне.
Вообще я хотел сказать другое - сдвинуть график вправо :-) тогда у нас будут искаться экстремумы в большем диапазоне. Ведь нету функции LastVisibleBar.
Добавлено при редактировании: оказывается зато есть функция BarsPerWindow.
Добавлено при редактировании: оказывается зато есть функция 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 пункты совмещены автоматически в логике расчета индикатора.
Если сделать индикатором, то у меня тоже виснит и надо перезапускать терминал. А если сделать скриптом и прицеплять скрипт на график, то все нормально. Правда в первый момент после присоединения скрипта терминал тоже зависает на несколько секунд, но потом работает нормально. При отсоединении скрипта тоже задержка происходит.
Очень удобно для тех, кто торгует discretionary. Допустим, выделил какую-то фигуру на графике, смотришь на показания этого индикатора (в виде надписи на графике, допустим, в левом верхнем углу большими жирными цифрами). Там указано - 150 пунктов. Ты прикидываешь - ага, окошка с низа до верху 150 пунктов, хороший размах, можно будет торговать. Или же выделил точно такую же ценовую структуру, а индикатор говорит - 70 пунктов. Ты тогда сразу прикидываешь, что потенциал движения маленький и не торгуешь.
Такой индикатор вообще очень хороший показатель субъективного восприятия волатильности рынка. Окно графика постоянно перемещается по оси времени. Мы можем там смотреть и на 15-минутки, и на 4-х часовки. Но даже независимо от таймфрейма сама по себе волатильность изменяется. Это не всегда оказывается корректно оцененным и замеченным, если трейдер уделяет внимание лишь структуре ценового движения, а не его амплитуде. В то же самое время из-за эффекта "фрактальности" не получается четко и быстро определить возможный потенциал в пунктах из-за субъективности восприятия.
Короче, теоретическое обоснование имеется. :-) А как это дело запрограммировать? Как определить верхнюю и нижнюю границы окна графика? Потом типа (Max - Min) преобразовать в пункты и отобразить на графике, и получаем чрезвычайно удобный и предельно простой индикатор субъективного восприятия амплитуды движения.