Numero de contratos negociados por segundo/minuto

 

Saudações

É possivel criar uma função que retorne o numero de contratos de compra ou de venda negociados num intervalo de tempo? Por segundo ou por minuto, por exemplo.

 
Marcel Cardoso:

Saudações

É possivel criar uma função que retorne o numero de contratos de compra ou de venda negociados num intervalo de tempo? Por segundo ou por minuto, por exemplo.

sim, é. Tem ate ja outros topicos sobre isso e tem artigos explicando sobre isso e como jogar essa informacao pra banco de dados.

 
Ricardo Rodrigues Lucca #:

sim, é. Tem ate ja outros topicos sobre isso e tem artigos explicando sobre isso e como jogar essa informacao pra banco de dados.

poderia me indicar um link com essas informações para eu analisar?

 

Na minha visão, você tem duas opções:


1 - Você pode usar a função CopyRealTicks para copiar o número de contratos negociados nas últimas N barras no timeframe especificado - o ponto negativo, evidentemente, é que você fica limitado aos timeframes disponíveis no MT5;

2 - Um EA recebe cada tick de um ativo. Você pode usar a função SymbolInfoInteger e passar o parâmetro SYMBOL_VOLUME para obter o volume do último negócio. Basta criar uma variável global e acrescentar este volume a essa variável. Quando X período de tempo passar - e isso pode ser constatado simplesmente usando alguma função de tempo, por exemplo GetTickCount64 (que retorna o número de milisegundos passados desde a 'epoch', normalmente o ano de 1970) - você salva o valor dessa variável global para usar ela em outra variável (ou utiliza ela de uma vez só; vai depender da estrutura do seu código) e define ela como 0 de novo para que a contagem se reinicie durante X período de tempo novamente. O problema aqui é o seguinte: um novo tick se sobrepõe ao tick mais velho se o mais velho não for processado a tempo. Por exemplo: um tick chegou às 11h00min00s, outro às 11h00min01s e outro às 11h00min02s. Se o EA estiver processando o primeiro tick quando o segundo chegar, este será pulado. Se quando o terceiro chegar ele ainda estiver processando o primeiro, este também será pulado, e assim sucessivamente. Aqui também é evidente o seguinte: a desvantagem ocorre se o seu código for lento o bastante para pular ticks - o que não é incomum. Se a ideia é essa mesmo, entendo que seja necessário fazer os cálculos matemáticos do EA usando uma DLL escrita em C (vai ser ligeiramente mais rápido, provavelmente) ou com OpenCL (com o poder da GPU).


A primeira ideia seria mais viável justamente para evitar esse 'pulo' dos ticks.

 
Emanuel Cavalcante Amorim Filho #:

Na minha visão, você tem duas opções:


1 - Você pode usar a função CopyRealTicks para copiar o número de contratos negociados nas últimas N barras no timeframe especificado - o ponto negativo, evidentemente, é que você fica limitado aos timeframes disponíveis no MT5;

2 - Um EA recebe cada tick de um ativo. Você pode usar a função SymbolInfoInteger e passar o parâmetro SYMBOL_VOLUME para obter o volume do último negócio. Basta criar uma variável global e acrescentar este volume a essa variável. Quando X período de tempo passar - e isso pode ser constatado simplesmente usando alguma função de tempo, por exemplo GetTickCount64 (que retorna o número de milisegundos passados desde a 'epoch', normalmente o ano de 1970) - você salva o valor dessa variável global para usar ela em outra variável (ou utiliza ela de uma vez só; vai depender da estrutura do seu código) e define ela como 0 de novo para que a contagem se reinicie durante X período de tempo novamente. O problema aqui é o seguinte: um novo tick se sobrepõe ao tick mais velho se o mais velho não for processado a tempo. Por exemplo: um tick chegou às 11h00min00s, outro às 11h00min01s e outro às 11h00min02s. Se o EA estiver processando o primeiro tick quando o segundo chegar, este será pulado. Se quando o terceiro chegar ele ainda estiver processando o primeiro, este também será pulado, e assim sucessivamente. Aqui também é evidente o seguinte: a desvantagem ocorre se o seu código for lento o bastante para pular ticks - o que não é incomum. Se a ideia é essa mesmo, entendo que seja necessário fazer os cálculos matemáticos do EA usando uma DLL escrita em C (vai ser ligeiramente mais rápido, provavelmente) ou com OpenCL (com o poder da GPU).


A primeira ideia seria mais viável justamente para evitar esse 'pulo' dos ticks.

Obrigado pela resposta. Vou analisar o que vc disse e posteriormente retorno para dizer se deu certo.
Mas a minha ideia inicial é ter de forma separada o volume comprador e vendedor, não sei se o que vc sugeriu vai me atender, mas mesmo assim obrigado.
 
Marcel Cardoso #Obrigado pela resposta. Vou analisar o que vc disse e posteriormente retorno para dizer se deu certo. Mas a minha ideia inicial é ter de forma separada o volume comprador e vendedor, não sei se o que vc sugeriu vai me atender, mas mesmo assim obrigado.

  1. Existe alguma forma de obter volume de agressão - Expert Advisors e Negociação Automatizada - Fórum de negociação algorítmica MQL5
  2. Como calcular o volume de compra e o volume de venda, SEPARADAMENTE, usando as funções CopyTicks ou CopyTicksRange?? - Geral - Fórum de negociação algorítmica MQL5

