Was sagen die Profis: Wie erhält man Maus-Scrollwerte in MQL? [Wiederveröffentlichung aus dem fünften Forum]. - Seite 7

 
Artyom Trishkin:

Was wird ihm helfen? Ihre Grabrede? Sie haben keine Lösung aufgezeigt. Du hast dich gezeigt. Das ist sehr, sehr zu erwarten.

Warum nicht? Ein bisschen Nachdenken und jeder wird eine Lösung finden. Ich habe einen Hinweis gegeben, wo sie zu finden ist. In welche Richtung erforscht werden soll. Es ist nicht interessant, alles auf dem Silbertablett serviert zu bekommen. )) Wenn Sie es brauchen, kann ich dem Mann helfen und ihn zu einer Lösung führen. Aber Sie scheinen sich nur mit mir streiten zu wollen.)
 
Vitaly Muzichenko:

Ist das der Fall?

Sie haben die falsche Tendenz. Zuerst schreien Sie mich an (z. B. "Ihr Code ist Mist", "Nekroposter"), und dann fragen Sie nach der Lösung des Problems und diskutieren darüber. Denken Sie also selbst nach.

Oder warten Sie auf mich, um denen zu helfen, die es verdienen.

 
Artyom Trishkin:

Was wird ihm helfen? Ihre Grabrede? Sie haben keine Lösung aufgezeigt. Du hast dich gezeigt. Das ist sehr, sehr zu erwarten.

Sie sind bemerkenswert unaufmerksam.

Sehen Sie, am Ende des Beitrags, auf den ich geantwortet habe, bittet der Mann um "Hinweise". Er fragt nicht nach einer Lösung. Also habe ich versucht, ihn zu drängen. Verstehen Sie jetzt, wie unangemessen und lächerlich Ihre Einmischung ist? Es handelt sich um nichts anderes als nutzlosen Müll. Es wäre besser, wenn Sie in der Sache kommunizieren würden. Sie würden sich und anderen damit mehr Gutes tun.

 
Реter Konow:

Sie haben die falsche Tendenz. Zuerst schreien Sie mich an (z. B. "Ihr Code ist Mist", "Nekroposter"), und dann fragen Sie nach der Lösung des Problems und diskutieren darüber. Denken Sie also selbst nach.

Oder warten Sie auf mich, um denen zu helfen, die es verdienen.

Ich habe keine Frage gestellt, sondern eine Tatsache festgestellt.

 
Vitaly Muzichenko:

Ich habe keine Frage gestellt, sondern eine Tatsache festgestellt.

Welche Tatsache?
 

Hier sehen viele Menschen den Inhalt hinter dem Formular nicht. Sie können nicht verstehen, dass ihr Beharren auf der Form nicht zu qualitativ hochwertigen Inhalten führt, wenn es keine Idee und keine Fähigkeit gibt, diese umzusetzen.

Die Essenz kann viele Formen ihrer Verkörperung haben, und nur ein unfähiger Mensch kann sie nach der Sprache ihres Ausdrucks beurteilen.

 
Vitaly Muzichenko:

Ich habe keine Frage gestellt, sondern eine Tatsache festgestellt.

Auch ich werde eine Tatsache feststellen.

Ihre "Produkte" sind ein talentfreier und lächerlicher Versuch.

Das ist der größte Blödsinn, den ich seit langem gesehen habe!


Nehmen Sie sich aufrichtige Kritik nicht zu Herzen. :)

 
Реter Konow:
Warum? Ein wenig Nachdenken und jeder wird eine Lösung finden. Ich habe Ihnen einen Hinweis gegeben, wo Sie danach suchen müssen. In welche Richtung soll untersucht werden? Es ist nicht interessant, alles auf dem Silbertablett serviert zu bekommen. )) Wenn Sie es brauchen, kann ich dem Mann helfen und ihn zu einer Lösung führen. Aber es scheint, dass Sie sich nur mit mir streiten wollen).

Hallo, Peter!
Wollen Sie mir nicht sagen, dass Sie eine praktische Lösung haben, wie man das Mausrad mit Hilfe von MQL scrollen kann? Und zwar nicht mit Tastaturpfeilen oder Maustasten - das ist gar nicht so schwer zu verstehen. Natürlich können wir das Ereignis CHARTEVENT_CHART_CHANGE verwenden, um festzustellen, ob das Diagramm mit dem Rad scrollt, wenn keine Tasten gedrückt werden, aber nur mit einer gewissen Wahrscheinlichkeit, da dieses Ereignis nur bei einem neuen Balken oder einer starken Preisänderung auftreten kann , was zu einer Änderung der vertikalen Skala führt. Außerdem ist es mit dieser Methode nicht möglich, immer das Rad-Scroll-Ereignis zu erhalten, z. B. wenn das Diagramm die äußerste linke oder rechte Position erreicht hat, und wie man dies erreichen kann, ohne das Diagramm zu scrollen. Vielleicht meinen Sie, die ChartNavigate-Funktion zu verwenden, um das Diagramm zurück zu bewegen, aber das wäre eine sehr krumme Implementierung und es ist unwahrscheinlich, dass alle anderen Gründe für Diagrammänderungen korrekt herausgefiltert werden, abgesehen vom Scrollen mit dem Mausrad. Meiner Meinung nach kann das nur durch Hacken von MT oder durch Kenntnis einiger undokumentierter Befehle und/oder Ereignisse erreicht werden. Wie auch immer, ich glaube nicht, dass Sie ein Beispiel für eine solche Implementierung haben.

Und Sie haben einen seltsamen Hinweis. Auf die Frage "Wie bekommt man ein Scroll-Ereignis über das Mausrad?" geben Sie die Antwort"Verwenden Sie ein Scroll-Ereignis und eine Funktion, die den Graphen bewegt."

Vielleicht irre ich mich, und Sie haben tatsächlich ein Beispiel. Dann bist du ein cooler Typ! )) Lassen Sie zumindest die ex4 (ex5) Datei fallen, nicht den Code.

 
Nikolai Semko:

Hallo Peter!
Wollen Sie nicht sagen, dass Sie eine praktische Lösung haben, wie man mit dem Mausrad in MQL scrollen kann? Und zwar nicht mit Tastaturpfeilen oder Maustasten - das ist gar nicht so schwer zu verstehen. Natürlich können wir das Ereignis CHARTEVENT_CHART_CHANGE verwenden, um festzustellen, ob das Diagramm mit dem Rad scrollt, wenn keine Tasten gedrückt werden, aber nur mit einer gewissen Wahrscheinlichkeit, da dieses Ereignis nur bei einem neuen Balken oder einer starken Preisänderung auftreten kann , was zu einer Änderung der vertikalen Skala führt. Außerdem ist es mit dieser Methode nicht möglich, immer das Rad-Scroll-Ereignis zu erhalten, z. B. wenn das Diagramm die äußerste linke oder rechte Position erreicht hat, und wie man dies erreichen kann, ohne das Diagramm zu scrollen. Vielleicht wollen Sie die Funktion ChartNavigate verwenden, um das Diagramm zurück zu verschieben, aber das wäre eine sehr krumme Implementierung und es ist unwahrscheinlich, dass alle anderen Gründe für Diagrammänderungen, außer dem Scrollen mit dem Mausrad, korrekt herausgefiltert werden. Meiner Meinung nach kann dies nur durch Hacken von MT oder durch Kenntnis einiger undokumentierter Befehle und/oder Ereignisse erreicht werden. Wie auch immer, ich glaube nicht, dass Sie ein Beispiel für eine solche Implementierung haben.

Und Sie haben einen seltsamen Hinweis. Auf die Frage "Wie bekommt man ein Scroll-Ereignis über das Mausrad?" geben Sie die Antwort"Verwenden Sie ein Scroll-Ereignis und eine Funktion, die den Graphen bewegt."

Vielleicht irre ich mich, und Sie haben tatsächlich ein Beispiel. Dann bist du ein cooler Typ! )) Dann lassen Sie wenigstens die ex4 (ex5) Datei fallen, nicht den Code.

Hallo Nikolaj!

Ob Sie es glauben oder nicht, die Lösung ist ganz einfach. Sie benötigen 15-20 Zeilen Code. Es gibt jedoch einen feinen Punkt - die Besonderheiten der Implementierung des Bildlaufmechanismus. Meine Implementierung weicht ein wenig von der Standardversion ab. Es scrollt die Leinwand, nicht die Objekte. Eine ähnliche Implementierung findet sich in Anatolys Bibliothek.

Ich blättere mit dem Scrollrad, und indem ich mich an die Bewegung des Diagramms "klammere", erhalte ich einen energetisierenden Effekt. Natürlich zuckt das Diagramm, kehrt aber immer wieder in seine Ausgangsposition zurück. Dafür ist die Diagrammverschiebungsfunktion gedacht. Die Richtung der Kartenverschiebung wird ebenfalls über die mql-Funktion ermittelt. Ich muss also nichts hacken). MQ hat versucht, die größtmögliche Funktionalität zu bieten, um fast jede Aufgabe zu erfüllen. Dies ist sogar überraschend. Vielleicht kannten sie selbst nicht alle Funktionen, die sie für Entwickler öffnen).

 
Nikolai Semko:

Jedenfalls glaube ich nicht, dass Sie ein Beispiel für eine solche Umsetzung haben.

Und Sie haben einen seltsamen Hinweis. Praktisch auf die Frage "Wie bekommt man ein Scroll-Ereignis über das Mausrad?", geben Sie die Antwort "Verwenden Sie ein Scroll-Ereignis und eine Funktion, die den Graphen bewegt."

Vielleicht irre ich mich, und Sie haben tatsächlich ein Beispiel. Dann bist du ein cooler Typ! )) Lassen Sie zumindest die ex4 (ex5) Datei fallen, nicht den Code.

Die Situation ist wie folgt. Die Person, auf deren Beitrag ich geantwortet habe, bat mich, ihr eine Idee zu geben, wie man einen Bildlaufmechanismus mit einem Rad implementieren kann. Ich habe ihm einen Hinweis gegeben. Sofort meldeten sich die örtlichen Bösewichte zu Wort und beschuldigten mich der Prahlerei und anderen Unsinns.

Wenn ich eine Lösung anbiete, ist das aus ihrer Sicht entweder Werbung für meine Produkte oder reine Angeberei, und wenn nicht, bin ich ein Betrüger und habe nichts.

Ich kann Ihnen den Code geben, aber erstens wird er von der Implementierung des Bildlaufmechanismus losgelöst sein, und zweitens wird er auf Russisch sein. Aber vielleicht können Sie es an Ihren Bildlaufmechanismus anpassen. Ich kann eh4 nicht einsetzen, weil ich einen einzelnen Mechanismus nicht aus der grafischen Umgebung, in der er arbeitet, "herausreißen" kann.

Am besten wäre es, Ihnen die Lösung in allgemeiner Form zu geben, aber nicht mit dem Ziel, etwas zu beweisen, sondern auf der Basis von Freundschaft.

Und so:

Das Ereignis CHARTEVENT_CHART_CHANGE wird u.a. bei der Bewegung des Mausrades erzeugt, wenn sich der Cursor über dem Diagramm befindet. Die Option Kartenversatz muss aktiviert sein. Anhand des Diagrammversatzes können wir also genau erkennen, wann wir das Rad drehen. Wir können ein benutzerdefiniertes Ereignis erzeugen. Zum Beispiel: "SCROLLER_EVENT".

Als Nächstes gilt es, die Richtung des Versatzes zu bestimmen. Wir verwenden ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR); bei jedem "SCROLLER_EVENT"-Ereignis ermitteln wir die Nummer des ersten sichtbaren Balkens und stellen fest, ob sie größer oder kleiner ist als die Nummer des vorherigen Balkens, den wir aufgezeichnet haben. Wenn es mehr ist, bewegt es sich in eine Richtung; wenn es weniger ist, bewegt es sich in die entgegengesetzte Richtung. Gleichzeitig wird unser Diagramm auch gescrollt und kann das Ende erreichen. Um dies zu verhindern, korrigieren wir seine Position mit der Funktion ChartNavigate und setzen das Diagramm auf seine Ausgangsposition. Dieser Aufruf erzeugt auch das Ereignis CHARTEVENT_CHART_CHANGE und deaktiviert den Bildlauf. Daher müssen wir zum Zeitpunkt der Korrektur der Chartposition das Ereignis CHARTEVENT_CHART_CHANGE überspringen und nicht darauf reagieren. Dies erfordert die Verwendung eines Flaggensystems.

So sieht mein Code aus:

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



Hinzugefügt:

Was andere Ursachen für Kartenverschiebungen angeht, so können sie natürlich Fehler in unser System einbringen. Diese Fehler sind jedoch so unbedeutend, dass wir ihnen keine große Aufmerksamkeit schenken sollten. Wenn also der neue Balken unsere Leinwand um ein paar Pixel verschiebt... Das ist keine große Sache. Und das auch nur, wenn sich der Cursor zu diesem Zeitpunkt über der Bildlaufleiste befindet.

Natürlich ist die Umsetzung ein Versuch, einen Ausweg aus einer ausweglosen Situation zu finden. Da das Scrollen mit dem Rad nicht möglich ist, ist dies die einfachste und "nativste" Lösung. Für eine vollwertige Lösung habe ich mich bereits an servicedesk gewandt. Ob das der Fall ist oder nicht, hängt von den Entwicklern ab.