Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Facebook!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Bibliotecas

AccurateTimer - biblioteca para MetaTrader 5

Visualizações:
1173
Avaliação:
(25)
Publicado:
2018.05.25 15:51
\MQL5\Experts\fxsaber\AccurateTimer\ \MQL5\Include\
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Temporizador no MetaTrader 4/5 é baseado na chamada do timer do sistema, e, por isso, pode funcionar com imprecisão. Para ver isso, basta executar um simples Expert Advisor:

input int Timer = 1000; // segundos para o temporizador se iniciar

#define TOSTRING(A) #A + " = " + (string)(A) + " ms.\n"

const bool Init = EventSetMillisecondTimer(Timer);

// No comentário do gráfico, gera o erro atual do timer e seu valor médio
void OnTimer()
{
  static ulong StartTime = 0;
  static int Count = 0;
  static int Sum = 0;

  if (StartTime)
  {
    const int RunTime = (int)(GetMicrosecondCount() - StartTime) / 1000;
    const int Error = RunTime - Timer * Count;

    Sum += Error;

    Comment(TOSTRING(Timer) + TimeToString(RunTime / 1000, TIME_SECONDS) + "\n" +
            TOSTRING(Error) + TOSTRING((double)Sum / Count));
  }
  else
    StartTime = GetMicrosecondCount();

  Count++;
}

No comentário do gráfico (canto superior esquerdo), ele mostra como o atraso do temporizador aumenta:

A captura de tela mostra que, em apenas um minuto de trabalho, o temporizador de segundos cria um atraso de mais de um segundo, que aumenta com o passar do tempo.

Esta biblioteca permite aumentar a precisão do temporizador de qualquer EA/indicador. Para fazer isso, é necessário, no início do código, escrever apenas uma linha:

#include <AccurateTimer.mqh> // Aumento da precisão do temporizador

Após esta ação, no EA acima, é possível observar a seguinte imagem:

Após dez minutos de operação, o desvio médio do temporizador ideal (teórico) é de ~1 ms e o erro não aumenta.

Ter um temporizador preciso é sempre bom. Mas há tarefas que não podem ser abordadas sem ele. Por exemplo, o temporizador de segundo sincronizado com o horário do Servidor de negociação.

Esta biblioteca multiplataforma é compatível com todos os EAs/indicadores em que é usado o temporizador (OnTimer). Não afeta a velocidade de execução no testador.

Aumente a precisão de programas já prontos e novos em apenas uma linha!


Modo frame

Advisors no modo de coleta de quadros de resultados de Otimização ignoram os seguintes eventos gerais durante seu funcionamento regular: Init, Deinit, NewTick, Trade, TradeTransaction, BookEvent e Timer. Apenas ChartEvent permanece como evento de trabalho.

No entanto, esta biblioteca pode incluir um temporizador neste modo. Para fazer isso, antes de chamar a biblioteca, você precisa escrever a seguinte linha:

#define ACCURATETIMER_FRAME_MODE // Faz com que o temporizador de EAs funcione no modo frame

Observe que, no Expert Advisor de origem, deve ser definido OnChartEvent (mesmo vazio), para, em OnTimer, a vulnerabilidade de frame correspondente começar a ser propagada.

Um exemplo de tal EA é anexado

// Demonstração de funcionamento do temporizador do EA no modo frame

#define ACCURATETIMER_FRAME_MODE // Faz com que o temporizador de EAs funcione no modo frame 
#include <AccurateTimer.mqh>     // Aumento da precisão do temporizador

sinput uint Range = 1; // Parâmetro de saída para Otimização

#define SETRANGE(A, START, STEP, END) ParameterSetRange(#A, true, A, START, STEP, END)

void OnTesterInit() { SETRANGE(Range, 0, 1, Range); }

void OnTesterDeinit() { EventSetTimer(1); } // No final da Otimização é definido o temporizador

// Considere a vulnerabilidade de frame! - https://www.mql5.com/pt/forum/170952/page71#comment_6626688
void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam ) {}
void OnTimer()
{
  static const bool IsFrame = MQLInfoInteger(MQL_FRAME_MODE);
  
  if (IsFrame)
    Print("Hello World!");
}

Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/19859

Chandes Quick Stick (Qstick) Chandes Quick Stick (Qstick)

O indicador foi desenvolvido pelo cientista, inventor, autor e trader Tushar Chande, a fim de determinar as tendências do mercado usando gráficos candlestick.

Relative Momentum Index Relative Momentum Index

Relative Momentum Index (RMI) — variação com base no indicador RSI. A RMI, ao contrário do RSI, compara o preço de fechamento do dia anterior não apenas com o preço de fechamento de um dia antes (como o RSI), mas também considerando mais dias atrás.

Rsi(var) Rsi(var)

Variações sobre o tema do RSI.

Custom Moving Average Input Color Custom Moving Average Input Color

Modificação do indicador "Custom Moving Average": agora nos parâmetros de entrada você pode transferir a cor da linha.