Discussão do artigo "Construtor de estratégia visual. Criação de robôs de negociação sem programação" - página 6

 
Andrey Barinov:
...

Adicionarei a rolagem de roda em versões futuras....

Gostaria de compartilhar minha experiência na implementação da rolagem de roda. Talvez minha tecnologia não seja adequada para você, mas pode lhe dar a ideia certa (se você ainda não tiver decidido o método de implementação).

Dentro da função OnChartEvent() na condição :

if(id == CHARTEVENT_CHART_CHANGE && !a)

1. eu uso a função ChartNavigate e defino o gráfico atual para a posição -100 barras atrás.

2. Eu defino o número da primeira barra visível usando ChartGetInteger(0,FIRST_VISIBLE_BAR) para a variável estática "First_bar_number".

3. Em seguida, corrijo o evento de gráfico CHARTEVENT_CHART_CHANGE uma vez (uso o sinalizador "a" e o sinalizador "b" para essa finalidade).

4. Comparo "Number_of_the_first_bar" e "Number_of_this_bar" (que também obtenho por meio de ChartGetInteger(0,FIRST_VISIBLE_BAR), mas em cada evento CHARTEVENT_CHART_CHANGE, e não uma vez, como com "Number_of_the_first_bar") e determino a direção do deslocamento do gráfico.

e determinar a direção do deslocamento do gráfico.

5. Em seguida, tudo é simples - movo a imagem do kanvas com ObjectSetInteger(0,G_CORE[CANVAS][_NAME],OBJPROP_YOFFSET,G_CORE[CANVAS][_FIELD_TO_VIEW_Y_DISTANCE]); retorno o gráfico à sua posição original - ChartNavigate(0,CHART_END,-100);

6. Eu pulo o próximo evento de gráfico porque ele é gerado a partir da função ChartNavigate chamada . Em seguida, tudo se repete.

Aqui está o código:

 if(id == CHARTEVENT_CHART_CHANGE && !a)
   {
    //------------------------------------ 
    if(!Номер_первого_бара)
      {
       ChartNavigate(0,CHART_END,-100); 
       Номер_первого_бара = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
      }
    //------------------------------------ 
    Номер_этого_бара = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
    //------------------------------------
    if(Номер_этого_бара > Номер_первого_бара)
      {
       Прокрутка_вниз = 1;
       Прокрутка_вверх = 0;
       Сдвиг = 25;
       a = 1;
      }
    if(Номер_этого_бара  < Номер_первого_бара) 
      {
       Прокрутка_вниз = 0;
       Прокрутка_вверх = 1;
       Сдвиг = -25;
       a = 1;
      }
    //------------------------------------
    G_CORE[КАНВАС][_IMAGE_VIRTUAL_Y] -= Сдвиг;
    //------------------------------------ 
    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]);
    //------------------------------------    
  }
//------------------------------------------------------
if(b){a = 0; b = 0;} 
if(a == 1){ChartNavigate(0,CHART_END,-100);  b = 1;} 
//------------------------------------------------------

A desvantagem desse método é que o gráfico em segundo plano se movimenta. No entanto, seu construtor ocupa toda a parte visível dele e, portanto, isso não será perceptível.

A vantagem desse método é que você obtém uma excelente rolagem com a roda, não inferior à rolagem das janelas do Windows. Há energia, desaceleração... Além disso, ao passar o mouse sobre uma barra de rolagem horizontal e rolar a roda, tenho uma barra de rolagem horizontal. É fácil fazer isso.

Com essa rolagem, os usuários sentirão como se estivessem trabalhando em windup).

Esta é a aparência: https://www.mql5.com/ru/forum/139237/page7

 
Реter Konow:

Gostaria de compartilhar minha experiência na implementação da rolagem com a roda. Talvez minha tecnologia não seja adequada para você, mas ela pode lhe dar a ideia certa (se você ainda não tiver decidido o método de implementação).

Dentro da função OnChartEvent() na condição :

1. eu uso a função ChartNavigate e defino o gráfico atual para a posição -100 barras atrás.

2. Eu defino o número da primeira barra visível usando ChartGetInteger(0,FIRST_VISIBLE_BAR) na variável estática "First_bar_number".

3. Em seguida, corrijo o evento de gráfico CHARTEVENT_CHART_CHANGE uma vez (uso o sinalizador "a" e o sinalizador "b" para essa finalidade).

4. Comparo o "Number_of_the_first_bar" e o "Number_of_this_bar" (que também obtenho por meio de ChartGetInteger(0,FIRST_VISIBLE_BAR), mas em cada evento CHARTEVENT_CHART_CHANGE, e não uma vez, como no caso de "Number_of_the_first_bar").

e determinar a direção do deslocamento do gráfico.

5. Em seguida, tudo é simples - movo a imagem do kanvas com ObjectSetInteger(0,G_CORE[CANVAS][_NAME],OBJPROP_YOFFSET,G_CORE[CANVAS][_FIELD_TO_VIEW_Y_DISTANCE]); retorno o gráfico à sua posição original - ChartNavigate(0,CHART_END,-100);

6. Eu pulo o próximo evento de gráfico porque ele é gerado a partir da função ChartNavigate chamada . Em seguida, tudo se repete.

Aqui está o código:

A desvantagem desse método é que o gráfico em segundo plano se move. No entanto, seu construtor ocupa toda a parte visível dele, portanto, isso não será perceptível.

A vantagem desse método é que você obtém uma excelente rolagem de roda, não inferior à rolagem das janelas do Windows. Há energia, desaceleração... Além disso, ao passar o mouse sobre uma barra de rolagem horizontal e rolar a roda, tenho uma barra de rolagem horizontal. É fácil fazer isso.

Com essa rolagem, os usuários se sentirão como se estivessem trabalhando no windup).

Esta é a aparência: https://www.mql5.com/ru/forum/139237/page7

Obrigado.

O que há de errado com CHARTEVENT_MOUSE_WHEEL?

https://www.mql5.com/pt/docs/constants/chartconstants/enum_chartevents&nbsp;

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Существуют 11 видов событий, которые можно обрабатывать с помощью функции предопределенной функции OnChartEvent(). Для пользовательских событий предусмотрено 65535 идентификаторов в диапазоне от CHARTEVENT_CUSTOM до CHARTEVENT_CUSTOM_LAST включительно. Для генерации пользовательского события необходимо использовать функцию EventChartCustom...
 
Andrey Barinov:

Obrigado.

O que há de errado com CHARTEVENT_MOUSE_WHEEL?

https://www.mql5.com/pt/docs/constants/chartconstants/enum_chartevents&nbsp;

Quando fiz a rolagem com a roda, ela ainda não estava lá. Portanto, nem sequer tentei. (Além disso, ainda estou trabalhando no MT4, e parece que ele não está disponível lá).

Ele fornece energia e desaceleração?

 
Реter Konow:

Quando fiz a rolagem com a roda, ela ainda não estava lá. Por isso, nem sequer tentei. (Além disso, ainda estou trabalhando no MT4, e parece que ele não está disponível lá).

Ele fornece energia e desaceleração?

Não sei, não experimentei. Só me lembro de que existe esse evento.

 

Boa tarde.

Sou o NEOPROGRAMMIST para quem este produto e o artigo sobre ele existem.

Tenho uma dúvida - para fins didáticos, tentei reproduzir o Expert Advisor do exemplo número 1 (cruzamento de MA rápida e lenta). Fiz tudo como no artigo, letra por letra. Como resultado, o Expert Advisor às vezes abre e fecha imediatamente várias posições, criando instantaneamente uma perda. E, às vezes, ele abre uma única posição, tudo como deveria, e a fecha quando chega o sinal oposto. Tudo parecia estar bem pelo menos com esses, mas percebi que eles são sempre apenas Bai.

O esquema se dissolveu após reiniciar o computador (atualização à noite), portanto não consigo encontrar um possível erro, pois o código ainda é muito fraco, além de ser muito grande e incompreensível.

Você poderia revisar o código e sugerir o que eu fiz de errado?

Arquivos anexados:
 
Andrey Barinov:

Não sei, não experimentei. Só me lembro de que existe esse evento.

O evento está lá, mas ninguém o usou ainda).

Eu adoraria me livrar do meu método por causa da oscilação do gráfico, mas o MT4 não tem esse evento, e o MT5 ainda não sabe como ele funciona....

 
 
Sergey Voytsekhovsky:

Boa tarde.

Eu sou o NEOPROGRAMISTA para o qual este produto e o artigo sobre ele existem.

Tenho uma dúvida - para fins didáticos, tentei reproduzir o Expert Advisor do exemplo número 1 (cruzamento de MA rápida e lenta). Fiz tudo como no artigo, letra por letra. Como resultado, o Expert Advisor às vezes abre e fecha imediatamente várias posições, criando instantaneamente uma perda. E, às vezes, ele abre uma única posição, tudo como deveria, e a fecha quando chega o sinal oposto. Tudo parecia estar bem, pelo menos com esses, mas percebi que eles são sempre apenas Buy.

O esquema se dissolveu depois de reiniciar o computador (atualização à noite), então não consigo encontrar um possível erro, pois o código ainda é muito fraco, além de ser tão grande e incompreensível.

Você poderia revisar o código e sugerir o que eu fiz de errado?

Comece examinando o padrão nº 1. Esse é exatamente o mesmo padrão considerado no artigo (apenas Travelling e Lossless foram adicionados). Você pode ver os parâmetros de todos os elementos e brincar com eles.

Há uma série de erros em seu Expert Advisor. Um deles é que você não alterou o tipo de transação no elemento para fazer vendas (ele diz "compra" em vez de venda).

 
Andrey Barinov:

Comece estudando o padrão nº 1. Esse é exatamente o esquema considerado no artigo (apenas Travelling e Breakeven foram adicionados). Você pode ver os parâmetros de todos os elementos e brincar com eles.

Há alguns erros em seu Expert Advisor. Um deles é que você não alterou o tipo de transação no elemento para fazer vendas (ele diz "compra" em vez de venda).

Obrigado, fiquei agradavelmente surpreso com a rapidez de sua resposta.

Entendo que o tipo de transação não foi alterado, e esse é o motivo pelo qual apenas as compras funcionam normalmente.

Mas em que lugar está errado o fato de que em meio segundo, aparentemente a cada tick, toda uma série de ordens é aberta e fechada de uma só vez, e há ordens de compra e venda. ???

 
Sergey Voytsekhovsky:

Obrigado, fiquei agradavelmente surpreso com a rapidez da resposta.

Entendo que o tipo de transação não foi alterado, e esse é o motivo pelo qual apenas as compras funcionam normalmente.

Mas em que lugar está errado o fato de que em meio segundo, aparentemente a cada tick, toda uma série de ordens é aberta e imediatamente fechada, e há ordens de compra e venda. ???

Bem, veja, você tem uma compra em vez de uma venda. Ao mesmo tempo, quando um sinal de venda é dado, as compras devem ser fechadas! E é o que acontece.

Aparece um sinal de venda, o robô abre uma compra em vez de uma venda por engano e a fecha imediatamente, depois a abre novamente e a fecha de novo, etc.

Caso contrário, tudo estava correto em seu esquema.