Tick Times and Sales

 
Como obter os ticks dos últimos 60 segundos ou dos ultimos 5 minutos? Vi que tem as funções pra CopyTicks e CopyTicksRange, mas não consigo ainda especificar o periodo em milisegundos.
 
Samuel Manoel De Souza:
Como obter os ticks dos últimos 60 segundos ou dos ultimos 5 minutos? Vi que tem as funções pra CopyTicks e CopyTicksRange, mas não consigo ainda especificar o periodo em milisegundos.

1) Use a função TimeCurrent para obter o horário atual no formato Datetime (número de segundos transcorridos desde 01.01.1970 00:00).

2) Subtraia o número de segundos correspondente à janela de tempo desejada (exemplo: para janela de 5 minutos subtraia 300).

2) Converta o resultado da subtração para ulong (imprescindível para não dar overflow) e multiplique por 1000 para converter para milissegundos, que é a unidade de tempo esperada pela função CopyTicksRange.

3) Chame a função CopyTicksRange passando no parâmetro from_msc o valor obtido no passo 3 acima e ignore o parâmetro to_msc, pois o valor default desse parâmetro é o instante atual, que é justamente o que vc deseja.

Exemplo:

CopyTicksRange ( Symbol() , tickArray , COPY_TICKS_ALL , 1000 * (ulong) (TimeCurrent() - 300) );

Documentation on MQL5: Date and Time / TimeCurrent
Documentation on MQL5: Date and Time / TimeCurrent
  • www.mql5.com
Returns the last known server time, time of the last quote receipt for one of the symbols selected in the "Market Watch" window. In the OnTick() handler, this function returns the time of the received handled tick. In other cases (for example, call in handlers OnInit(), OnDeinit(), OnTimer() and so on) this...
 
Trader_Patinhas:

1) Use a função TimeCurrent para obter o horário atual no formato Datetime (número de segundos transcorridos desde 01.01.1970 00:00).

2) Subtraia o número de segundos correspondente à janela de tempo desejada (exemplo: para janela de 5 minutos subtraia 300).

2) Converta o resultado da subtração para ulong (imprescindível para não dar overflow) e multiplique por 1000 para converter para milissegundos, que é a unidade de tempo esperada pela função CopyTicksRange.

3) Chame a função CopyTicksRange passando no parâmetro from_msc o valor obtido no passo 3 acima e ignore o parâmetro to_msc, pois o valor default desse parâmetro é o instante atual, que é justamente o que vc deseja.

Exemplo:

CopyTicksRange ( Symbol() , tickArray , COPY_TICKS_ALL , 1000 * (ulong) (TimeCurrent() - 300) );

Obrigado. Fiquei confuso com relação "número de segundos transcorridos desde 01.01.1970 00:00".

Eu esperava to_msc=0 fosse o início em 01.01.1970 00:00.

Vou fazer como sugere.

Obrigado.

 
Samuel Manoel De Souza:

Obrigado. Fiquei confuso com relação "número de segundos transcorridos desde 01.01.1970 00:00".

Eu esperava to_msc=0 fosse o início em 01.01.1970 00:00.

Vou fazer como sugere.

Obrigado.

Boa noite.

o tipo datetime segue o padrão unixtimestamp, para considerar os ms é necessário multiplicar por 1000 como o Trader_Patinhas disse.

Abs.

 
Samuel Manoel De Souza:

Obrigado. Fiquei confuso com relação "número de segundos transcorridos desde 01.01.1970 00:00".

Eu esperava to_msc=0 fosse o início em 01.01.1970 00:00.

Vou fazer como sugere.

Obrigado.

Oi @Samuel Manoel De Souza

O parâmetro from_msc especifica o instante inicial e o parâmetro to_msc especifica o instante final da janela de tempo de onde se deseja obter os ticks.

Quando o parâmetro to_msc não é especificado, a função retorna todos os ticks até o fim do histórico (instante presente).

Veja o que diz a documentação ( https://www.mql5.com/en/docs/series/copyticksrange ) : 

from_msc

[in]   The date, from which you want to request ticks. In milliseconds since 1970.01.01. If the from_msc parameter is not specified, ticks from the beginning of the history are sent. Ticks with the time >= from_msc are sent.

to_msc

[in]   The date, up to which you want to request ticks. In milliseconds since 01.01.1970. Ticks with the time <= to_msc are sent. If the to_msc parameter is not specified, all ticks up to the end of the history are sent.

Documentation on MQL5: Timeseries and Indicators Access / CopyTicksRange
Documentation on MQL5: Timeseries and Indicators Access / CopyTicksRange
  • www.mql5.com
[out] MqlTick static or dynamic array for receiving ticks. If the static array cannot hold all the ticks from the requested time interval, the maximum possible amount of ticks is received. In this case, the function generates the error ERR_HISTORY_SMALL_BUFFER (4407) . ERR_NOT_ENOUGH_MEMORY – insufficient memory for receiving a history from...
 

Olá!!

Estou tentando calcular o Ajuste do mini Índice e Dólar. Principalmente para fins de BackTestes, pois as funções abaixo para Ajuste e VWAP não funcionam em BackTestes, apenas para dados atuais:

double Ajuste=SymbolInfoDouble(_Symbol, SYMBOL_SESSION_CLOSE);
double VWAP=SymbolInfoDouble(_Symbol, SYMBOL_SESSION_AW);

Bem, consegui com ajuda de algumas pessoas chegar no comando abaixo:

//+------------------------------------------------------------------+
//| CÁLCULO DO AJUSTE DE PREÇOS BMF                                  |
//+------------------------------------------------------------------+
double CarregaArrayTicksAjuste(string ATIVO,datetime TDATAHORAINICIAL,datetime TDATAHORAFINAL)
{

MqlDateTime today;
MqlTick TickAjuste[];

double Ajuste=0;
double totalvol=0;
TimeToStruct(TDATAHORAINICIAL,today);

today.day--;

today.hour=15;
today.min=50;
today.sec=0;

datetime inicio=StructToTime(today);
today.hour=16;
today.min=00;
today.sec=0;
datetime fim=StructToTime(today);

if(StringSubstr(_Symbol,0,2)=="WI")
{

today.hour=17;
today.min=00;
today.sec=0;

inicio=StructToTime(today);
today.hour=17;
today.min=15;
today.sec=0;
fim=StructToTime(today);

}
else
if(StringSubstr(_Symbol,0,2)=="WD")
{

today.hour=15;
today.min=50;
today.sec=0;

inicio=StructToTime(today);
today.hour=16;
today.min=00;
today.sec=0;
fim=StructToTime(today);

}
   ArrayFree(TickAjuste);
   int received=CopyTicksRange(ATIVO,TickAjuste,COPY_TICKS_TRADE,1000*(ulong)(inicio),1000*(ulong)(fim));
   if(received<=0) Alert("ERRO CARREGANDO AJUSTE !!!");
   if (received >0)
   {
   for(int i=0;i<ArraySize(TickAjuste);i++)
   {
   Ajuste=Ajuste+(TickAjuste[i].last*TickAjuste[i].volume);
   totalvol=totalvol+TickAjuste[i].volume;
   }
   
   if(totalvol<1) totalvol=1;
   Ajuste=NormalizeDouble(Ajuste/totalvol,0);
   
   return Ajuste;
   } else return -1;
}

Porém, sigo com erro do Alerta criado , onde, aparentemente, o CopyTicksRange não conseguiu copiar os Ticks. Estou buscando sempre os dados do pregão anterior para cálculo do ajuste e, assim, tomar as ações do EA no dia atual. 


Algum de vcs tem ideia de como resolver isso?


Obrigado!

 
Paulo Garcia:

Olá!!

Estou tentando calcular o Ajuste do mini Índice e Dólar. Principalmente para fins de BackTestes, pois as funções abaixo para Ajuste e VWAP não funcionam em BackTestes, apenas para dados atuais:

Bem, consegui com ajuda de algumas pessoas chegar no comando abaixo:

Porém, sigo com erro do Alerta criado , onde, aparentemente, o CopyTicksRange não conseguiu copiar os Ticks. Estou buscando sempre os dados do pregão anterior para cálculo do ajuste e, assim, tomar as ações do EA no dia atual. 


Algum de vcs tem ideia de como resolver isso?


Obrigado!

Ola, conheco essa rotina ,... e funciona sim...


qual o erro ?  nao carrega o array? estranho porque uso e funcina... estou com o meu robo aqui e utilizando como pode ser visto nas linhas pontilhadas todos os ultimos ajustes

 
Segue a foto do robo executando agora no indice as 11:45
Arquivos anexados:
ajustes.PNG  49 kb
 
sandrolho:

Ola, conheco essa rotina ,... e funciona sim...


qual o erro ?  nao carrega o array? estranho porque uso e funcina... estou com o meu robo aqui e utilizando como pode ser visto nas linhas pontilhadas todos os ultimos ajustes

hahahah!!! @sandrolho te mandei inbox no face, mas acho que não viu! Ai vim pedir socorro por aqui! haahha


Poisé, não está carregando o array. Vi sua foto tudo funcionando perfeitamente. 


Você chama o CarregaArrayTicksAjuste() em que parte do EA? 


Estou usando corretora Modal DMA4, WING19, H1 e Cada Tick...


Bem, a estrutura completa do EA que estou montando e não está rodando é essa aqui:

//+------------------------------------------------------------------+
//|                                                       Ajuste.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"


//+------------------------------------------------------------------+
//| CÁLCULO DO AJUSTE DE PREÇOS BMF                                  |
//+------------------------------------------------------------------+
double CarregaArrayTicksAjuste(string ATIVO,datetime TDATAHORAINICIAL,datetime TDATAHORAFINAL)
{

MqlDateTime today;
MqlTick TickAjuste[];

double Ajuste=0;
double totalvol=0;
TimeToStruct(TDATAHORAINICIAL,today);

today.day--;

today.hour=15;
today.min=50;
today.sec=0;

datetime inicio=StructToTime(today);
today.hour=16;
today.min=00;
today.sec=0;
datetime fim=StructToTime(today);

if(StringSubstr(_Symbol,0,2)=="WI")
{

today.hour=17;
today.min=00;
today.sec=0;

inicio=StructToTime(today);
today.hour=17;
today.min=15;
today.sec=0;
fim=StructToTime(today);

}
else
if(StringSubstr(_Symbol,0,2)=="WD")
{

today.hour=15;
today.min=50;
today.sec=0;

inicio=StructToTime(today);
today.hour=16;
today.min=00;
today.sec=0;
fim=StructToTime(today);

}
   ArrayFree(TickAjuste);
   int received=CopyTicksRange(ATIVO,TickAjuste,COPY_TICKS_TRADE,1000*(ulong)(inicio),1000*(ulong)(fim));
   if(received<=0) Alert("ERRO CARREGANDO AJUSTE !!!");
   if (received >0)
   {
   for(int i=0;i<ArraySize(TickAjuste);i++)
   {
   Ajuste=Ajuste+(TickAjuste[i].last*TickAjuste[i].volume);
   totalvol=totalvol+TickAjuste[i].volume;
   }
   
   if(totalvol<1) totalvol=1;
   Ajuste=NormalizeDouble(Ajuste/totalvol,0);
   
   return Ajuste;
   } else return -1;
}

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- Definições diversas de tempo, barras, etc
   datetime FCandleT=StringToTime(TimeToString(iTime(_Symbol,PERIOD_D1,1),TIME_DATE) + " 00:00:00");
   datetime LCandleT=StringToTime(TimeToString(iTime(_Symbol,PERIOD_D1,1),TIME_DATE) + " 23:59:59");
   int TDBars=Bars(_Symbol,PERIOD_M15,FCandleT,LCandleT);
   int Barras=Bars(_Symbol,PERIOD_M15,StringToTime(TimeToString(TimeCurrent(),TIME_DATE) + " 00:00:00"),TimeCurrent());

   if(TDBars>=1)
   {
    //--- To be used to store the prices, volumes and spread of each bar
    MqlRates mrate[]; 
    int copiou=CopyRates(_Symbol,PERIOD_M15,Barras,TDBars,mrate);
    datetime Ultimo=mrate[TDBars-1].time;
    datetime Primeiro=mrate[0].time;
    Print("Primeiro :", Primeiro,". Último :", Ultimo);
    double Adjst=CarregaArrayTicksAjuste(_Symbol,Primeiro,Ultimo);
    Print(Adjst);
   }  
  }
//+------------------------------------------------------------------+
 
Paulo Garcia:

hahahah!!! @sandrolho te mandei inbox no face, mas acho que não viu! Ai vim pedir socorro por aqui! haahha


Poisé, não está carregando o array. Vi sua foto tudo funcionando perfeitamente. 


Você chama o CarregaArrayTicksAjuste() em que parte do EA? 


Estou usando corretora Modal DMA4, WING19, H1 e Cada Tick...


Bem, a estrutura completa do EA que estou montando e não está rodando é essa aqui:

Entao, 

nao precisa fazer isso nao. 

ao chamar a rotina passa data de hoje. Timecurrent. 


pq a rotina so pega o ajuste do dia anterior, se passou (agora,agora),.. pega de ontem
se passou data de ontem ( pega o ajuste de ante ontem ) 


basta chamar mesmo 


Adjst=CarregaArrayTicksAjuste(_Symbol,hoje,hoje);

 
sandrolho:

Entao, 

nao precisa fazer isso nao. 

ao chamar a rotina passa data de hoje. Timecurrent. 


pq a rotina so pega o ajuste do dia anterior, se passou (agora,agora),.. pega de ontem
se passou data de ontem ( pega o ajuste de ante ontem ) 


basta chamar mesmo 


Tenta com a conta real, para ver , eu to na real com o robo e nao posso testar agora ...

eu uso como indicador e nao como EA. 


meu EA se comunica com o indicador atraves do grafico, vendo as indicacoes de compra e venda dos indicadores,

depois vou testar pra ver se estas funcoes funcionam no EA. copyticks historico,...


caso nao funcione, faca isso crie um indicador de ajustes, e faca o teu EA ver a linha do ajuste


abc

Razão: