Друзья, возможно ли штатными средствами узнать бар/время под курсором мыши, не после щелчка, а в произвольный момент времени?
Да, если включить и ловить событие MouseMove
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
pavlick_, 2016.10.26 12:21
Вообще есть стд функция datetime WindowTimeOnDropped(), но странно - если привязать скрипт к сочетанию клавиш (я скрипты имено так вызываю), то вместо времени под курсором в момент вызова она вернёт ноль. Похоже на что её просто надо допилить.Мне из скрипта определить позицию курсора и создать там объект. Набросал через вин апи, теперь думаю - не накостылил ли я лишнего?
Зачем через WinAPI?
Можно ведь
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Бар под курсором мыши, не после щелчка, а в произвольный момент
Комбинатор, 2016.10.26 12:05
Да, если включить и ловить событие MouseMoveв этом событии Вы получаете координаты мышки измеряемые в пикселях. Эти координаты переводите во время и цену (ChartXYToTimePrice), а дальше просто определяете к какому бару принадлежат полученное время.
Из скрипта без винапи не получится, из советника\индикатора получится, если вам именно в любой момент времени и без нажатия. Ну или можно но я не знаю как
скрипт создает индикатор, индикатор ловит событие и пересылает назад в скрип)
Вот здесь код, который определяет принадлежность координат к бару:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Karputov Vladimir, 2016.09.28 11:00
Скрипт "SearchingNearestBar.mq5" - поиск ближайшего бара:
//+------------------------------------------------------------------+ //| SearchingNearestBar.mq5 | //| Copyright © 2016, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2016, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.001" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- возвращает временную координату, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт datetime t=ChartTimeOnDropped(); //--- объявление переменной для найденного времени datetime found_t=0; int bar=SearchingNearestBar(Symbol(),Period(),t,found_t); if(bar!=-1) Print("Бар номер ",bar,", время бара ",found_t); } //+------------------------------------------------------------------+ //| Поиск ближайшего бара | //+------------------------------------------------------------------+ int SearchingNearestBar(string symbol, ENUM_TIMEFRAMES time_frame, datetime find_time, datetime &found_time) { //+------------------------------------------------------------------+ //| symbol - символ | //| time_frame - период | //| find_time - искомое время | //| found_time - время открытия ближайшего бара | //| если функция возвратила "-1", значит переменная "found_time" | //| содержит неопределёное значение | //+------------------------------------------------------------------+ if(find_time<0) return(-1); datetime arr_time[]; datetime time_left=0; datetime time_right=0; //--- обращение по начальной позиции "0" и количеству требуемых элементов "1" CopyTime(symbol,time_frame,0,1,arr_time); //--- получаем время открытия бара "0" (самого правого бара на графике) datetime time0=arr_time[0]; //--- освобождаем буфер динамического массива "arr_time" и устанавливаем размер нулевого измерения в 0 ArrayFree(arr_time); //--- обращение по начальной дате "find_time" и количеству требуемых элементов "1" if(CopyTime(symbol,time_frame,find_time,1,arr_time)>0) { time_left=arr_time[0]; //--- если time0==time_left, значит искомое время находится правее бара с индексом "0" if(time0==time_left) { found_time=time0; return(0); } else ArrayFree(arr_time); // освобождаем буфер динамического массива "arr_time" и устанавливаем размер нулевого измерения в 0 //--- обращение по начальной "time_left" и конечной "time0" датам требуемого интервала времени int count=CopyTime(symbol,time_frame,time_left,time0,arr_time); if(count>0) { //--- в массиве arr_time[] элемент с индексом "0", на графике, будет левее элемента "count-1" //Print("между ",time_left," и ",time0," ",count," баров. Бар [",0,"] ",arr_time[0]); time_left=arr_time[0]; time_right=arr_time[1]; //--- объяснение, какие бары имееют какое время //Print("левый бар имеет время ",time_left,", искомое время ",find_time,", правый бар имеет время ",time_right); //--- среднее время между time_left и time_right datetime middle_time=(time_left+time_right)/2; if(find_time<middle_time) { //--- обращение по начальной "time_left" и конечной "time0" датам требуемого интервала времени int count_bar=CopyTime(symbol,time_frame,time_left,time0,arr_time); if(count_bar!=-1) { //Print(time_left); found_time=time_left; return (count_bar-1); } } else { //--- обращение по начальной "time_right" и конечной "time0" датам требуемого интервала времени int count_bar=CopyTime(symbol,time_frame,time_right,time0,arr_time); if(count_bar!=-1) { //Print(time_right); found_time=time_right; return (count_bar-1); } } } else return(-1); } return(-1); } //+------------------------------------------------------------------+
Данный скрипт определяет место, куда его бросили мышкой и ищет ближайший бар к месту "десантирования". Поиск ближайшего бара строится на концепции границ баров:
Какой злой модератор, обсуждал недостаток функционала (функция кривая на мой взгляд), как раз по теме "ошибки баги вопросы", а меня с глаз долой. Комбинатор, благодарю за отклил, наверное иначе никак (вин апи).

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добавлено позже:
вопрос по "четвёрке". Использование "WindowTimeOnDropped"