Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1461

 
Aleksandr Slavskii #:

Se for prescrito no Expert Advisor para excluir ordens e fechar posições quando o Expert Advisor for excluído,

então tudo será excluído e fechado

Um pequeno acréscimo: se demorar 2,5 segundos.

Выполнение функции OnDeinit() ограничивается 2.5 секундами. Если за это время функция не закончила свою работу, то ее выполнение завершается принудительно.
 

Não consigo descobrir como fazer isso.

Quando ocorre o evento de rolagem da roda do mouse, o código é executado.

A roda do mouse pode ser rolada por vários cliques ao mesmo tempo, e não receberemos um evento com dparam = número de cliques, mas vários eventos com dparam = +/-120.

O código é executado por algum tempo, que é muito maior do que o tempo entre os cliques ao rolar a roda do mouse.

Como resultado, verifica-se que ninguém mais está rolando a roda do mouse, e o programa continua a recalcular por mais algum tempo.

//+------------------------------------------------------------------+
void OnInit()
  {
   ChartSetInteger(0, CHART_EVENT_MOUSE_WHEEL, 0, true);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;

   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      //--- какой то код
      delta += dparam / 120;
      Sleep(1000);
      //---
      Print(delta);
     }
  }
//+------------------------------------------------------------------+
15:12:22.820    test (EURUSD,H1)        0.0
15:12:23.821    test (EURUSD,H1)        1.0
15:12:24.811    test (EURUSD,H1)        2.0
15:12:25.823    test (EURUSD,H1)        3.0
15:12:26.817    test (EURUSD,H1)        4.0
15:12:27.814    test (EURUSD,H1)        5.0
A roda do mouse rolou às 15:12:22.820 e, em seguida, o programa foi executado mais 5 vezes, por 5 segundos inteiros.


Pergunta: como executar o código do programa uma vez em vez de várias vezes.

Ou seja, a roda rolou por 5 cliques, delta = dparam / 120 * 5.

 
Aleksandr Slavskii #:

Não consigo descobrir como fazer isso.

Quando ocorre o evento de rolagem da roda do mouse, o código é executado.

A roda do mouse pode ser rolada por vários cliques ao mesmo tempo, e não receberemos um evento com dparam = número de cliques, mas vários eventos com dparam = +/-120.

O código é executado por algum tempo, que é muito maior do que o tempo entre os cliques ao rolar a roda do mouse.

Como resultado, verifica-se que ninguém mais está rolando a roda do mouse, e o programa continua recalculando por mais algum tempo.

A roda do mouse rolou às 15:12:22.820 e, em seguida, o programa foi executado mais 5 vezes, por 5 segundos inteiros.


Pergunta: como executar o código do programa uma vez em vez de várias vezes.

Ou seja, a roda rolou por 5 cliques, delta = dparam / 120 * 5.

Tente isso

//+------------------------------------------------------------------+
void OnInit()
  {
   ChartSetInteger(0, CHART_EVENT_MOUSE_WHEEL, 0, true);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;
   bool flag = true;
   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      //--- какой то код
      delta += dparam / 120;
      Sleep(1000);
      //---
      if(flag)
       {
        Print(delta);
        flag = false;
       }
     }
  }
//+------------------------------------------------------------------+

Eu não verifiquei, se for o caso, a culpa não é minha...)))))) Terei que fazer algo com o sinalizador... e talvez eu tenha que colocar o código em uma função personalizada e mexer com o sinalizador lá.

 
Muito obrigado!
 

Em 03 de junho, publiquei meu script para MT5(https://www.mql5.com/ru/code/44732).... Ele ainda está no status de "sendo verificado pelo moderador". Quem sabe quanto tempo esperaremos pela verificação?

Скачать бесплатно скрипт 'Quick Change MA (method, period)' от 'NotBuffett' для MetaTrader 5 в MQL5 Code Base
  • www.mql5.com
Скачать бесплатно скрипт 'Quick Change MA (method, period)' от 'NotBuffett' для MetaTrader 5 в MQL5 Code Base
 
Alexey Viktorov #:

Tente isso

Não verifiquei, se não for minha culpa...)))))) Terei que mexer com o sinalizador de alguma forma... e talvez tenha que colocar o código em uma função personalizada e mexer com o sinalizador lá.

O problema é que as funções personalizadas são executadas somente dentro de funções de evento, e eu tenho apenas duas dessas funções OnInit e OnChartEvent em meu EA.

Em geral, consegui fazer isso, embora não seja exatamente como, mas ainda assim melhor do que era.

//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;
   static ulong timeWheel = 0;
   static bool mouse_wheel = false;

   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      delta += dparam / 120;
      mouse_wheel = true;
      timeWheel = GetMicrosecondCount();
     }

   if(mouse_wheel && GetMicrosecondCount() - timeWheel > 0)
     {
      Print(delta);
      //--- какой то код
      Sleep(1000);
      //---
      delta = 0;
      mouse_wheel = false;
     }
  }
//+------------------------------------------------------------------+
23:48:28.853    test (EURUSD,H1)        1.0
23:48:29.857    test (EURUSD,H1)        1.0
23:48:30.856    test (EURUSD,H1)        4.0
23:48:31.881    test (EURUSD,H1)        2.0
23:48:32.880    test (EURUSD,H1)        4.0
23:48:33.887    test (EURUSD,H1)        11.0
23:48:34.914    test (EURUSD,H1)        15.0
23:48:35.926    test (EURUSD,H1)        7.0
23:48:36.936    test (EURUSD,H1)        9.0
23:48:46.477    test (EURUSD,H1)        6.0
23:48:47.479    test (EURUSD,H1)        -1.0
 
Aleksandr Slavskii #:

O problema é que as funções personalizadas são executadas somente dentro das funções de evento, e eu tenho apenas duas dessas funções OnInit e OnChartEvent em meu EA.

Em geral, consegui fazer isso, embora não tenha sido uma boa ideia, mas ainda assim melhor do que era.

Você também pode chamar funções personalizadas de OnChartEvent sem problemas.

O sinalizador é declarado em nível global. Inserir OnTick apenas para redefinir o sinalizador não é um problema e não atrasará a execução do código.

Se o sinalizador estiver aberto, uma função personalizada será chamada. Internamente, o sinalizador foi fechado. No OnTick, o sinalizador é aberto novamente e aguarda a próxima execução da função do usuário.

Acho que isso é mais fácil do que ficar preso no tempo de execução.

 
Alexey Viktorov #:

Você também pode chamar funções personalizadas de OnChartEvent, sem problemas.

O sinalizador é declarado em nível global. Inserir OnTick somente para redefinir o sinalizador não é um problema e não atrasará a execução do código.

Se o sinalizador estiver aberto, uma função personalizada será chamada. Internamente, o sinalizador foi fechado. Em OnTick, o sinalizador é aberto novamente e aguarda a próxima execução da função do usuário.

Acho que isso é mais fácil do que ficar preso ao tempo de execução.

Não entendi muito bem, ou melhor, não entendi nada :)

E se não houver ticks, o OnTick não funciona sem ticks, o que devo fazer?


Na verdade, eu chamo funções personalizadas de OnChartEvent de qualquer maneira. Era apenas um problema para rastrear o último clique do mouse ao rolar a roda.

A tarefa era atrasar a execução da função personalizada até o momento de parar a rolagem da roda, enquanto contava o número de cliques durante a rolagem.

Em princípio, funcionou.

 
NotBuffett #:

Em 03 de junho, publiquei meu script para MT5(https://www.mql5.com/ru/code/44732).... Ele ainda está no status de "sendo verificado pelo moderador". Quem sabe quanto tempo esperaremos pela verificação?

Acabei de publicar o código. A verificação levou menos de um minuto.

É provável que você tenha cometido um erro ao publicar.

 
Aleksandr Slavskii #:

Acabei de publicar o código. A verificação levou menos de um minuto.

É provável que você tenha cometido um erro ao publicá-lo.

Tentei publicar novamente... e é a mesma coisa:

Em "5. Teste" está escrito"Oteste foi concluído sem erros" e se oferece para publicá-lo, mas quando você clica no botão "Publicar", recebe um erro

404. Essa página não existe

Na subseção "My Codes" (Meus códigos), agora há dois códigos e, em ambos, "checked by moderator" (verificado pelo moderador).

Em geral, farei uma pergunta no tópico geral, talvez os moderadores ainda percebam.

Razão: