Бар под курсором мыши, не после щелчка, а в произвольный момент - страница 2

 
я ведь писал: "Вообще есть стд функция datetime  WindowTimeOnDropped(), но странно - если привязать скрипт к сочетанию клавиш (я скрипты имено так вызываю), то вместо времени под курсором в момент вызова она вернёт ноль. Похоже на что её просто надо допилить."
 
pavlick_:
я ведь писал: "Вообще есть стд функция datetime  WindowTimeOnDropped(), но странно - если привязать скрипт к сочетанию клавиш (я скрипты имено так вызываю), то вместо времени под курсором в момент вызова она вернёт ноль. Похоже на что её просто надо допилить."

Вообще когда вопросы задаёте по четвёрке, то лучше сразу это указывать - дамы не было путаницы.

 
pavlick_:
я ведь писал: "Вообще есть стд функция datetime  WindowTimeOnDropped(), но странно - если привязать скрипт к сочетанию клавиш (я скрипты имено так вызываю), то вместо времени под курсором в момент вызова она вернёт ноль. Похоже на что её просто надо допилить."

Вы читали в документации про WindowTimeOnDropped?

Возвращаемое значение

Значение времени в точке графика, на который был брошен эксперт или скрипт. Значение будет верным только в случае, если эксперт или скрипт перемещены с помощью мыши (технология "drag and drop").

Для пользовательских индикаторов это значение не определено.

В каком месте надо допиливать? Вы же в Вашем случае не используете технологию drag and drop

WindowTimeOnDropped - Операции с графиками - Справочник MQL4
WindowTimeOnDropped - Операции с графиками - Справочник MQL4
  • docs.mql4.com
WindowTimeOnDropped - Операции с графиками - Справочник MQL4
 
Slawa:

Вы читали в документации про WindowTimeOnDropped?

В каком месте надо допиливать? Вы же в Вашем случае не используете технологию drag and drop

Документацию и переписать можно )). А почему только лишь при драг и дроп? Нужно возвращать время по оси Х и тогда, когда перетаскивание не применяется, если курсор за границами графика, то да - вернуть ноль. Кроме перетаскивания можно ведь и задать скрипту сочетание клавиш, например альт Х, при их нажатии курсор может быть в пределах графика.

Говорить можно много, пример:
 
#ifdef X64
  #define HWND          ulong
#else
  
#define HWND          uint
#endif

#import "user32.dll"
   int GetCursorPos(int &point[2]);
   int GetWindowRect(HWND hWnd, int &rect[4]);
#import

bool cursor_time(datetime &time)
{
#define RIGHT_BORDER_WIDTH 45
   int points[2], rect[4];
   if( ! GetCursorPos(points)  ||
       ! GetWindowRect((HWND)ChartGetInteger(0, CHART_WINDOW_HANDLE), rect) )
      return false;  
   if(points[0] < rect[0]  ||  points[0] > rect[2] - RIGHT_BORDER_WIDTH)
      return false;
      
   int bar = WindowFirstVisibleBar() - int(WindowBarsPerChart() *
                                           double(points[0] - rect[0]) /
                                           (rect[2] - RIGHT_BORDER_WIDTH - rect[0]));
   if(bar < 0)
      bar = 0;
      
   time = Time[bar];
   return true;
}

void OnStart()
{
   datetime time;
   if( ! cursor_time(time) )
      return;
   ObjectCreate(IntegerToString(GetTickCount()), OBJ_VLINE, 0, time, 0);
}

Назначить на скрипт какое-нибудь сочетание клавиш и оценить удобство по сравнению с альтернативным перетаскиванием скрипта на график.
 
pavlick_:
Документацию и переписать можно )). А почему только лишь при драг и дроп? Нужно возвращать время по оси Х и тогда, когда перетаскивание не применяется, если курсор за границами графика, то да - вернуть ноль. Кроме перетаскивания можно ведь и задать скрипту сочетание клавиш, например альт Х, при их нажатии курсор может быть в пределах графика.
Назначить на скрипт какое-нибудь сочетание клавиш и оценить удобство по сравнению с альтернативным перетаскиванием скрипта на график.

если пишите для себя, то пусть так.

но лучше откажитесь от апи в пользу CHART_EVENT_MOUSE_MOVE