Neo traderBot

Neo traderBot

Você sabia?

A NeoTraderBot é a primeira comunidade aberta no Brasil com foco em compartilhar informações sobre automatização de estratégias

leaf leftleaf right
Notifications
Clear all

[Solucionado] Diferentes tempos gráficos numa mesma estratégia.

17 Posts
3 Usuários
1 Reactions
361 Visualizações
(@jp-cavalcanti)
Membro ativo
Registrou: 2 anos atrás
Posts: 8
Iniciador do tópico  

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


   
Citar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

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!

 


   
ReplyCitar
(@jp-cavalcanti)
Membro ativo
Registrou: 2 anos atrás
Posts: 8
Iniciador do tópico  

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


   
ReplyCitar
(@sidneyrochagomes)
Membro ativo
Registrou: 2 anos atrás
Posts: 9
 

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.


   
ReplyCitar
(@sidneyrochagomes)
Membro ativo
Registrou: 2 anos atrás
Posts: 9
 

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).


   
ReplyCitar
(@jp-cavalcanti)
Membro ativo
Registrou: 2 anos atrás
Posts: 8
Iniciador do tópico  

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


   
ReplyCitar
(@jp-cavalcanti)
Membro ativo
Registrou: 2 anos atrás
Posts: 8
Iniciador do tópico  

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?

 


   
ReplyCitar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

Oi @sidneyrochagomes

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!


   
ReplyCitar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

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:

  • Em todo candle você vai salvar em uma variável fMaximaNoIntervalo o valor de Highest(High,12).
  • Assim você terá para cada instante a máxima da última hora.
  • Se no candle de encerramento da hora no TF de 5 minutos, você quiser a máxima da hora atual basta acessar o valor da variável fMaximaNoIntervalo;
  • Se você quiser a máxima da hora anterior, estando no candle de encerramento da hora no TF de 5 minutos, bastaria acessar a variável fMaximaNoIntervalo[12].

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!


   
ReplyCitar
(@jp-cavalcanti)
Membro ativo
Registrou: 2 anos atrás
Posts: 8
Iniciador do tópico  

@admin, Obrigado John!  abraço JP


   
ReplyCitar
(@sidneyrochagomes)
Membro ativo
Registrou: 2 anos atrás
Posts: 9
 

@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.


   
ReplyCitar
(@sidneyrochagomes)
Membro ativo
Registrou: 2 anos atrás
Posts: 9
 

@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?


   
ReplyCitar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

@sidneyrochagomes Nesse caso, não seria mais fácil apenas rodar na série contínua? WINFUT ou WDOFUT?


   
ReplyCitar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

 

@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!


   
ReplyCitar
(@sidneyrochagomes)
Membro ativo
Registrou: 2 anos atrás
Posts: 9
 

Postado por: @admin

@sidneyrochagomes Nesse caso, não seria mais fácil apenas rodar na série contínua? WINFUT ou WDOFUT?


Nao entendi bem a tua pergunta. Quero fazer um robô que opere com maximas e minimas do tempo grafico de 15 minutos e que realize ordens no toque na média. já está praticamente tudo ok( seguindo teu video de toque e proximidade, porém depois que ele toca na média, ele so entra na operação no fechamento do candle. Uma Solução seria operar no grafico de 1 minuto quando ele fechar o candle, antes de ter tocado nas medias, já que o canal é relativamente mais largo, enviar ordens limits de compra e venda na média do grafico de 15 minutos. Por isso a questão de rodar em 1 minuto e ter como parametro medias do tempo grafico de 15 minutos.

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.

 


   
ReplyCitar
Página 1 / 2