Neo traderBot

Neo traderBot

Você sabia?

Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!

leaf leftleaf right
Notifications
Clear all

[Solucionado] É possivel limitar plotagem por dias ?

16 Posts
2 Usuários
5 Reactions
504 Visualizações
(@toledox82)
Membro eminente
Registrou: 2 anos atrás
Posts: 17
Iniciador do tópico  

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.


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

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!


   
ToledoX82 reacted
ReplyCitar
(@toledox82)
Membro eminente
Registrou: 2 anos atrás
Posts: 17
Iniciador do tópico  

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

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

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!


   
ReplyCitar
(@toledox82)
Membro eminente
Registrou: 2 anos atrás
Posts: 17
Iniciador do tópico  

Perfeito, muito obrigado @admin depois manda seu pix pra te pagar um café =)
Valeu mesmo!!!


   
Johnathas reacted
ReplyCitar
(@toledox82)
Membro eminente
Registrou: 2 anos atrás
Posts: 17
Iniciador do tópico  

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

This post was modified 2 anos atrás by ToledoX82

   
ReplyCitar
(@toledox82)
Membro eminente
Registrou: 2 anos atrás
Posts: 17
Iniciador do tópico  

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


   
ReplyCitar
(@toledox82)
Membro eminente
Registrou: 2 anos atrás
Posts: 17
Iniciador do tópico  

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

 


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

@toledox82 

É só fazer o if dessa forma:

if ((not Replay) and ( Date >= CalcDate(CurrentDate, - Pregoes))
   or Replay
 then

   
ToledoX82 reacted
ReplyCitar
(@admin)
Membro Admin
Registrou: 3 anos atrás
Posts: 216
 

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!


   
ToledoX82 reacted
ReplyCitar
(@toledox82)
Membro eminente
Registrou: 2 anos atrás
Posts: 17
Iniciador do tópico  

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

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

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.


   
ReplyCitar
(@toledox82)
Membro eminente
Registrou: 2 anos atrás
Posts: 17
Iniciador do tópico  

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


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

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

   
ToledoX82 reacted
ReplyCitar
(@toledox82)
Membro eminente
Registrou: 2 anos atrás
Posts: 17
Iniciador do tópico  

@admin me perdoa.. agora entendi o codigo.. tinha lido mas acho que não tinha sacado a logica. Vou testar aqui valeu!


   
ReplyCitar
Página 1 / 2