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] Media movel, periodo personalizado

5 Posts
2 Usuários
1 Reactions
129 Visualizações
(@thiago)
Membro ativo
Registrou: 2 anos atrás
Posts: 4
Iniciador do tópico  

No gráfico é possível usar a opção de tempo personalizado, como seria possível programas para utilizar. Ver print


   
Citar
Marcadores do tópico
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

Oi @thiago!

Infelizmente não é possível fazer isso de forma plena em código fonte, pois a Nelógica precisaria refatorar as funções de média para que fosse informados a periodicidade e, de preferência, também o ativo (casos de estratégias com múltiplos ativos).

Assim, se você estiver utilizando uma estratégia em um gráfico de 15 minutos, não tem como você obter uma média de tempo gráfico menor (ex: 5 min). A situação contrária é possível contornar por código. A saber, se você estiver utilizando um tempo gráfico de 5 minutos, você poderia obter a média de tempos gráficos maiores (ex: 15 minutos, precisa ser um multiplo do tempo gráfico utilizado), bastaria algumas linhas de código.

Caso tenha interesse nesta segunda opção, é só falar que eu posso escrever como seria o código.

Abs!


   
ReplyCitar
(@thiago)
Membro ativo
Registrou: 2 anos atrás
Posts: 4
Iniciador do tópico  

Opa gostaria sim de saber como fazer, obg.


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

Fala @thiago!

     Um exemplo de código para "superamostrar" a execução de uma estratégia seria o que está abaixo. Acabei me surpreendendo com o trabalhinho que deu. Fiz um exemplo no qual eu faço as adaptações para calcular uma média de fechamento em tempo gráfico superior. Vou até incluir esse código na seção de snippets, pois achei que foi um exemplo interessante.

     A vantagem de superamostrar é que você pode dar mais tempestividade às suas ordens, tanto de abertura quanto encerramento, dependendo do caso.
     Sobre quando utilizar uma média equivalente ou a média calculada com o tempo gráfico original, aí fica a critério de cada um. Talvez não se justiifique o trabalho de programação tendo em vista que os valores são muito próximos. É mais fácil utilizar a média equivalente.

     Anexei uma imagem na qual você pode ver no lado esquerdo um gráfico de 3 minutos, com a média equivalente de 15 minutos de 20 períodos (seria média de 100 períodos no gráfico de 3 minutos - em linha branca pontilhada), bem como a média de 20 períodos de 15 minutos calculada dentro de um tempo gráfico de 3 minutos (em linha vermelha), via código fonte.

     No lado direito da imagem, você tem o mesmo ativo em tempo gráfico de 15 minutos, com a média de 20 períodos (em linha vermelha), bem como a média de 100 periodos no tempo gráfico de 3 minutos (usando a funcionalidade da interface gráfica de média que você perguntou inicialmente).

     Espero que a Nelogica em breve refatore as funções de indicadores para que acomodem essas necessidades de forma mais simplificada dentro do Editor de Estratégias.

 

Abs e boa programação!

//LIMITAÇÃO IMPORTANTE: Não dá para fazer em escala de segundos
//devido a função time não retornar segundos
const
  // Estratégia originalmente rodava em gráfico de 15 min
  cTempoGraficoOriginal = 15;
  //Qtde de periodos no tempo gráfico original  
  cQtdePeriodosMedia = 20;
  //Horario inicial de negociação do ativo
  //0900 para futuros, 1000 para mercado a vista
  cHoraInicioNegociacao = 0900;
var
  bStarted: boolean;

  iTempoGraficoAtual: integer;
  iQtdePeriodosEquivalente: integer;
  fMediaSuperAmostradaEquivalente: float;

  fInicializacaoMedia: float;
  fMediaTempoGraficoOriginal: float;
  iQtdePeriodosCalculados: integer;
  
  iHorarioEmMinutos: integer;
  iHorarioGrafSuperior: integer;
  bCalculouTempoGrafSuperior: boolean;

  iTeste: integer;
begin
  if Not bStarted then
  begin
    iHorarioGrafSuperior := CalcTime(Time,-Mod(iHorarioEmMinutos, cTempoGraficoOriginal));  
    bStarted := true;
  end;

  // Identifica tempo gráfico utilizado e qtde de periodos equivalente para média superamostrada
  iTempoGraficoAtual := GraphicOffset;
  iQtdePeriodosEquivalente := Floor(cTempoGraficoOriginal/iTempoGraficoAtual)*cQtdePeriodosMedia;
  //Amostrando apenas os valores de fechamento do Tempo gráfico original
  iHorarioEmMinutos := Floor(Time/100)*60+Mod(Time,100) 
                     - (Floor(cHoraInicioNegociacao/100)*60+Mod(cHoraInicioNegociacao,100));


  iTeste := CalcTime(Time,-Mod(iHorarioEmMinutos, cTempoGraficoOriginal));
  // Bloco para criar mecanismo de calcular apenas uma vez para o gráfico superior
  if (CalcTime(Time,-Mod(iHorarioEmMinutos, cTempoGraficoOriginal)) <> iHorarioGrafSuperior) then
  begin
    iHorarioGrafSuperior := CalcTime(Time,-Mod(iHorarioEmMinutos, cTempoGraficoOriginal));
    bCalculouTempoGrafSuperior := false;
  end;


  // Obtem média superamostrada equivalente
  fMediaSuperAmostradaEquivalente := Media(iQtdePeriodosEquivalente,Close);


  // Cálculo da média no tempo gráfico original
  if (Mod(iHorarioEmMinutos, cTempoGraficoOriginal) = 0) and Not bCalculouTempoGrafSuperior then
  begin
    bCalculouTempoGrafSuperior := true;
    if (iQtdePeriodosCalculados < cQtdePeriodosMedia) 
    then iQtdePeriodosCalculados := iQtdePeriodosCalculados + 1;

    if (iQtdePeriodosCalculados <= cQtdePeriodosMedia) then
    begin
      fInicializacaoMedia := fInicializacaoMedia + Close[1];
      fMediaTempoGraficoOriginal := fInicializacaoMedia/iQtdePeriodosCalculados;
      iQtdePeriodosCalculados := iQtdePeriodosCalculados + 1;
    end
    else
      fMediaTempoGraficoOriginal := (fMediaTempoGraficoOriginal*cQtdePeriodosMedia 
                                   - Close[1+cQtdePeriodosMedia*Floor(cTempoGraficoOriginal/iTempoGraficoAtual)]
                                   + Close[1])/cQtdePeriodosMedia;
  end;

  //Plot das séries para inspeção
  PlotN(1,fMediaSuperAmostradaEquivalente);
  SetPlotColor(1, clWhite);
  SetPlotWidth(1,2);
  SetPlotStyle(1, psDash);

  PlotN(2,fMediaTempoGraficoOriginal);
  SetPlotColor(2, clRed);
  SetPlotWidth(2,2);
  SetPlotStyle(2, psSolid);
    
end

   
thiago reacted
ReplyCitar
(@thiago)
Membro ativo
Registrou: 2 anos atrás
Posts: 4
Iniciador do tópico  

Valeu mestre aplicar aqui. abs


   
ReplyCitar