Что скажут профи: Как получить значения скрола мышки в MQL? [репост с пятого форума] - страница 7

 
Artyom Trishkin:

Что ему поможет? Ваше хвалебное заявление? Вы ж не показали решения. Вы показали себя. Впрочем, что весьма и весьма ожидаемо.

Почему же? Немного мыслительного процесса и решение каждый найдет. Я дал намек где его искать. В каком направлении исследовать. Ведь неинтересно же все на блюдечке нести. )) Если нужно, я могу человеку помочь и довести до решения. Но вам похоже, хочется со мною просто спорить.)
 
Vitaly Muzichenko:

Это что-ли?

У вас неправильная тенденция сложилась. Вы сначала выкрикиваете что то в мой адрес (типа "ваш код шлак", "некропостер"), а потом спрашиваете и обсуждаете решение задачи. Так что, думайте сами. 

Или ждите когда я помогу тем, кто этого заслуживает.

 
Artyom Trishkin:

Что ему поможет? Ваше хвалебное заявление? Вы ж не показали решения. Вы показали себя. Впрочем, что весьма и весьма ожидаемо.

Вы удивительно невнимательны. 

Посмотрите, внизу поста на который я ответил, человек просит "натолкнуть" его на мысль. Он не просит готового решения. Вот я и попробывал натолкнуть. Теперь понимаете, насколько неуместно и нелепо ваше вмешательство? Ничего кроме бесполезного флуда оно не влечет. Лучше бы по сути дела общались. Больше бы пользы для себя и других извлекли.

 
Реter Konow:

У вас неправильная тенденция сложилась. Вы сначала выкрикиваете что то в мой адрес (типа "ваш код шлак", "некропостер"), а потом спрашиваете и обсуждаете решение задачи. Так что, думайте сами. 

Или ждите когда я помогу тем, кто этого заслуживает.

Я не спрашивал, Я констатировал факт.

 
Vitaly Muzichenko:

Я не спрашивал, Я констатировал факт.

Какой факт?
 

Тут многие за формой, не видят содержания. Они не могут понять, что если нет идеи и способности ее реализовать, их требовательность к форме не породит качественного содержания. 

Сущность может иметь много форм своих воплощений и судить о ней по языку ее выражения может только недалекий человек.

 
Vitaly Muzichenko:

Я не спрашивал, Я констатировал факт.

Я тоже проконстатирую факт.

ваши "продукты" - бездарные  и смешные потуги.

Такого МУСОРА давно я не видел!


Не принимайте к сердцу правдивую критику. :)

 
Реter Konow:
Почему же? Немного мыслительного процесса и решение каждый найдет. Я дал намек где его искать. В каком направлении исследовать. Ведь неинтересно же все на блюдечке нести. )) Если нужно, я могу человеку помочь и довести до решения. Но вам похоже, хочется со мною просто спорить.)

Привет, Петр!
Уж не хочешь ли ты сказать, что у тебя есть реальное практическое решение, как осуществлять скроллинг колесиком мышки средствами MQL? А не стрелками клавиатуры или клавишами мышки - это-то и козе понятно. Конечно, можно использовать событие CHARTEVENT_CHART_CHANGE для установления факта прокрутки графика с помощью колеса, если не нажимались никакие клавиши, но только вероятностно, т.к. это событие может произойти просто с приходом нового бара или при резком изменении цены, ведущей к изменению вертикального маштаба. Также, при таком методе невозможно всегда получать события прокрутки колеса, например когда график достиг крайнего левого или правого положения, и как добиться при этом непрокрутки графика. Возможно, ты имеешь ввиду использовать функцию ChartNavigate для обратного перемещения графика, но это же будет очень кривая реализация и вряд ли возможно корректно отфильтровать все другие причины изменения графика, отличные от прокрутки колеса мышки.  В моем разумении это можно сделать только хакнув MT или зная какие-то недокументированные команды и (или) события.  В общем, не верю, что у тебя есть пример такой реализации. 

И странный у тебя намёк, однако. Практически на вопрос "Как получить событие скролинга через колесико мышки?, ты даешь ответ "Используйте событие скроллинга и функцию которая двигает график."

Может я не прав, и у тебя реально есть пример. Тогда ты крутяшка! )) Ну тогда сбрось хоть ex4 (ex5) файл, а не код. 

 
Nikolai Semko:

Привет, Петр!
Уж не хочешь ли ты сказать, что у тебя есть реальное практическое решение, как осуществлять скроллинг колесиком мышки средствами MQL? А не стрелками клавиатуры или клавишами мышки - это-то и козе понятно. Конечно, можно использовать событие CHARTEVENT_CHART_CHANGE для установления факта прокрутки графика с помощью колеса, если не нажимались никакие клавиши, но только вероятностно, т.к. это событие может произойти просто с приходом нового бара или при резком изменении цены, ведущей к изменению вертикального маштаба. Также, при таком методе невозможно всегда получать события прокрутки колеса, например когда график достиг крайнего левого или правого положения, и как добиться при этом непрокрутки графика. Возможно, ты имеешь ввиду использовать функцию ChartNavigate для обратного перемещения графика, но это же будет очень кривая реализация и вряд ли возможно корректно отфильтровать все другие причины изменения графика, отличные от прокрутки колеса мышки.  В моем разумении это можно сделать только хакнув MT или зная какие-то недокументированные команды и (или) события.  В общем, не верю, что у тебя есть пример такой реализации. 

И странный у тебя намёк, однако. Практически на вопрос "Как получить событие скролинга через колесико мышки?, ты даешь ответ "Используйте событие скроллинга и функцию которая двигает график."

Может я не прав, и у тебя реально есть пример. Тогда ты крутяшка! )) Ну тогда сбрось хоть ex4 (ex5) файл, а не код. 

Привет, Николай!

Веришь или нет, но решение очень простое. Оно занимает 15-20 строк кода. Правда есть нюанс, - специфика реализации механизма прокрутки. Моя реализация немного отличается от стандартной. Механизм прокручивает канвас, а не обьекты.  Похожая реализация имеется в библиотеке Анатолия. 

Я действительно прокручиваю колесиком, и "цепляясь" к движению графика получаю эффект энерции. График конечно дергается, но всегда возвращается в исходное положение. Для этого и нужна функция смещения графика. Направление смещения графика тоже получаю от mql-функции. Таким образом, ничего взламывать не надо.) MQ постарались дать максимально широкий функционал для реализации практически любых задач. Это даже удивительно. Быть может они и сами не знали всех возможностей, которые открывают для разработчиков.)

 
Nikolai Semko:

В общем, не верю, что у тебя есть пример такой реализации. 

И странный у тебя намёк, однако. Практически на вопрос "Как получить событие скролинга через колесико мышки?, ты даешь ответ "Используйте событие скроллинга и функцию которая двигает график."

Может я не прав, и у тебя реально есть пример. Тогда ты крутяшка! )) Ну тогда сбрось хоть ex4 (ex5) файл, а не код. 

Тут такая ситуация. Человек, на пост которого я ответил, просил натолкнуть его на мысль, как реализовать механизм прокрутки колесиком. Я ему намекнул. Тут же взбудоражились местные недображелатели и начали обвинять меня в бахвальстве и еще какой то чуши.

С их точки зрения, если я дам решение, то я либо рекламирую свои продукты, либо просто хвастаюсь, а если не дам, то я всех обманываю и у меня ничего нет.

Код выложить могу, но во первых, - он будет оторван от реализации механизма прокрутки, а во вторых - на русском языке. Но возможно, ты сможешь приспособить его к своему механизму прокрутки. Выложить ех4 не могу, потому что не могу "вырвать" отдельно взятый механизм из целостной графической среды в которой он функционирует.

Лучшим вариантом, будет передать тебе решение в общих чертах, но не с целью что либо доказать, а на основании дружбы.

И так:

Событие CHARTEVENT_CHART_CHANGE генерируется помимо прочего и на событии движения колесика мышки, если курсор находится над графиком. Опция смещения графика должна быть обязательно включена. Таким образом, по смещению графика, мы можем точно знать когда мы крутим колесико. Мы можем гененировать пользовательское событие. Например "SCROLLER_EVENT".

Далее, наша задача состоит в том, чтобы определить направление смещения. Для этого используем ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR); На каждом событии "SCROLLER_EVENT"мы получаем номер первого видимого бара и определяем больше ли он или меньше номера предыдущего бара, который мы записали. Если больше, - то сдвиг в одну сторону, если меньше то в противоположную. При этом, наш график тоже прокручивается и может упереться в самый конец. Чтобы этого не случилось, мы корректируем его положение используя функцию ChartNavigate и устанавливаем график на исходную позицию. При этом вызове, тоже генерирует событие CHARTEVENT_CHART_CHANGE и это будет сбивать нашу прокрутку. Поэтому, в момент коррекции положения графика, мы должны пропускать событие CHARTEVENT_CHART_CHANGE и не реагировать на него. Для этого необходимо использовать систему флагов. 

Вот как выглядит мой код:

//=====================================================================================================================================    
 if(id == CHARTEVENT_CHART_CHANGE && !n)
   {
    if(СОБЫТИЕ_ИНТЕРФЕЙСА != _SCROLLER_EVENT)
      {
       СОБЫТИЕ_ИНТЕРФЕЙСА = _SCROLLER_EVENT; 
      } 
    //------------------------------------  
    if(!Номер_первого_бара){ChartNavigate(0,CHART_END,-100); Номер_первого_бара = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);}
    //------------------------------------    
    Номер_этого_бара = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
    //------------------------------------
    int Основание_выпадающего_списка = КАНВАС - 1;
    int Ползунок_                    = КАНВАС + 4;
    int Вертикальная_полоса          = КАНВАС + 2;
    //------------------------------------
    if(Номер_этого_бара > Номер_первого_бара)
      {
       Прокрутка_вниз = 1;
       Прокрутка_вверх = 0;
       Сдвиг = 25;
       n = 1;
      }
    if(Номер_этого_бара  < Номер_первого_бара) 
      {
       Прокрутка_вниз = 0;
       Прокрутка_вверх = 1;
       Сдвиг = -25;
       n = 1;
      }//Alert(__FUNCTION__," Номер_первого_бара   ",Номер_первого_бара,"  Номер_этого_бара  ",Номер_этого_бара);  
    //------------------------------------
    if(КАТЕГОРИЯ_КАНВАСА_ОБЪЕКТА == _SCROLL_BAR_CANVAS && !G_CORE[ОКНО][Вертикальная_полоса][_OBJECT_HIDE])
      {
       int Поле_обзора = G_CORE[ОКНО][КАНВАС][_VIEW_SQUARE];
       //Элемент которому принадлежит сам канвас.
       int Элемент_прокручиваемого_канваса =  G_CORE[ОКНО][КАНВАС][_MAIN_ELEMENT];
       //Канвас элемента, которому принадлежит прокручиваемый канвас.
       int Канвас_того_элемента = G_CORE[ОКНО][Элемент_прокручиваемого_канваса][_DROWING_CANVAS];
       int Группа_элемента_прокручиваемого_канваса = G_CORE[ОКНО][Элемент_прокручиваемого_канваса][_OBJECT_GROUP];

       //------------------------------------
       G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] -= Сдвиг;
       //------------------------------------
       if(G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] > G_CORE[ОКНО][Поле_обзора][_Y])
        {          
         G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] = G_CORE[ОКНО][Поле_обзора][_Y];
        } 
       if((G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] + G_CORE[ОКНО][КАНВАС][_Y_SIZE]) < (G_CORE[ОКНО][Поле_обзора][_Y] + G_CORE[ОКНО][Поле_обзора][_Y_SIZE]))
         {
          G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] = (G_CORE[ОКНО][Поле_обзора][_Y] + G_CORE[ОКНО][Поле_обзора][_Y_SIZE]) - G_CORE[ОКНО][КАНВАС][_Y_SIZE];
         }
       //------------------------------------  
       G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE] = G_CORE[ОКНО][Поле_обзора][_Y] - G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y];  
       //------------------------------------
       ObjectSetInteger(0,G_CORE[ОКНО][КАНВАС][_NAME],OBJPROP_YOFFSET,G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE]);
       //------------------------------------ 
       G_CORE[ОКНО][Ползунок_][_Y] = G_CORE[ОКНО][Вертикальная_полоса][_Y] + ((double)G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE] / ((double)G_CORE[ОКНО][Ползунок_][_V_SCROLL_BAR_HANDLE_STEP] / 10000));
       //------------------------------------ 
       if(Группа_элемента_прокручиваемого_канваса == VIEW_BOX)
         {
          Нарисовать_элемент(ОКНО,Канвас_того_элемента,Элемент_прокручиваемого_канваса);
         } 
       //------------------------------------
       if(Группа_элемента_прокручиваемого_канваса == DROP_LIST)
         {
          Нарисовать_элемент(ОКНО,Поле_обзора,Элемент_прокручиваемого_канваса);
         } 
      }    
  }
//------------------------------------------------------
if(qw){n = 0; qw = 0;} 
if(n == 1){ChartNavigate(0,CHART_END,-100);  qw = 1;} 
//------------------------------------------------------
//Alert(__FUNCTION__,"  Прокрутка_вниз  ",Прокрутка_вниз,"  Прокрутка_вверх  ",Прокрутка_вверх);
//=====================================================================================================================================   



Добавлено:

Что касается других причин сдвига графика, то конечно они могут вносить ошибки в нашу систему. Однако, эти ошибки столь незначительны, что вряд ли стоит на них обращать внимание. Ну сдвинет новый бар наше полотно на несколько пикселей... Это же не страшно. И то, если только курсор будет в это время находится над полотном прокрутки.

Конечно, реализация является попыткой найти выход из безвыходного положения. При полном отсутствии возможности прокрутки колесиком, - это самое простое и "родное" решение. Для получения полноценного решения я уже обращался в сервисдеск. Ну а будет оно или нет, зависит он разработчиков.
Причина обращения: