L'avis des professionnels : Comment obtenir les valeurs de défilement de la souris dans MQL ? [repost du cinquième forum]. - page 7

 
Artyom Trishkin:

Qu'est-ce qui va l'aider ? Votre éloge funèbre ? Vous n'avez pas montré de solution. Tu t'es montré. Ce qui est très, très attendu.

Pourquoi pas ? Un peu de réflexion et chacun trouvera une solution. J'ai donné un indice pour savoir où le chercher. Dans quelle direction explorer. Il n'est pas intéressant de tout avoir sur un plateau d'argent. )) Si vous avez besoin, je peux aider l'homme et le conduire à une solution. Mais vous semblez vouloir juste vous disputer avec moi).
 
Vitaly Muzichenko:

C'est ça ?

Vous avez la mauvaise tendance. Vous commencez par me crier des choses (comme "votre code est merdique", "nécroposteur"), puis vous demandez et discutez de la solution au problème. Alors, pensez par vous-même.

Ou attendez que j'aide ceux qui le méritent.

 
Artyom Trishkin:

Qu'est-ce qui va l'aider ? Votre éloge funèbre ? Vous n'avez pas montré de solution. Tu t'es montré. Ce qui est très, très attendu.

Vous êtes remarquablement inattentif.

Regardez, au bas du message auquel j'ai répondu, l'homme demande des "conseils". Il ne demande pas de solution. Alors j'ai essayé de le pousser. Vous voyez maintenant à quel point votre interférence est inappropriée et ridicule ? Il ne s'agit que de déchets inutiles. Vous feriez mieux de communiquer sur le fond. Vous feriez plus de bien à vous-même et aux autres.

 
Реter Konow:

Vous avez la mauvaise tendance. Vous commencez par me crier des choses (comme "votre code est merdique", "nécroposteur"), puis vous demandez et discutez de la solution au problème. Alors, pensez par vous-même.

Ou attendez que j'aide ceux qui le méritent.

Je ne demandais pas, je constatais un fait.

 
Vitaly Muzichenko:

Je ne demandais pas, je constatais un fait.

Quel fait ?
 

Ici, beaucoup de gens ne voient pas le contenu derrière le formulaire. Ils ne peuvent pas comprendre que s'il n'y a pas d'idée et pas de capacité à la réaliser, leur insistance sur la forme ne produira pas de contenu de qualité.

L'essence peut avoir de nombreuses formes d'incarnation et seule une personne incompétente peut la juger par la langue de son expression.

 
Vitaly Muzichenko:

Je ne demandais pas, je constatais un fait.

Moi aussi, je vais énoncer un fait.

vos "produits" sont un effort sans talent et ridicule.

C'est la plus grosse bêtise que j'ai vue depuis longtemps !


Ne prenez pas à cœur les critiques sincères. :)

 
Реter Konow:
Pourquoi ? Un peu de réflexion et chacun trouvera une solution. Je vous ai donné un indice où le chercher. Dans quelle direction enquêter. Il n'est pas intéressant de tout avoir sur un plateau d'argent. )) Si vous avez besoin, je peux aider l'homme et le conduire à une solution. Mais on dirait que vous voulez juste vous disputer avec moi).

Bonjour, Peter !
Ne voulez-vous pas me dire que vous avez une solution pratique, comment faire défiler la roue de la souris au moyen de MQL ? Et pas avec les flèches du clavier ou les boutons de la souris - ce n'est pas si difficile à comprendre. Bien sûr, nous pouvons utiliser l'événement CHARTEVENT_CHART_CHANGE pour déterminer si le graphique défile avec la roue, si aucune touche n'est pressée, mais seulement de manière probabiliste, car cet événement peut se produire juste avec l'arrivée d'une nouvelle barre ou une forte variation de prix, entraînant un changement d'échelle verticale. En outre, avec cette méthode, il est impossible de toujours obtenir l'événement de défilement de la roue, par exemple lorsque le graphique a atteint la position extrême gauche ou droite, et comment y parvenir sans faire défiler le graphique. Vous voulez peut-être utiliser la fonction ChartNavigate pour reculer le graphique, mais ce serait une mise en œuvre très tordue et il est peu probable qu'elle filtre correctement toutes les autres raisons de changement de graphique, autres que le défilement de la roue de la souris. À mon avis, cela ne peut être fait qu'en piratant MT ou en connaissant certaines commandes et/ou événements non documentés. Quoi qu'il en soit, je ne pense pas que vous ayez un exemple d'une telle mise en œuvre.

Et vous avez une étrange allusion, cependant. Presque à la question "Comment obtenir un événement de défilement via la molette de la souris ?", vous donnez la réponse"Utiliser l'événement de défilement et une fonction qui déplace le graphique".

Peut-être que je me trompe, et que vous avez un exemple. Tu es un mec cool alors ! )) Alors, laissez au moins tomber le fichier ex4 (ex5), pas le code.

 
Nikolai Semko:

Bonjour Peter !
N'avez-vous pas envie de dire que vous avez une solution pratique pour faire défiler les pages avec la molette de la souris dans MQL ? Et pas avec les flèches du clavier ou les boutons de la souris - ce n'est pas si difficile à comprendre. Bien sûr, nous pouvons utiliser l'événement CHARTEVENT_CHART_CHANGE pour déterminer si le graphique défile avec la roue, si aucune touche n'est pressée, mais seulement de manière probabiliste, car cet événement peut se produire juste avec l'arrivée d'une nouvelle barre ou une forte variation de prix, entraînant un changement d'échelle verticale. De plus, avec cette méthode, il n'est pas possible de toujours obtenir les événements de défilement de la roue, par exemple lorsque le graphique a atteint la position extrême gauche ou droite, et comment y parvenir sans faire défiler le graphique. Vous voulez peut-être utiliser la fonction ChartNavigate pour faire reculer le graphique, mais ce serait une mise en œuvre très tordue et il ne serait guère possible de filtrer correctement toutes les autres raisons des changements de graphique, autres que le défilement de la molette de la souris. À mon avis, cela ne peut être fait qu'en piratant MT ou en connaissant certaines commandes et (ou) événements non documentés. Quoi qu'il en soit, je ne pense pas que vous ayez un exemple d'une telle mise en œuvre.

Et vous avez une étrange allusion, cependant. A la question "Comment obtenir un événement de défilement via la molette de la souris ?", vous donnez la réponse"Utiliser l'événement de défilement et une fonction qui déplace le graphique".

Peut-être que je me trompe, et que vous avez un exemple. Tu es un mec cool alors ! )) Alors, laissez au moins tomber le fichier ex4 (ex5), pas le code.

Salut Nikolay !

Croyez-le ou non, la solution est très simple. Il faut 15 à 20 lignes de code. Il y a cependant un point subtil : les spécificités de la mise en œuvre du mécanisme de défilement. Mon implémentation diffère un peu de l'implémentation standard. Il fait défiler la toile, pas les objets. Il existe une implémentation similaire dans la bibliothèque d'Anatoly.

Je fais défiler les pages avec la molette de défilement et en m'accrochant au mouvement du graphique, j'obtiens un effet énergisant. Bien sûr, le graphique vacille mais revient toujours à sa position initiale. C'est à cela que sert la fonction de décalage des cartes. La direction du déplacement de la carte est également obtenue à partir de la fonction mql. Ainsi, je n'ai pas besoin de pirater quoi que ce soit). MQ s'est efforcé d'offrir la fonctionnalité la plus large possible pour réaliser presque toutes les tâches. C'est même surprenant. Peut-être ne connaissaient-ils pas eux-mêmes toutes les fonctionnalités qu'ils ouvrent aux développeurs).

 
Nikolai Semko:

Quoi qu'il en soit, je ne pense pas que vous ayez un exemple d'une telle mise en œuvre.

Et vous avez une étrange allusion, cependant. En pratique, à la question "Comment obtenir un événement de défilement via la molette de la souris ?", vous répondez "Utiliser l'événement de défilement et la fonction qui déplace le graphique".

Peut-être que je me trompe, et que vous avez un exemple. Tu es un mec cool alors ! )) Au moins, laissez tomber le fichier ex4 (ex5), pas le code.

Voici la situation. La personne à qui j'ai répondu m'a demandé de lui donner une idée sur la façon d'implémenter un mécanisme de défilement avec une roue. Je lui ai donné un indice. Immédiatement, les mauvaises langues locales ont commencé à m'accuser de me vanter et de dire d'autres bêtises.

De leur point de vue, si je donne une solution, alors je fais de la publicité pour mes produits, ou je me vante simplement, et si je ne le fais pas, alors je triche et je n'ai rien.

Je peux vous donner le code, mais premièrement, il sera détaché de l'implémentation du mécanisme de défilement, et deuxièmement, il sera en russe. Mais peut-être pouvez-vous l'adapter à votre mécanisme de défilement. Je ne peux pas mettre eh4, car je ne peux pas "arracher" un seul mécanisme de l'environnement graphique dans lequel il fonctionne.

La meilleure option, serait de vous donner la solution en termes généraux, mais pas dans le but de prouver quoi que ce soit, mais sur la base de l'amitié.

Et donc :

L'événement CHARTEVENT_CHART_CHANGE est généré, entre autres, sur l'événement de déplacement de la molette de la souris si le curseur se trouve sur le graphique. L'option de décalage de la carte doit être activée. Ainsi, à partir du décalage du graphique, nous pouvons savoir exactement quand nous faisons tourner la roue. Nous pouvons générer un événement personnalisé. Par exemple, "SCROLLER_EVENT".

Ensuite, notre tâche consiste à déterminer la direction du décalage. Nous utilisons ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR) ; à chaque événement "SCROLLER_EVENT" nous obtenons le numéro de la première barre visible et déterminons s'il est supérieur ou inférieur au numéro de la barre précédente que nous avons enregistrée. Si elle est supérieure, elle se déplace dans une direction ; si elle est inférieure, elle se déplace dans la direction opposée. Dans le même temps, notre graphique défilera également et pourra atteindre la toute fin. Pour éviter cela, nous corrigeons sa position à l'aide de la fonction ChartNavigate et plaçons le graphique à sa position initiale. Cet appel génère également l'événement CHARTEVENT_CHART_CHANGE et désactive notre défilement. Ainsi, au moment de la correction de la position du graphique, nous devons ignorer l'événement CHARTEVENT_CHART_CHANGE et ne pas y réagir. Cela nécessite l'utilisation d'un système de drapeaux.

Voici à quoi ressemble mon code :

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



Ajouté :

Quant aux autres causes de déplacement des cartes, elles peuvent bien sûr introduire des erreurs dans notre système. Cependant, ces erreurs sont si insignifiantes que nous ne devrions pas y prêter beaucoup d'attention. Donc si la nouvelle barre déplace notre toile de quelques pixels... Ce n'est pas un gros problème. Et ce, uniquement si le curseur se trouve sur la barre de défilement à ce moment-là.

Bien sûr, la mise en œuvre est une tentative de trouver une issue à une situation désespérée. Avec l'absence totale de défilement avec la molette, c'est la solution la plus simple et la plus "native". Pour une solution complète, j'ai déjà contacté servicedesk. Que ce soit le cas ou non, cela dépend des développeurs.
Raison: