Neo traderBot

Neo traderBot

Você sabia?

Um backtesting adequado deve buscar simular situações práticas do mercado (slippage, custo de operação, etc...)

leaf leftleaf right
Notifications
Clear all

[Solucionado] Transforma indicador em regra de coloração

6 Posts
3 Usuários
1 Reactions
145 Visualizações
(@daniel)
Membro ativo
Registrou: 2 anos atrás
Posts: 4
Iniciador do tópico  
const
  // Define o percentual que caracteriza o toque
  // Se for igual a zero, a barra tem conter a média
  // Ex: se cPercProximidade = 0.5, define como toque se
  // preço chegar a 0.5% ou menos de distância da média
  cPercProximidade = 0.0;
var
  fMedia: float;
  bTocouMedia: boolean;


function NTB_ArredondarFloat(Value: float; nCasas: integer):float;
var
    fValor: float;
    fParteInteira: float;
    fParteDecimal: float;
begin
  fValor := Value;
  fParteInteira := IntPortion(fValor);
  fParteDecimal := Round((fValor - fParteInteira)*Power(10,nCasas));

  Result := fParteInteira + fParteDecimal/Power(10,nCasas);

end;

begin
  bTocouMedia := false;
  fMedia :=  NTB_ArredondarFloat(Media(20,Close),2);

  //Plot apenas para visualizar graficamente o funcionamento
  //do código
  Plot(fMedia);
  SetPlotColor(1,clRed);
  SetPlotWidth(1,2);
  if (cPercProximidade <> 0) then
  begin
    Plot2(NTB_ArredondarFloat(fMedia*(1 + cPercProximidade/100),2));
    Plot3(NTB_ArredondarFloat(fMedia*(1 - cPercProximidade/100),2));
    SetPlotColor(2, clGray);
    SetPlotColor(3, clGray);
  end;


  //Proteção para os primeiros períodos de backtesting
  //Quando pode ocorrer divisão por zero
  if fMedia <> 0 then
  begin

    // Situação em que a media está no meio da barra
    if (fMedia >= Low) and (fMedia <= High)
    then bTocouMedia := True;

    // Situação em que a media está abaixo do preço
    // negociado e este chegou a cPercProximidade da
    // média
    if (fMedia < Low)
    and (((Low - fMedia)/fMedia*100) <= cPercProximidade)
    then
    begin
      bTocouMedia := True;
    end;

    // Situação em que a media está abaixo do preço
    // negociado e este chegou a cPercProximidade da
    // média
    if (fMedia > High)
    and (((fMedia - High)/High*100) <= cPercProximidade)
    then
    begin
    bTocouMedia := True;
    end;

   if bTocouMedia then
     PlotText("Tocou",clWhite, - 1,8);

  end;

end;

 


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

Tentei trocar onde a média toca por PaintBar mas não foi


   
ReplyCitar
masker
(@masker)
Membro confiável
Registrou: 2 anos atrás
Posts: 41
 
const
  // Define o percentual que caracteriza o toque
  // Se for igual a zero, a barra tem conter a média
  // Ex: se cPercProximidade = 0.5, define como toque se
  // preço chegar a 0.5% ou menos de distância da média
  cPercProximidade = 0.0;
var
  fMedia: float;
  bTocouMedia: boolean;


function NTB_ArredondarFloat(Value: float; nCasas: integer):float;
var
    fValor: float;
    fParteInteira: float;
    fParteDecimal: float;
begin
  fValor := Value;
  fParteInteira := IntPortion(fValor);
  fParteDecimal := Round((fValor - fParteInteira)*Power(10,nCasas));

  Result := fParteInteira + fParteDecimal/Power(10,nCasas);

end;

begin
  bTocouMedia := false;
  fMedia :=  NTB_ArredondarFloat(Media(20,Close),2);

  //Plot apenas para visualizar graficamente o funcionamento
  //do código
  Plot(fMedia);
  SetPlotColor(1,clRed);
  SetPlotWidth(1,2);
  if (cPercProximidade <> 0) then
  begin
    Plot2(NTB_ArredondarFloat(fMedia*(1 + cPercProximidade/100),2));
    Plot3(NTB_ArredondarFloat(fMedia*(1 - cPercProximidade/100),2));
    SetPlotColor(2, clGray);
    SetPlotColor(3, clGray);
  end;


  //Proteção para os primeiros períodos de backtesting
  //Quando pode ocorrer divisão por zero
  if fMedia <> 0 then
  begin

    // Situação em que a media está no meio da barra
    if (fMedia >= Low) and (fMedia <= High)
    then bTocouMedia := True;

    // Situação em que a media está abaixo do preço
    // negociado e este chegou a cPercProximidade da
    // média
    if (fMedia < Low)
    and (((Low - fMedia)/fMedia*100) <= cPercProximidade)
    then
    begin
      bTocouMedia := True;
    end;

    // Situação em que a media está abaixo do preço
    // negociado e este chegou a cPercProximidade da
    // média
    if (fMedia > High)
    and (((fMedia - High)/High*100) <= cPercProximidade)
    then
    begin
    bTocouMedia := True;
    end;

   if bTocouMedia then
   begin
     PlotText("Tocou",clWhite, - 1,8);
     PaintBar(clPurple);
     end;
  end;

end;

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

@masker 

Opa, muito obrigado meu caro.

No caso em questão eu queria no momento em que toca na média, segue o exemplo abaixo.

A media abaixo do preço eu quero colorir nesse exato momento.

if (fMedia < Low)
and (((Low - fMedia)/fMedia*100) <= cPercProximidade)
then
begin
PaintBar(clPurple);
end;

 

if (fMedia < Low)
and (((Low - fMedia)/fMedia*100) <= cPercProximidade)
then
begin
PaintBar(clseilá);
end;

 

This post was modified 2 anos atrás by Daniel

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

Dessa forma que eu fiz, basicamente troquei onde estava tocou e botei paint e tire ; do end e pus else 

 

const
  // Define o percentual que caracteriza o toque
  // Se for igual a zero, a barra tem conter a média
  // Ex: se cPercProximidade = 0.5, define como toque se
  // preço chegar a 0.5% ou menos de distância da média
  cPercProximidade = 0.0;
var
  fMedia: float;
  bTocouMedia: boolean;


function NTB_ArredondarFloat(Value: float; nCasas: integer):float;
var
    fValor: float;
    fParteInteira: float;
    fParteDecimal: float;
begin
  fValor := Value;
  fParteInteira := IntPortion(fValor);
  fParteDecimal := Round((fValor - fParteInteira)*Power(10,nCasas));

  Result := fParteInteira + fParteDecimal/Power(10,nCasas);

end;

begin
  bTocouMedia := false;
  fMedia :=  NTB_ArredondarFloat(Media(20,Close),2);

  //Plot apenas para visualizar graficamente o funcionamento
  //do código
  Plot(fMedia);
  SetPlotColor(1,clRed);
  SetPlotWidth(1,2);
  if (cPercProximidade <> 0) then
  begin
    Plot2(NTB_ArredondarFloat(fMedia*(1 + cPercProximidade/100),2));
    Plot3(NTB_ArredondarFloat(fMedia*(1 - cPercProximidade/100),2));
    SetPlotColor(2, clGray);
    SetPlotColor(3, clGray);
  end;


  //Proteção para os primeiros períodos de backtesting
  //Quando pode ocorrer divisão por zero
  if fMedia <> 0 then
  begin

    // Situação em que a media está no meio da barra
    if (fMedia >= Low) and (fMedia <= High)
    then bTocouMedia := True;

    // Situação em que a media está abaixo do preço
    // negociado e este chegou a cPercProximidade da
    // média
    if (fMedia < Low)
    and (((Low - fMedia)/fMedia*100) <= cPercProximidade)
    then
    begin

      PaintBar (seilá) // AREA MODIFICADA
 
    end // AREA MODIFICADA

    // Situação em que a media está abaixo do preço
    // negociado e este chegou a cPercProximidade da
    // média

    else // AREA MODIFICADA

    if (fMedia > High)
    and (((fMedia - High)/High*100) <= cPercProximidade)
    then
    begin
    PaintBar (seilá) // AREA MODIFICADA

    end // AREA MODIFICADA

 
    else // AREA MODIFICADA

   if bTocouMedia then
     PlotText("Tocou",clWhite, - 1,8);

  end;

end;

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

Oi Daniel!

Talvez você não tenha entendido como o código funciona. Caso não tenha assistido, sugiro assistir ao vídeo do snippet.

O código que está utilizando considera a aproximação da média e do preço de fechamento em termos percentuais.

Se a constante cPercProximidade for igual a zero, então vai sinalizar o toque apenas quando a média estiver dentro do candle. Assim, os seus ajustes nunca seriam vistos, porque você modificou as condições erradas.

Fiz uma alteração na constante para 0,5%, de tal forma que você visualize no gráfico o faixa de próximidade da média, bem como as situações de toque por baixo, por cima ou dentro do candle. Ocódigo segue abaixo.

 

Abs!

 

const
  // Define o percentual que caracteriza o toque
  // Se for igual a zero, a barra tem conter a média
  // Ex: se cPercProximidade = 0.5, define como toque se
  // preço chegar a 0.5% ou menos de distância da média
  cPercProximidade = 0.2;
var
  fMedia: float;
  bTocouMedia: boolean;


function NTB_ArredondarFloat(Value: float; nCasas: integer):float;
var
    fValor: float;
    fParteInteira: float;
    fParteDecimal: float;
begin
  fValor := Value;
  fParteInteira := IntPortion(fValor);
  fParteDecimal := Round((fValor - fParteInteira)*Power(10,nCasas));

  Result := fParteInteira + fParteDecimal/Power(10,nCasas);

end;

begin
  bTocouMedia := false;
  fMedia :=  NTB_ArredondarFloat(Media(20,Close),2);

  //Plot apenas para visualizar graficamente o funcionamento
  //do código
  Plot(fMedia);
  SetPlotColor(1,clRed);
  SetPlotWidth(1,2);
  if (cPercProximidade <> 0) then
  begin
    Plot2(NTB_ArredondarFloat(fMedia*(1 + cPercProximidade/100),2));
    Plot3(NTB_ArredondarFloat(fMedia*(1 - cPercProximidade/100),2));
    SetPlotColor(2, clGray);
    SetPlotColor(3, clGray);
  end;


  //Proteção para os primeiros períodos de backtesting
  //Quando pode ocorrer divisão por zero
  if fMedia <> 0 then
  begin

    // Situação em que a media está no meio da barra
    if (fMedia >= Low) and (fMedia <= High) then 
    begin
      bTocouMedia := True;
      PaintBar(clYellow);
    end;

    // Situação em que a media está abaixo do preço
    // negociado e este chegou a cPercProximidade da
    // média
    if (fMedia < Low)
    and (((Low - fMedia)/fMedia*100) <= cPercProximidade)
    then
    begin
      bTocouMedia := true;
      PaintBar (clred); // AREA MODIFICADA
    end // AREA MODIFICADA

    // Situação em que a media está abaixo do preço
    // negociado e este chegou a cPercProximidade da
    // média

    else // AREA MODIFICADA

    if (fMedia > High)
    and (((fMedia - High)/High*100) <= cPercProximidade)
    then
    begin
      bTocouMedia := true;
      PaintBar (clGreen); // AREA MODIFICADA
    end; // AREA MODIFICADA

   if bTocouMedia then
     PlotText("Tocou",clWhite, - 1,8);
  end;

end;

   
masker reacted
ReplyCitar