Cosa dicono i professionisti: come ottenere i valori di scorrimento del mouse in MQL? [repost dal quinto forum]. - pagina 7

 
Artyom Trishkin:

Cosa lo aiuterà? Il suo elogio? Non hai mostrato una soluzione. Ti sei mostrato. Il che è molto, molto prevedibile.

Perché no, un po' di riflessione e tutti troveranno una soluzione. Ho dato un suggerimento su dove cercarlo. In quale direzione esplorare. Non è interessante avere tutto su un piatto d'argento. )) Se avete bisogno, posso aiutare l'uomo e condurlo a una soluzione. Ma sembra che tu voglia solo discutere con me).
 
Vitaly Muzichenko:

È questo che è?

Avete la tendenza sbagliata. Prima mi gridate delle cose (tipo "il tuo codice fa schifo", "necroposito"), e poi chiedete e discutete la soluzione del problema. Quindi, pensate per voi stessi.

O aspettare che io aiuti quelli che lo meritano.

 
Artyom Trishkin:

Cosa lo aiuterà? Il suo elogio? Non hai mostrato una soluzione. Ti sei mostrato. Il che è molto, molto prevedibile.

Lei è notevolmente disattento.

Guarda, in fondo al post a cui ho risposto, l'uomo chiede "indicazioni". Non sta chiedendo una soluzione. Così ho cercato di spingerlo. Ora vede quanto è inappropriata e ridicola la sua interferenza? Non comporta altro che inutile spazzatura. Fareste meglio a comunicare nel merito. Faresti più bene a te stesso e agli altri.

 
Реter Konow:

Avete la tendenza sbagliata. Prima mi gridate delle cose (tipo "il tuo codice fa schifo", "necroposito"), e poi chiedete e discutete la soluzione del problema. Quindi, pensate per voi stessi.

O aspettare che io aiuti chi lo merita.

Non stavo chiedendo, stavo affermando un fatto.

 
Vitaly Muzichenko:

Non stavo chiedendo, stavo affermando un fatto.

Quale fatto?
 

Qui, molte persone non vedono il contenuto dietro il modulo. Non riescono a capire che se non c'è un'idea e nessuna capacità di realizzarla, la loro insistenza sulla forma non produrrà un contenuto di qualità.

L'essenza può avere molte forme delle sue incarnazioni e solo una persona incompetente può giudicarla dal linguaggio della sua espressione.

 
Vitaly Muzichenko:

Non stavo chiedendo, stavo affermando un fatto.

Anch'io dichiarerò un fatto.

i vostri "prodotti" sono uno sforzo senza talento e ridicolo.

Questa è la cosa più spazzatura che ho visto da molto tempo!


Non prendere a cuore le critiche sincere. :)

 
Реter Konow:
Un po' di riflessione e tutti troveranno una soluzione. Ti ho dato un suggerimento su dove cercarlo. In quale direzione indagare. Non è interessante avere tutto su un piatto d'argento. )) Se avete bisogno, posso aiutare l'uomo e condurlo a una soluzione. Ma sembra che tu voglia solo discutere con me).

Ciao, Peter!
Non volete dirmi che avete una soluzione pratica, come far scorrere la ruota del mouse per mezzo di MQL? E non con le frecce della tastiera o i pulsanti del mouse - non è così difficile da capire. Naturalmente, possiamo usare l'evento CHARTEVENT_CHART_CHANGE per determinare se il grafico sta scorrendo con la rotella, se non vengono premuti tasti, ma solo probabilisticamente, perché questo evento può verificarsi solo con l'arrivo di una nuova barra o un brusco cambiamento di prezzo, che porta a un cambiamento di scala verticale. Inoltre, con questo metodo è impossibile ottenere sempre l'evento di scorrimento della ruota, per esempio quando il grafico ha raggiunto la posizione estrema a sinistra o a destra, e come ottenere questo senza scorrere il grafico. Forse intendi usare la funzione ChartNavigate per spostare indietro il grafico, ma sarebbe un'implementazione molto storta ed è improbabile che filtri correttamente tutte le altre ragioni per i cambiamenti del grafico, oltre allo scorrimento della rotella del mouse. Nella mia mente, può essere fatto solo hackerando MT o conoscendo alcuni comandi e/o eventi non documentati. Comunque, non credo che tu abbia un esempio di tale implementazione.

Però hai una strana allusione. Quasi alla domanda "Come ottenere l'evento di scorrimento tramite la rotella del mouse?", si dà la risposta"Usa l'evento di scorrimento e una funzione che sposta il grafico".

Forse mi sbaglio e tu hai davvero un esempio. Allora sei un tipo in gamba! )) Beh, almeno lascia cadere il file ex4 (ex5), non il codice.

 
Nikolai Semko:

Ciao Peter!
Non volete dire che avete una soluzione pratica di come scorrere con la rotella del mouse in MQL? E non con le frecce della tastiera o i pulsanti del mouse - non è così difficile da capire. Naturalmente, possiamo usare l'evento CHARTEVENT_CHART_CHANGE per determinare se il grafico sta scorrendo con la rotella, se non vengono premuti tasti, ma solo probabilisticamente, perché questo evento può verificarsi solo con l'arrivo di una nuova barra o un brusco cambiamento di prezzo, che porta a un cambiamento di scala verticale. Inoltre, con questo metodo non è possibile ottenere sempre gli eventi di scorrimento della ruota, per esempio quando il grafico ha raggiunto l'estrema sinistra o destra, e come ottenere questo senza scorrere il grafico. Forse intendi usare la funzione ChartNavigate per spostare indietro il grafico, ma questa sarebbe un'implementazione molto storta e difficilmente potrebbe filtrare correttamente tutte le altre ragioni dei cambiamenti del grafico, oltre allo scorrimento della rotella del mouse. Secondo me, può essere fatto solo hackerando MT o conoscendo alcuni comandi e (o) eventi non documentati. Comunque, non credo che tu abbia un esempio di tale implementazione.

Però hai una strana allusione. Quasi alla domanda "Come ottenere l'evento di scorrimento tramite la rotella del mouse?", si dà la risposta"Usa l'evento di scorrimento e una funzione che sposta il grafico".

Forse mi sbaglio e tu hai davvero un esempio. Allora sei un tipo in gamba! )) Bene, allora almeno lascia cadere il file ex4 (ex5), non il codice.

Ciao Nikolay!

Che ci crediate o no, la soluzione è molto semplice. Ci vogliono 15-20 righe di codice. C'è un punto sottile, però - le specifiche di implementazione del meccanismo di scorrimento. La mia implementazione differisce un po' da quella standard. Scorre la tela, non gli oggetti. C'è un'implementazione simile nella libreria di Anatoly.

Scorro con la rotella di scorrimento e "aggrappandomi" al movimento del grafico ottengo un effetto energizzante. Naturalmente, il grafico si contrae ma torna sempre alla sua posizione iniziale. È a questo che serve la funzione di spostamento del grafico. La direzione di spostamento del grafico si ottiene anche dalla funzione mql. Così, non devo hackerare nulla). MQ ha cercato di dare la più ampia funzionalità possibile per implementare quasi ogni compito. Questo è addirittura sorprendente. Forse loro stessi non conoscevano tutte le caratteristiche che aprono agli sviluppatori).

 
Nikolai Semko:

Comunque, non credo che tu abbia un esempio di tale implementazione.

Però hai una strana allusione. In pratica alla domanda "Come ottenere l'evento di scorrimento tramite la rotella del mouse?", si dà la risposta "Usa l'evento di scorrimento e la funzione che sposta il grafico".

Forse mi sbaglio e tu hai davvero un esempio. Allora sei un tipo in gamba! )) Beh, almeno lascia cadere il file ex4 (ex5), non il codice.

Ecco la situazione. La persona a cui ho risposto mi ha chiesto di dargli un'idea su come implementare un meccanismo di scorrimento con una ruota. Gli ho dato un suggerimento. Immediatamente i maligni locali si sono scatenati e hanno iniziato ad accusarmi di vantarmi e di altre sciocchezze.

Dal loro punto di vista, se do una soluzione, allora sto pubblicizzando i miei prodotti, o solo vantandomi, e se non lo faccio, allora sto barando e non ho niente.

Posso darvi il codice, ma in primo luogo, sarà staccato dall'implementazione del meccanismo di scorrimento, e in secondo luogo, sarà in russo. Ma forse puoi adattarlo al tuo meccanismo di scorrimento. Non posso mettere eh4, perché non posso "strappare" un singolo meccanismo dall'ambiente grafico in cui opera.

L'opzione migliore, sarebbe quella di darvi la soluzione in termini generali, ma non con lo scopo di dimostrare qualcosa, ma sulla base dell'amicizia.

E così:

L'evento CHARTEVENT_CHART_CHANGE viene generato, tra l'altro, sull'evento di movimento della rotella del mouse se il cursore è sopra il grafico. L'opzione offset del grafico deve essere abilitata. Così, dall'offset del grafico, possiamo sapere esattamente quando facciamo girare la ruota. Possiamo generare un evento personalizzato. Per esempio "SCROLLER_EVENT".

Successivamente, il nostro compito è quello di determinare la direzione dell'offset. Usiamo ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR); ad ogni evento "SCROLLER_EVENT" otteniamo il numero della prima barra visibile e determiniamo se è più o meno del numero della barra precedente che abbiamo registrato. Se è di più, allora si muove in una direzione; se è di meno, allora si muove nella direzione opposta. Allo stesso tempo, anche il nostro grafico scorrerà e potrà raggiungere la fine. Per evitare questo, correggiamo la sua posizione usando la funzione ChartNavigate e impostiamo il grafico nella sua posizione iniziale. Questa chiamata genera anche l'evento CHARTEVENT_CHART_CHANGE e disabiliterà il nostro scorrimento. Quindi, al momento della correzione della posizione del grafico dobbiamo saltare l'evento CHARTEVENT_CHART_CHANGE e non reagire ad esso. Questo richiede l'uso di un sistema di bandiere.

Questo è il mio codice:

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



Aggiunto:

Per quanto riguarda altre cause di spostamenti di carte, naturalmente, possono introdurre errori nel nostro sistema. Tuttavia, questi errori sono così insignificanti che non dovremmo prestarvi molta attenzione. Quindi se la nuova barra sposta la nostra tela di qualche pixel... Non è un grosso problema. E questo solo se il cursore sarà sopra la barra di scorrimento in quel momento.

Naturalmente, l'attuazione è un tentativo di trovare una via d'uscita da una situazione senza speranza. Senza alcuna rotella di scorrimento, questa è la soluzione più semplice e più "nativa". Per una soluzione completa, ho già contattato servicedesk. Che lo sia o meno dipende dagli sviluppatori.
Motivazione: