O que os profissionais têm a dizer: Como obter valores de rolagem do mouse na MQL? [relançamento do quinto fórum]. - página 7

 
Artyom Trishkin:

O que o ajudará? Seu elogio? Você não mostrou uma solução. Você se mostrou. O que é muito, muito esperado.

Por que não? Um pouco de processo de reflexão e todos encontrarão uma solução. Dei uma dica de onde procurá-la. Em que direção explorar. Não é interessante ter tudo em uma bandeja de prata. )) Se precisar, posso ajudar o homem e levá-lo a uma solução. Mas você parece querer apenas discutir comigo).
 
Vitaly Muzichenko:

É isso o que é?

Você tem a tendência errada. Primeiro você grita coisas para mim (como "seu código é uma porcaria", "necroposter"), e depois pergunta e discute a solução para o problema. Então, pense por si mesmo.

Ou esperar que eu ajude aqueles que o merecem.

 
Artyom Trishkin:

O que o ajudará? Seu elogio? Você não mostrou uma solução. Você se mostrou. O que é muito, muito esperado.

Você é notavelmente desatento.

Veja, no fundo do posto ao qual respondi, o homem está pedindo "dicas". Ele não está pedindo por uma solução. Então eu tentei empurrá-lo. Agora você vê como sua interferência é inapropriada e ridícula? Isso não implica em nada além de lixo inútil. Seria melhor que você se comunicasse sobre os méritos. Você estaria fazendo mais bem a si mesmo e aos outros.

 
Реter Konow:

Você tem a tendência errada. Primeiro você grita coisas para mim (como "seu código é uma porcaria", "necroposter"), e depois pergunta e discute a solução para o problema. Então, pense por si mesmo.

Ou esperar que eu ajude aqueles que o merecem.

Eu não estava perguntando, eu estava declarando um fato.

 
Vitaly Muzichenko:

Eu não estava perguntando, eu estava declarando um fato.

Que fato?
 

Aqui, muitas pessoas não vêem o conteúdo por trás da forma. Eles não conseguem entender que, se não houver nenhuma idéia e nenhuma capacidade de realizá-la, sua insistência na forma não produzirá conteúdo de qualidade.

A essência pode ter muitas formas de suas encarnações e somente uma pessoa incompetente pode julgá-la pela linguagem de sua expressão.

 
Vitaly Muzichenko:

Eu não estava perguntando, eu estava declarando um fato.

Eu também vou declarar um fato.

seus "produtos" são um esforço sem talento e ridículo.

Este é o maior lixo que eu já vi em muito tempo!


Não leve a sério as críticas verdadeiras. :)

 
Реter Konow:
Por quê? Um pequeno processo de reflexão e todos encontrarão uma solução. Eu lhe dei uma dica onde procurá-la. Em que direção investigar. Não é interessante ter tudo em uma bandeja de prata. )) Se precisar, posso ajudar o homem e levá-lo a uma solução. Mas parece que você só quer discutir comigo).

Olá, Peter!
Você não quer dizer que tem uma solução prática, como rolar a roda do mouse por meio de MQL? E não com setas de teclado ou botões do mouse - não é tão difícil de entender. Naturalmente, podemos usar o evento CHARTEVENT_CHART_CHANGE para determinar se o gráfico está rolando com roda, se nenhuma tecla for pressionada, mas apenas probabilisticamente, porque este evento pode ocorrer apenas com uma nova barra chegando ou uma mudança de preço acentuada, levando a uma mudança de escala vertical. Além disso, com este método nem sempre é possível obter o evento de rolagem da roda, por exemplo, quando o gráfico atingiu a posição extrema esquerda ou direita, e como conseguir isto sem rolar o gráfico. Talvez você pretenda usar a função ChartNavigate para mover o gráfico de volta, mas isso seria uma implementação muito tortuosa e dificilmente é possível filtrar corretamente todos os outros motivos de mudanças no gráfico, além da rolagem da roda do mouse. Em minha mente, isso só pode ser feito hackeando o MT ou conhecendo alguns comandos e (ou) eventos não documentados. De qualquer forma, não acredito que você tenha um exemplo de tal implementação.

E você tem uma estranha dica, no entanto. Quase à pergunta "Como obter evento de rolagem através da roda do mouse", você dá a resposta"Use evento de rolagem e uma função que mova o gráfico".

Talvez eu esteja errado, e você realmente tem um exemplo. Então você é um cara legal! )) Bem, então pelo menos largue o arquivo ex4 (ex5), não o código.

 
Nikolai Semko:

Olá Peter!
Você não quer dizer que você tem uma solução prática de como rolar com a roda do mouse em MQL? E não com setas de teclado ou botões do mouse - não é tão difícil de entender. Naturalmente, podemos usar o evento CHARTEVENT_CHART_CHANGE para determinar se o gráfico está rolando com roda, se nenhuma tecla for pressionada, mas apenas probabilisticamente, porque este evento pode ocorrer apenas com uma nova barra chegando ou uma mudança de preço acentuada, levando a uma mudança de escala vertical. Além disso, com este método nem sempre é possível obter o evento de rolagem da roda, por exemplo, quando o gráfico atingiu a posição extrema esquerda ou direita, e como conseguir isto sem rolar o gráfico. Talvez você queira usar a função ChartNavigate para mover o gráfico de volta, mas isso seria uma implementação muito torta e é improvável que filtre corretamente todas as outras razões para mudanças no gráfico, além da rolagem da roda do mouse. Em minha mente, isso só pode ser feito através de hacking MT ou conhecendo alguns comandos e/ou eventos não documentados. De qualquer forma, não acredito que você tenha um exemplo de tal implementação.

E você tem uma estranha dica, no entanto. Quase à pergunta "Como obter evento de rolagem através da roda do mouse", você dá a resposta"Use evento de rolagem e uma função que mova o gráfico".

Talvez eu esteja errado, e você realmente tem um exemplo. Então você é um cara legal! )) Bem, então pelo menos largue o arquivo ex4 (ex5), não o código.

Olá Nikolay!

Acredite ou não, a solução é muito simples. São necessárias 15-20 linhas de código. Há um ponto sutil, porém - as especificidades da implementação do mecanismo de rolagem. Minha implementação difere um pouco do padrão. Ele rola lona, não objetos. Há uma implementação semelhante na biblioteca da Anatoly.

Eu faço scroll com a roda e "agarrando-me" ao movimento da carta, obtenho um efeito energizante. É claro que o gráfico trava, mas sempre volta à sua posição inicial. É para isso que serve a função de mudança de gráfico. A direção de deslocamento do gráfico também é obtida a partir da função mql. Assim, não tenho que invadir nada). A MQ tentou dar a mais ampla funcionalidade possível para implementar praticamente qualquer tarefa. Isto é até surpreendente. Talvez eles mesmos não conhecessem todas as características que abrem para os desenvolvedores).

 
Nikolai Semko:

De qualquer forma, não acredito que você tenha um exemplo de tal implementação.

E você tem uma estranha dica, no entanto. Praticamente à pergunta "Como obter evento de rolagem via roda do mouse", você dá a resposta "Use evento de rolagem e função que move o gráfico".

Talvez eu esteja errado, e você realmente tem um exemplo. Então você é um cara legal! )) Bem, pelo menos deixe cair o arquivo ex4 (ex5), não o código.

A situação é a seguinte. A pessoa a cujo posto respondi, pediu-me para dar-lhe uma idéia, como implementar um mecanismo de rolagem com uma roda. Eu lhe dei uma dica. Imediatamente os mal-intencionados locais se exaltaram e começaram a me acusar de gabarolice e outros disparates.

Do ponto de vista deles, se eu der uma solução, então ou estou anunciando meus produtos, ou apenas me gabando, e se não, então eu estou trapaceando e não tenho nada.

Posso lhe dar o código, mas, em primeiro lugar, ele será separado da implementação do mecanismo de rolagem e, em segundo lugar, será em russo. Mas talvez você possa adaptá-lo ao seu mecanismo de rolagem. Não posso colocar eh4, porque não posso "arrancar" um único mecanismo do ambiente gráfico no qual ele opera.

A melhor opção, seria dar-lhe a solução em termos gerais, mas não com o objetivo de provar nada, mas com base na amizade.

E assim:

O evento CHARTEVENT_CHART_CHANGE é gerado, entre outras coisas, no evento de movimento da roda do mouse, se o cursor estiver sobre o gráfico. A opção de desvio de gráfico deve estar habilitada. Assim, a partir do offset do gráfico, podemos saber exatamente quando giramos a roda. Podemos gerar um evento personalizado. Por exemplo, "SCROLLER_EVENT".

Em seguida, nossa tarefa é determinar a direção da compensação. Usamos ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR); a cada evento "SCROLLER_EVENT" obtemos o número da primeira barra visível e determinamos se é mais ou menos do que o número da barra anterior que registramos. Se for mais, então se move em uma direção; se for menos, então se move na direção oposta. Ao mesmo tempo, nossa tabela também irá rolar e pode chegar ao final. Para evitar isso, corrigimos sua posição usando a função ChartNavigate e colocamos o gráfico em sua posição inicial. Esta chamada também gera o evento CHARTEVENT_CHART_CHANGE e irá desabilitar nossa rolagem. Portanto, no momento da correção da posição do gráfico devemos pular o evento CHARTEVENT_CHART_CHANGE e não reagir a ele. Isto requer o uso de um sistema de bandeira.

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



Adicionado:

Quanto a outras causas de mudanças de gráfico, é claro, elas podem introduzir erros em nosso sistema. Entretanto, estes erros são tão insignificantes que não devemos prestar muita atenção a eles. Então, se a nova barra mover nossa tela alguns pixels... Não é um grande problema. E isto somente se o cursor estiver sobre a barra de rolagem naquele momento.

Naturalmente, a implementação é uma tentativa de encontrar uma saída para uma situação sem esperança. Com a completa falta de rolagem com a roda, esta é a solução mais simples e mais "nativa". Para uma solução completa, eu já entrei em contato com a Servicedesk. O fato de ser ou não depende dos desenvolvedores.
Razão: