Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!
No gráfico é possível usar a opção de tempo personalizado, como seria possível programas para utilizar. Ver print
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!
Opa gostaria sim de saber como fazer, obg.
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
Valeu mestre aplicar aqui. abs