- Recursos da versão da Web - MetaTrader 5
- Modificação de uma Posição - Negociação - MetaTrader 5 para iPhone
- Proteção adicional de programa (MQL5 Protector) - Desenvolvimento de programas
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) );
- www.mql5.com
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.
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.
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.
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.
- www.mql5.com
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!
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
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); } } //+------------------------------------------------------------------+
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);
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
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso