¿Qué dicen los profesionales: cómo obtener los valores de desplazamiento del ratón en MQL? [reenvío desde el quinto foro]. - página 7

 
Artyom Trishkin:

¿Qué le ayudará? ¿Su elogio? No has mostrado una solución. Te has mostrado a ti mismo. Lo cual es muy, muy esperable.

¿Por qué no? Un poco de reflexión y todos encontrarán una solución. He dado una pista de dónde buscarlo. En qué dirección explorar. No es interesante tener todo en bandeja de plata. )) Si lo necesitas, puedo ayudar al hombre y llevarlo a una solución. Pero parece que sólo quieres discutir conmigo).
 
Vitaly Muzichenko:

¿Es eso lo que es?

Tienes la tendencia equivocada. Primero me gritas cosas (como "tu código es una mierda", "necroposter"), y luego preguntas y discutes la solución al problema. Así que, piensa por ti mismo.

O esperar a que yo ayude a los que se lo merecen.

 
Artyom Trishkin:

¿Qué le ayudará? ¿Su elogio? No has mostrado una solución. Te has mostrado a ti mismo. Lo cual es muy, muy esperable.

Eres notablemente desatento.

Mira, al final del post al que he respondido, el hombre pide "indicaciones". No está pidiendo una solución. Así que traté de empujarlo. ¿Ahora ves lo inapropiada y ridícula que es tu injerencia? No supone más que basura inútil. Sería mejor que te comunicaras sobre los méritos. Te harías más bien a ti mismo y a los demás.

 
Реter Konow:

Tienes la tendencia equivocada. Primero me gritas cosas (como "tu código es una mierda", "necroposter"), y luego preguntas y discutes la solución al problema. Así que, piensa por ti mismo.

O esperar a que yo ayude a los que se lo merecen.

No estaba preguntando, estaba afirmando un hecho.

 
Vitaly Muzichenko:

No estaba preguntando, estaba afirmando un hecho.

¿Qué hecho?
 

Aquí, mucha gente no ve el contenido que hay detrás del formulario. No pueden entender que si no hay una idea y una capacidad para realizarla, su insistencia en la forma no producirá un contenido de calidad.

La esencia puede tener muchas formas de encarnación y sólo un incompetente puede juzgarla por el lenguaje de su expresión.

 
Vitaly Muzichenko:

No estaba preguntando, estaba afirmando un hecho.

Yo también voy a constatar un hecho.

sus "productos" son un esfuerzo sin talento y ridículo.

¡Esta es la mayor basura que he visto en mucho tiempo!


No te tomes a pecho las críticas sinceras. :)

 
Реter Konow:
¿Por qué? Un poco de reflexión y todos encontrarán una solución. Te he dado una pista de dónde buscarlo. En qué dirección investigar. No es interesante tener todo en bandeja de plata. )) Si lo necesitas, puedo ayudar al hombre y llevarlo a una solución. Pero parece que sólo quieres discutir conmigo).

¡Hola, Peter!
¿No quieres decir que tienes una solución práctica, cómo desplazar la rueda del ratón mediante MQL? Y no con las flechas del teclado o los botones del ratón: no es tan difícil de entender. Por supuesto, podemos utilizar el evento CHARTEVENT_CHART_CHANGE para determinar si el gráfico se desplaza con la rueda, si no se pulsa ninguna tecla, pero sólo de forma probabilística, porque este evento puede producirse justo con la llegada de una nueva barra o un cambio brusco de precio, que provoque un cambio de escala vertical. Además, con este método no es posible obtener siempre el evento de desplazamiento de la rueda, por ejemplo cuando el gráfico ha llegado a la posición extrema izquierda o derecha, y cómo conseguirlo sin desplazar el gráfico. Tal vez te refieras a usar la función ChartNavigate para mover el gráfico hacia atrás, pero eso sería una implementación muy torcida y es poco probable que filtre correctamente todas las demás razones para los cambios del gráfico, aparte del desplazamiento de la rueda del ratón. En mi opinión, sólo se puede hacer hackeando MT o conociendo algunos comandos y/o eventos no documentados. De todos modos, no creo que tengas un ejemplo de tal implementación.

Sin embargo, tienes una extraña pista. Casi a la pregunta "¿Cómo obtener el evento de desplazamiento a través de la rueda del ratón?", das la respuesta"Usa el evento de desplazamiento y una función que mueva la gráfica".

Quizá me equivoque y tengas un ejemplo. ¡Entonces eres un tipo genial! )) Bueno, entonces al menos suelta el archivo ex4 (ex5), no el código.

 
Nikolai Semko:

¡Hola Peter!
¿No quieres decir que tienes una solución práctica de cómo desplazarse con la rueda del ratón en MQL? Y no con las flechas del teclado o los botones del ratón: no es tan difícil de entender. Por supuesto, podemos utilizar el evento CHARTEVENT_CHART_CHANGE para determinar si el gráfico se desplaza con la rueda, si no se pulsa ninguna tecla, pero sólo de forma probabilística, porque este evento puede producirse justo con la llegada de una nueva barra o un cambio brusco de precio, que provoque un cambio de escala vertical. Además, con este método no es posible obtener siempre los eventos de desplazamiento de la rueda, por ejemplo, cuando el gráfico ha alcanzado la posición extrema izquierda o derecha, y cómo conseguirlo sin desplazar el gráfico. Tal vez te refieras a usar la función ChartNavigate para mover el gráfico hacia atrás, pero eso sería una implementación muy torcida y es poco probable que filtre correctamente todas las demás razones para los cambios del gráfico, aparte del desplazamiento de la rueda del ratón. En mi opinión, sólo se puede hacer hackeando MT o conociendo algunos comandos y/o eventos no documentados. De todos modos, no creo que tengas un ejemplo de tal implementación.

Sin embargo, tienes una extraña pista. Casi a la pregunta "¿Cómo obtener el evento de desplazamiento a través de la rueda del ratón?", das la respuesta"Usa el evento de desplazamiento y una función que mueva la gráfica".

Tal vez me equivoque y tengas un ejemplo. ¡Entonces eres un tipo genial! )) Bueno, entonces al menos suelta el archivo ex4 (ex5), no el código.

¡Hola Nikolay!

Lo creas o no, la solución es muy sencilla. Se necesitan entre 15 y 20 líneas de código. Sin embargo, hay un punto sutil: los detalles de la implementación del mecanismo de desplazamiento. Mi implementación difiere un poco de la estándar. Desplaza el lienzo, no los objetos. Hay una implementación similar en la biblioteca de Anatoly.

Yo me desplazo con la rueda de desplazamiento y al "aferrarme" al movimiento del gráfico consigo un efecto energizante. Por supuesto, el gráfico se mueve, pero siempre vuelve a su posición inicial. Para eso está la función de desplazamiento del gráfico. La dirección del desplazamiento del gráfico también se obtiene de la función mql. Así, no tengo que piratear nada). MQ ha tratado de dar la mayor funcionalidad posible para implementar casi cualquier tarea. Esto es incluso sorprendente. Quizás ellos mismos no conocían todas las características que abren para los desarrolladores).

 
Nikolai Semko:

De todos modos, no creo que tengas un ejemplo de tal implementación.

Sin embargo, tienes una extraña pista. Prácticamente a la pregunta "¿Cómo obtener el evento de desplazamiento a través de la rueda del ratón?", das la respuesta "Usa el evento de desplazamiento y la función que mueve el gráfico".

Tal vez me equivoque y tengas un ejemplo. ¡Entonces eres un tipo genial! )) Bueno, al menos suelta el archivo ex4 (ex5), no el código.

Esta es la situación. La persona a cuyo post respondí, me pidió que le diera una idea, de cómo implementar un mecanismo de desplazamiento con una rueda. Le di una pista. Inmediatamente, los malpensados locales se encendieron y empezaron a acusarme de fanfarrón y otras tonterías.

Desde su punto de vista, si doy una solución, entonces estoy haciendo publicidad de mis productos, o simplemente presumiendo, y si no, entonces estoy engañando y no tengo nada.

Puedo darte el código, pero en primer lugar, estará desvinculado de la implementación del mecanismo de desplazamiento, y en segundo lugar, estará en ruso. Pero quizás puedas adaptarlo a tu mecanismo de desplazamiento. No puedo poner eh4, porque no puedo "arrancar" un solo mecanismo del entorno gráfico en el que opera.

La mejor opción, sería darle la solución en términos generales, pero no con el objetivo de demostrar nada, sino en base a la amistad.

Y así:

El evento CHARTEVENT_CHART_CHANGE se genera, entre otras cosas, en el evento de movimiento de la rueda del ratón si el cursor está sobre el gráfico. La opción de desplazamiento del gráfico debe estar activada. Así, a partir del desplazamiento de la carta, podemos saber exactamente cuándo hacemos girar la rueda. Podemos generar un evento personalizado. Por ejemplo, "SCROLLER_EVENT".

A continuación, nuestra tarea consiste en determinar la dirección del desplazamiento. Utilizamos ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR); en cada evento "SCROLLER_EVENT" obtenemos el número de la primera barra visible y determinamos si es mayor o menor que el número de la barra anterior que hemos registrado. Si es más, se mueve en una dirección; si es menos, se mueve en la dirección opuesta. Al mismo tiempo, nuestro gráfico también se desplazará y podrá llegar hasta el final. Para evitarlo, corregimos su posición mediante la función ChartNavigate y fijamos el gráfico en su posición inicial. Esta llamada también genera el evento CHARTEVENT_CHART_CHANGE y desactivará nuestro desplazamiento. Por lo tanto, en el momento de la corrección de la posición del gráfico debemos omitir el evento CHARTEVENT_CHART_CHANGE y no reaccionar a él. Para ello, tenemos que utilizar un sistema de banderas.

Este es el aspecto de mi código:

//=====================================================================================================================================    
 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__,"  Прокрутка_вниз  ",Прокрутка_вниз,"  Прокрутка_вверх  ",Прокрутка_вверх);
//=====================================================================================================================================   



Añadido:

En cuanto a otras causas de desplazamiento de los gráficos, por supuesto, pueden introducir errores en nuestro sistema. Sin embargo, estos errores son tan insignificantes que no debemos prestarles mucha atención. Así que si la nueva barra mueve nuestro lienzo unos pocos píxeles... No es un gran problema. Y eso sólo si el cursor estará sobre la barra de desplazamiento en ese momento.

Por supuesto, la aplicación es un intento de encontrar una salida a una situación desesperada. Con la ausencia total de desplazamiento con la rueda, esta es la solución más sencilla y "nativa". Para una solución completa, ya he contactado con servicedesk. Que lo sea o no depende de los desarrolladores.
Razón de la queja: