Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!
Fala pessoal beleza?
Escrevi um indicador simples pra plotar algumas variações percentuais, porém ele faz a plotagem infinita como se fosse uma media movel então como são mais de 10 plots da pra ver que processa muito e não precisaria disso tudo.
Pensei em colocar um input Dias pro usuario poder inseriar 3, 5 algo assim e a plotagem ficar limitada.
Tentei fazer de diversas formas usando
currentDate - Dias
algo nessa lógica que seria simples em alguma outra linguagem mas não consegui de jeito nenhum.
Alguém poderia me ajudar? Pago um café ou uma cerveja =)
Outra dúvida, o indicador nativo Prior Cote, tem um checkbox para limitarmos o indicador pro Último Dia, é possivel fazer isso no NTSL, digo usar essa função de Último Dia? Como na imagem abaixo.
Oi @toledox82!
Você pode usar a função CalcDate(Date,-nDias) para criar uma condição para calcular e plotar seus indicadores, por exemplo:
if Date >= CalcDate(Date,-nDias) then begin //Calcula e plota os valores end;
Caso os cálculos dependam apenas de dados de dias anteriores e o plot não vai se alterar pelo resto do dia, eu sugiro ainda conciliar sua lógica para calcular o valor apenas na primeira barra do dia (poderia ser até no primeiro tick da primeira barra) e apenas plotar os valores calculados e salvos nesse momento. Isso reduziria o processamento de sua estratégia.
Identificação do primeiro candle do dia: link do snippet
Identificação do primeiro tick da barra: link do snippet
Grande abs!
@admin Na verdade eu uso o próprio PriorCote.
Tentei fazer com essa lógica mas parece que ele ignora e plota muito mais que 3 dias por exemplo que coloquei de input, veja no anexo.. ideal era ver 3 dias no maximo.
input Base(4); Dias(3); var nIndex: Integer; begin if Date >= CalcDate(Date,-Dias) then begin Plot(PriorCote(Base)); SetPlotColor(1, RGB(255, 0, 255)); SetPlotStyle(1, 0); Plot7(Round2Fraction(PriorCote(Base) + (PriorCote(Base) * 0.5 / 100))); Plot6(Round2Fraction(PriorCote(Base) + (PriorCote(Base) * 1 / 100))); Plot5(Round2Fraction(PriorCote(Base) + (PriorCote(Base) * 1.5 / 100))); Plot4(Round2Fraction(PriorCote(Base) + (PriorCote(Base) * 2 / 100))); Plot3(Round2Fraction(PriorCote(Base) + (PriorCote(Base) * 2.5 / 100))); Plot2(Round2Fraction(PriorCote(Base) + (PriorCote(Base) * 3 / 100))); Plot8(Round2Fraction(PriorCote(Base) - (PriorCote(Base) * 0.5 / 100))); Plot9(Round2Fraction(PriorCote(Base) - (PriorCote(Base) * 1 / 100))); Plot10(Round2Fraction(PriorCote(Base) - (PriorCote(Base) * 1.5 / 100))); Plot11(Round2Fraction(PriorCote(Base) - (PriorCote(Base) * 2 / 100))); Plot12(Round2Fraction(PriorCote(Base) - (PriorCote(Base) * 2.5 / 100))); Plot13(Round2Fraction(PriorCote(Base) - (PriorCote(Base) * 3 / 100))); for nIndex := 2 to 13 do begin SetPlotColor(nIndex, RGB(0, 188, 212)); SetPlotStyle(nIndex, 0); end; SetPlotWidth(2, 2); SetPlotWidth(4, 2); SetPlotWidth(6, 2); SetPlotWidth(9, 2); SetPlotWidth(11, 2); SetPlotWidth(13, 2); end; end;
Opa @toledox82!
Desculpe, é que foi um erro meu na resposta...tente isso:
if Date >= CalcDate(CurrentDate,-nDias) then begin //Calcula e plota os valores end;
Abs!
@admin, precisava fazer um ajuste.
Qual seria a forma de colocar no codigo uma verificação se é replay ou não. Caso for replay preciso "pular" um if que tenho.. pq o if justamente é o lance de plotar em Dias anteriores, ai no caso de replay o indicador simplesmente não funciona rs.
A intervenção poderia ser logo no começo.. pensei em usar um Input Replay boolean.
Mas estou com dificuldade na lógica exemplo.
input Base(4); Variacao(0.5); Niveis(6); Pregoes(3); BaseAlternativa(FALSE); Replay(FALSE); var i : Integer; begin if Date >= CalcDate(CurrentDate, - Pregoes) then begin
Precisava fazer algo tipo se Replay TRUE ignora esse if da data, se FALSE ai entra com o if da data.
Pq senão teria que duplicar todo o código, ou teria outra forma?
Obrigado.
@admin, mais um detalhe que encontrei.. parece que esse lance de limitar numero de pregoes não funciona muito bem, exemplo quando coloca valor 1 em pregoes, alguns dias da semana ele plota correto apenas no dia o indicador, mas outros dias da semana plota mais mesmo com o valor 1 a sensação que tenho é que precisaria fazer algo baseado em dias da semana.
Faz sentido? Loucura ne?
@admin última dúvida.. consigo usar o DecisionPoints e fazer um for each pra ele rodar a função pra cada dia?
Usando ele hoje.. os valores ficam do último dia de pregão.
Ai pensei que se usar algo tipo for each day.. ele poderia plotar por dia.
Faz sentido é possível?
É só fazer o if dessa forma:
if ((not Replay) and ( Date >= CalcDate(CurrentDate, - Pregoes)) or Replay then
Boa noite @toledox82!
É necessário compreender como seu código é processado para entender as restrições que poderiam se aplicar ao que deseja. Talvez se você assistir a esse vídeo isso te ajude a organizar melhor o seu modelo mental.
Abs!
@admin muito bom o vídeo deu pra ter uma noção de algumas coisas que não sabia...
segue meu código completo.
Voce vai notar que dupliquei o codigo para o Replay = TRUE para poder tirar o IF do date. Acredito que deve ter uma forma melhor de fazer isso sem duplicar todo o codigo.
Alem disso o lance do Date é como te falei, se vc colocar o input Pregoes 1 as vezes funciona, as vezes some.. é como se nao respeitasse a quantidade de pregoes. Talvez a logica do IF date esteja errada.
input Base(4); Variacao(0.5); Niveis(6); Pregoes(3); BaseAlternativa(FALSE); Replay(FALSE); var i : Integer; begin if Replay = FALSE then begin if Date >= CalcDate(CurrentDate, - Pregoes) then begin if BaseAlternativa = FALSE then begin PlotN(Niveis * 2 + 1,PriorCote(Base)); SetPlotColor(Niveis * 2 + 1,RGB(255,0,255)); SetPlotStyle(Niveis * 2 + 1,0); for i := 1 to Niveis do begin PlotN(i,Round2Fraction(PriorCote(Base) + (PriorCote(Base) * (Variacao * i) / 100))); SetPlotColor(i,RGB(0,188,212)); SetPlotStyle(i,0); if MOD( i, 2) = 0 then SetPlotWidth(i,2); end; for i := 1 to Niveis do begin PlotN(Niveis + i,Round2Fraction(PriorCote(Base) - (PriorCote(Base) * (Variacao * i) / 100))); SetPlotColor(Niveis + i,RGB(0,188,212)); SetPlotStyle(Niveis + i,0); if MOD( i, 2) = 0 then SetPlotWidth(Niveis + i,2); end; end; if BaseAlternativa = TRUE then begin PlotN(Niveis * 2 + 1,Base); SetPlotColor(Niveis * 2 + 1,RGB(255,0,255)); SetPlotStyle(Niveis * 2 + 1,0); for i := 1 to Niveis do begin PlotN(i,Round2Fraction(Base + (Base * (Variacao * i) / 100))); SetPlotColor(i,RGB(0,188,212)); SetPlotStyle(i,0); end; for i := 1 to Niveis do begin PlotN(Niveis + i,Round2Fraction(Base - (Base * (Variacao * i) / 100))); SetPlotColor(Niveis + i,RGB(0,188,212)); SetPlotStyle(Niveis + i,0); end; end; end; end; if Replay = TRUE then begin if BaseAlternativa = FALSE then begin PlotN(Niveis * 2 + 1,PriorCote(Base)); SetPlotColor(Niveis * 2 + 1,RGB(255,0,255)); SetPlotStyle(Niveis * 2 + 1,0); for i := 1 to Niveis do begin PlotN(i,Round2Fraction(PriorCote(Base) + (PriorCote(Base) * (Variacao * i) / 100))); SetPlotColor(i,RGB(0,188,212)); SetPlotStyle(i,0); if MOD( i, 2) = 0 then SetPlotWidth(i,2); end; for i := 1 to Niveis do begin PlotN(Niveis + i,Round2Fraction(PriorCote(Base) - (PriorCote(Base) * (Variacao * i) / 100))); SetPlotColor(Niveis + i,RGB(0,188,212)); SetPlotStyle(Niveis + i,0); if MOD( i, 2) = 0 then SetPlotWidth(Niveis + i,2); end; end; if BaseAlternativa = TRUE then begin PlotN(Niveis * 2 + 1,Base); SetPlotColor(Niveis * 2 + 1,RGB(255,0,255)); SetPlotStyle(Niveis * 2 + 1,0); for i := 1 to Niveis do begin PlotN(i,Round2Fraction(Base + (Base * (Variacao * i) / 100))); SetPlotColor(i,RGB(0,188,212)); SetPlotStyle(i,0); end; for i := 1 to Niveis do begin PlotN(Niveis + i,Round2Fraction(Base - (Base * (Variacao * i) / 100))); SetPlotColor(Niveis + i,RGB(0,188,212)); SetPlotStyle(Niveis + i,0); end; end; end; end;
Não deve funcionar em dias como segunda-feira ou dias de feriado. Você terá que adaptar seu código nesses casos. Se for segunda-feira (deve ter função de dia da semana), você precisa considerar (Pregoes + 2) dias anteriores.
@admin é essa parte dos dias já ficou ok.. sendo pregoes entao sabado e domingo realmente ele "some" com 2 dias sem problemas.
Quanto a parte do Replay vc viu que duplico o codigo só pra pular o if de Date?
Qual seria uma forma de otimizar o codigo pra precisar duplicar ? Quebrei a cabeça aqui mas não consegui.
A idéia é que se Replay for true ele plota barra a barra, senão ele respeita o numero de pregões la.
Faz sentido, tem como otimizar isso pra evitar duplicar o codigo?
Oi @toledox82! Eu já tinha te falado a resposta.
Eu escreveria o if conforme abaixo, assim você não precisa duplicar o código:
if ((not Replay) and ( Date >= CalcDate(CurrentDate, - Pregoes)) or Replay then