Спасибо! :-)
Так это первый бар на экране, но ведь он не обязательно является экстремумом. Поэтому, скорее всего алгоритм будет такой
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 пункты совмещены автоматически в логике расчета индикатора.
Если сделать индикатором, то у меня тоже виснит и надо перезапускать терминал. А если сделать скриптом и прицеплять скрипт на график, то все нормально. Правда в первый момент после присоединения скрипта терминал тоже зависает на несколько секунд, но потом работает нормально. При отсоединении скрипта тоже задержка происходит.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Очень удобно для тех, кто торгует discretionary. Допустим, выделил какую-то фигуру на графике, смотришь на показания этого индикатора (в виде надписи на графике, допустим, в левом верхнем углу большими жирными цифрами). Там указано - 150 пунктов. Ты прикидываешь - ага, окошка с низа до верху 150 пунктов, хороший размах, можно будет торговать. Или же выделил точно такую же ценовую структуру, а индикатор говорит - 70 пунктов. Ты тогда сразу прикидываешь, что потенциал движения маленький и не торгуешь.
Такой индикатор вообще очень хороший показатель субъективного восприятия волатильности рынка. Окно графика постоянно перемещается по оси времени. Мы можем там смотреть и на 15-минутки, и на 4-х часовки. Но даже независимо от таймфрейма сама по себе волатильность изменяется. Это не всегда оказывается корректно оцененным и замеченным, если трейдер уделяет внимание лишь структуре ценового движения, а не его амплитуде. В то же самое время из-за эффекта "фрактальности" не получается четко и быстро определить возможный потенциал в пунктах из-за субъективности восприятия.
Короче, теоретическое обоснование имеется. :-) А как это дело запрограммировать? Как определить верхнюю и нижнюю границы окна графика? Потом типа (Max - Min) преобразовать в пункты и отобразить на графике, и получаем чрезвычайно удобный и предельно простой индикатор субъективного восприятия амплитуды движения.