A NeoTraderBot é a primeira comunidade aberta no Brasil com foco em compartilhar informações sobre automatização de estratégias
Olá Turma!, Olá @Johnathas, parabéns pelo trabalho! passei a seguir ha uma semana e já estou Fan!
Alguem já conseguiu fazer uma estratégia rodando no gráfico de 5 min utilizar médias calculadas no gráfico de 60 min?
Abraço
JP
Seja bem vindo @jp-cavalcanti! Que bom que gostou da Comunidade!
Respondendo a sua pergunta, é possível fazer o que deseja de duas formas.
1) Calculando a quantidade equivalente de períodos da média do timeframe maior que deseja. Por exemplo, uma média de 10 períodos em um tempo gráfico de 60 minutos incorpora 600 minutos de dados. Se você estiver em um tempo gráfico de 5 minutos, poderia fazer uma média de 600/5 = 120 períodos para ter um valor aproximado.
A vantagem dessa primeira solução é a facilidade de programação. A desvantagem é que a média com muitos períodos fica muito suavizada e pode demorar para refletir mudanças, tendo em vista que a média nos 60 minutos iria ter apenas 10 valores e, portanto, capaz de responder mais rapidamente à flutuações.
2) Você pode buscar apenas os valores de fechamento de hora e calcular a média por código. Dá um pouco mais de trabalho na programação. Seria algo do tipo:
input pQtdePeriodosMedia60min(3); pCalculoContinuo(false); var fMedia60min: float; iIterador: integer; begin if pCalculoContinuo then begin fMedia60min := Close; for iIterador := 1 to pQtdePeriodosMedia60min-1 do begin fMedia60min := fMedia60min + Close[Round(pQtdePeriodosMedia60min*12)]; end; fMedia60min := fMedia60min/pQtdePeriodosMedia60min; plot(fMedia60min); end else begin if Mod(Time,100) = 55 then begin //Último candle antes de iniciar uma nova hora no TF de 5 min fMedia60min := Close; for iIterador := 1 to pQtdePeriodosMedia60min-1 do begin fMedia60min := fMedia60min + Close[Round(iIterador*12)]; end; fMedia60min := fMedia60min/pQtdePeriodosMedia60min; plot(fMedia60min); end else begin fMedia60min := fMedia60min[1]; plot(fMedia60min); end; end; end
O código está fixo para utilização em TF de 5 min. Caso queira mudar para funcionar em qualquer TF teria que adaptar os indexadores. Esse código tem um parâmetro de pCalculoContinuo. Se for false, será calculada média de 60 minutos apenas no fechamento de hora. Se for true, irá calcular a média dos preços de fechamento dos candles por hora para cada candle de 5 min. Ex: se for uma média de 3 periodos de 60 min, iria-se buscar 3 preços de fechamento [agora - 1 hora], [agora - 2 horas] e [agora - 3 horas].
Observe que ainda assim, você nunca irá obter o mesmo valor que calcular a média em um gráfico de 60 minutos. Ao incluir em um gráfico de 5 min, uma média de 60 minutos, observe que os valores são interpolados e buscam valores de fechamento no futuro para fechar a conta. Mas os valores são muito próximos.
Espero que tenha ajudado.
Abs!
Perfeito John! Obrigado pelo retorno.
Já tinha tentado a primeira Opção, mas percebi que os valores ficavam um poucos diferentes da media calculada no tempo gráfico superior. A segunda opção deve resolver.
Obrigado e abraço
JP
Eu sou mais um fã desse trabalho do Jhon. Estou tentando fazer o calculo da média das máximas dos últimos 10 perodos de um gráfico de 15 ou 5 minutos e usar em um gráfico de 1 minuto. Testando tudo que o jhon ta sugerindo.
olá pessoal,
copiei e executei exatamente o código do snippet que o jhon trabalhou no vídeo sobre superamostragem ( https://youtu.be/M947bev9l0w ) e teve algum problema da média calculada vermelha da segunda forma, nao funcionando como no final do vídeo. Vou postar aqui o print do resulado para podermos avaliar o que pode ter ocorrido (me parece que está acumulando os incrementos de valores ao invés de fazer a média).
Caros @sidneyrochagomes e @Johnathas,
também estou tentando fazer o mesmo com um canal de médiasexp de máximas e mínimas num tempo gráfico superior. Sendo que, diferentemente do valor do fechamento que podemos pegar no ultimo candle de uma hora no gráfico de 5 min, os máximos e mínimos ocorrem ao longo da hora ... estou tentando fazer com a função HighestHigh e LowestLow. O problema que estou enfrentando agora é que para essas funções (Highesthigh / Lowestlow) não podemos fazê-las buscar de [13] a [25] ... sempre partem do [0] .... Já conseguiu evoluir nessa ideia @sidneyrochagomes?
Abraço
JP
Aqui um teste:
INPUT Period_Media60min(3); VAR MME_High60min : float; MME_Low60min : float; BEGIN if Mod(Time,100) = 55 then BEGIN //Último candle antes de iniciar uma nova hora no TF de 5 min MME_High60min[2] := MME_High60min[1]; MME_High60min[1] := MME_High60min[0]; MME_High60min[0] := Highest(High,12); PLOT(MediaExp(Period_Media60min,MME_High60min)); MME_Low60min[2] := MME_Low60min[1]; MME_Low60min[1] := MME_Low60min[0]; MME_Low60min[0] := Lowest(Low,12); PLOT2(MediaExp(Period_Media60min,MME_Low60min)); END ELSE BEGIN MME_High60min[0] := MME_High60min[1]; PLOT(MME_High60min[0]); MME_Low60min[0] := MME_Low60min[1]; PLOT2(MME_Low60min[0]); END; END {
coloquei também uma imagem anexa ...que acham?
Cara, eu vi aqui o caso no qual aplicou e o problema está na série de dados do Profit. Vá para os candles iniciais da série WDOH23 e você verá que o tempo dos candles não está seguindo de 3 em 3 minutos, conforme esperado. Isso atrapalhou o código escrito que pressupõe que uma vez em um tempo gráfico de X minutos os candles terão horário de início de X em X minutos.
Se você colocar no ativo WDOFUT verá que o código roda sem problemas.
Grande abs!
Boa noite, @jp-cavalcanti!
Não entendi muito bem em qual intervalo deseja as máximas e mínimas...Entendi o que você disse que as máximas e mínimas ocorrem ao longo da hora.
Assim, vou te falar para onde acho que a sua solução deve caminhar para que trabalhe com os indexadores corretos.
Realmente não tem como fazer Highest(high, "entre 13 a 25"), mas você pode utilizar de um artifício para fazer a mesma coisa:
Observe que com indexadores na variavel fMaximaNoIntervalo é como se você estivesse pegando o Highest(High,"entre 13 e 25").
Espero que isso te ajude no desenvolvimendo do seu código.
Grande abs!
@admin exatamente. Seria possivel colocar para que o codigo considere apenas a partir de certa data, tipo 10 dias atrás e assim nao ter esse problema com o candles muito antigos? Qual seria esse comando?
pergunto, pois nao me preocupo com o backtest, preciso mesmo é rodar em simulador por um período pra saber se o codigo está processando conforme planejado.
@admin Acho que essa é uma boa solução para o grafico de 5 minutos, aplicando medias de 1 hora, visto que o resto da função mod vai ser sempre 55 quando vc quiser pegar o candle de encerramento. No caso de eu querer rodar em 1 minuto ccom medias de 10 periodos do grafico de 15 minutos, fiquei um pouco confuso de como encontrar um codigo que remeta aos minutos 15, 30, 45 e 60. Alguma sugestão?
@sidneyrochagomes Nesse caso, não seria mais fácil apenas rodar na série contínua? WINFUT ou WDOFUT?
@sidneyrochagomes Você só precisa mudar os cálculos de indexação e os candles que serão calculados.
Para calcular apenas nos fechamentos de 15 minutos, você precisa capturar os preços de fechamentos dos candles que iniciam nos minutos 14, 29, 44, e 59. Logo precisaria mudar essa linha:
if Mod(Time,100) = 55 then
para
if (Mod(Time,100) = 14) or (Mod(Time,100) = 29) or (Mod(Time,100) = 44) or (Mod(Time,100) = 59) then
e os indexadores precisariam ao invés de multiplicar por 12, multiplicar por 15. Pense, por exemplo, se estiver no candle que inicia no minuto 14, para pegar o fechamento do candle que encerra às 00 minutos, você precisaria voltar 15 candles (precisaria pegar o candle que iniciou aos 59 minutos da hora anterior).
//Último candle antes de iniciar uma nova hora no TF de 5 min fMedia15min := Close; for iIterador := 1 to pQtdePeriodosMedia15min-1 do begin fMedia15min := fMedia15min + Close[Round(iIterador*15)]; end; fMedia15min := fMedia15min/pQtdePeriodosMedia15min; plot(fMedia15min);
Pegou a ideia? Tem hora que tem que contar nos dedos mesmo...kkkk!
Abs!
Postado por: @admin@sidneyrochagomes Nesse caso, não seria mais fácil apenas rodar na série contínua? WINFUT ou WDOFUT?
Pensei, mas sem sucesso de execução, em criar um contador de 15 candles, pegar o highest desse 15 e usar para mazer a média. Meu problema está principalemente em pegar os proximos 15 candles e nao usar as maximas dos candles anteriores já verificados.