Um backtesting adequado deve buscar simular situações práticas do mercado (slippage, custo de operação, etc...)
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;
Tentei trocar onde a média toca por PaintBar mas não foi
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;
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;
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;
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;