Artigos

Escrita de indicadores de bolsa com controle de volume usando o indicador delta como exemplo

Alexey Kozitsyn, 2018.10.22 11:56

Este artigo descreve um algoritmo para construir indicadores de bolsa com base em volumes reais usando as funções CopyTicks() e CopyTicksRange(). Também apresenta as particularidades de construção desses indicadores, bem como seus aspetos de funcionamento tanto em tempo real quanto no testador de estratégias.

 
Marcel Cardoso #:
Obrigado pela resposta. Vou analisar o que vc disse e posteriormente retorno para dizer se deu certo.
Mas a minha ideia inicial é ter de forma separada o volume comprador e vendedor, não sei se o que vc sugeriu vai me atender, mas mesmo assim obrigado.

ah, eu li rápido e perdi essa parte, foi mal. Você também pode usar a função SymbolInfoTick, que irá retornar uma estrutura MqlTick que conterá algumas informações, como o lado do último negócio e o volume real de contratos negociados, aí dependendo do lado vc consegue salvar os resultados em variáveis diferentes para cada ponta.

 
Emanuel Cavalcante Amorim Filho #:

ah, eu li rápido e perdi essa parte, foi mal. Você também pode usar a função SymbolInfoTick, que irá retornar uma estrutura MqlTick que conterá algumas informações, como o lado do último negócio e o volume real de contratos negociados, aí dependendo do lado vc consegue salvar os resultados em variáveis diferentes para cada ponta.

Não consegui implementar isso que vc sugeriu, poderia me dar uma ajuda com alguma sugestão de parte do código?

 

Entendo que isso aqui seja suficiente:


//+------------------------------------------------------------------+
//|                                           ContractsPerSecond.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      Seconds=15;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

double traded_lots_buy=0;
double traded_lots_sell=0;
double total_ticks_volume=0;
ulong last_checked_time = 0;
ulong last_bar = 0;
int processed_ticks = 0;

int OnInit()
  {
    
   datetime current_time = TimeLocal(); 
   last_checked_time = current_time - (current_time%Seconds); // inicializamos o último horário de checagem para o último horário (múltiplo dos segundos escolhidos)
   last_bar = iTime(_Symbol,PERIOD_M1, 0);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    datetime current_time = TimeLocal(); // pegamos o horário atual em segundos
    datetime current_bar = iTime(_Symbol,PERIOD_CURRENT,0);
    
    if(current_bar != last_bar)
    {
        Print("Ticks processados na barra: ", processed_ticks);
        last_bar=current_bar;
        processed_ticks=0;
    }
    
    
    if((last_checked_time + Seconds) <= current_time) // se tiver passado + do que N segundos desde o último horário checado
    {
        Print("Volume de compra negociado nos últimos ", Seconds, " segundos: ", traded_lots_buy); // printamos o volume negociado no período
        Print("Volume de venda negociado nos últimos ", Seconds, " segundos: ", traded_lots_sell); // printamos o volume negociado no período
        Print("Total de negócios no período: ", total_ticks_volume);
        total_ticks_volume=0;
        traded_lots_buy=0;
        traded_lots_sell=0; // definimos o volume de volta para 0 para que a contagem seja reiniciada
        last_checked_time = current_time - (current_time%Seconds); // definimos o tempo da última checagem para o tempo atual em um múltiplo de N segundos
        Print("ms = ", last_checked_time);
    }
    
    MqlTick tick;
    SymbolInfoTick(_Symbol, tick);
    
    if((tick.flags & TICK_FLAG_BUY)) // bitwise 'and' para comparar as flags
    {
    traded_lots_buy += tick.volume_real;
    total_ticks_volume += tick.volume;
    }
    else if ((tick.flags & TICK_FLAG_SELL))
    {
    traded_lots_sell += tick.volume_real;
    total_ticks_volume += tick.volume;
    }
    
    ++processed_ticks;
   
  }
//+------------------------------------------------------------------+


Dá para ver na imagem seguinte, por exemplo, que a cada 15 segundos (campo 'time') ele printa o volume de compra e de venda. 



Há alguns poréns: igual eu disse, se um novo tick chegar enquanto você ainda estiver processando o anterior, você perde o tick seguinte, aí não consegue somar corretamente os valores dos volumes. Além disso, o tick seguinte chegará somente quando o servidor enviar uma nova cotação (o que isso significa? quando houver uma mudança de preço? ou quando houver um novo negócio? realmente não sei - se for quando houver mudança de preço, você acaba perdendo todos os negócios realizados naquele preço anterior e também não consegue somar os valores). 

O metatrader não foi desenhado para trabalhar bem com volumes (no forex não tem volume de lotes negociados, só o número de negócios), então mexer com isso é realmente uma tarefa um pouco mais complexa, na minha opinião. Mas com esse código que te mandei aí, dá para ter uma base de como funciona a função e como seria a lógica por trás.


ps: se alguém achar algum erro no código, me avise para alterar

Documentação sobre MQL5: Programas MQL5 / Eventos do Terminal Cliente
Documentação sobre MQL5: Programas MQL5 / Eventos do Terminal Cliente
  • www.mql5.com
Imediatamente após o terminal cliente carregar um programa (uma Expert Advisor ou um indicador customizado) e começar o processo de...
Razão: