Um backtesting adequado deve buscar simular situações práticas do mercado (slippage, custo de operação, etc...)
boa tarde, estou tentando aproveitar o codigo do indicador topos e fundos para plotar no gráfico de uma forma diferente, somente linhas horizontais no topo e fundo conforme figura em anexo.
também gostaria de criar uma regra de coloração com o mesmo codigo, para quando o candle cruzasse para cima o ultimo topo este ficaria verde e quando cruzasse o ultimo fundo, esse ficaria vermelho.
alguém poderia me ajudar?
// ####################################################################### // ####################################################################### // ####################################################################### // ###### O ####### // ###### ____|____ ####### // ###### _| |_ ####### // ###### (_| O O |_) ####### // ###### |_________| ####### // ###### ####### // ###### ____ __ ____________ ________ ####### // ###### | | \ | | | |_________| / ____ \ ####### // ###### | |\ \ | | | | / / \ \ ####### // ###### | | \ \ | | | |____ | | | | ####### // ###### | | \ \ | | | |____| | | | | ####### // ###### | | \ \ | | | |____| | | | | ####### // ###### | | \ \ | | | | | | | | ####### // ###### | | \ \ | | | |_________ \ \____/ / ####### // ###### |_| \_\|_| |_|_________| \________/ ####### // ###### ####### // ###### _______ __ __ ____ __ ___ __ _______ ####### // ###### | | \ /\ | \ | | \ | \ / \ | ####### // ###### | |__/ /__\ | ||__ |__/ |___/ | | | ####### // ###### | |\ / \ | || |\ | \ | | | ####### // ###### | | \ / \|__/ |____ | \ |___/ \__/ | ####### // ###### ####### // ###### Comunidade aberta de automatização de estratégias para ####### // ###### negociação de ativos ####### // ###### ####### // ###### www.NeoTraderBot.com ####### // ####################################################################### // ####################################################################### // ####################################################################### // // ----------------------------------------------------------------------- // ---------------------- DADOS DA ESTRATÉGIA ---------------------------- // ----------------------------------------------------------------------- // // NOME DA ESTRATÉGIA: _NBT_EXE_3CROSS // DESENVOLVIDA POR: Johnathas Araujo de Carvalho // DATA DE CRIAÇÃO: 16/09/2022 // VERSÃO: 3.0 // ATUALIZADA EM: 12/11/2022 // TIPO DE ESTRATÉGIA: ( ) Indicador ( ) Coloração (X) Execução // ( ) Screening ( ) Texto ( ) Alarme // // DESCRIÇÃO DA ESTRATÉGIA: // Esta estratégia visa realizar compras mediante o cruzamento triplo // de médias móveis exponenciais. // // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // // ######################### FIM DO CABEÇALHO ############################ // // // ----------------------------------------------------------------------- // -------------------------- Constantes --------------------------------- // OBS: // ----------------------------------------------------------------------- const cPlotarIndicadores = true; cProtecaoGap = 101.5; // // --------------------------------------------------------------------- // -------------------------- Parâmetros ------------------------------- // OBS: Segue abaixo a descriação de cada parâmetro // 1) pLimiteSobreComprado -> Limite no qual considera-se que o cruzamento // para baixo gere uma operação de venda // 2) pLimiteSobreVendido -> Limite no qual considera-se que o cruzamento // para cima gere uma operação de compra // 3) pTamanhoPosicao -> Tamanho da exposição ao ativo // --------------------------------------------------------------------- //input // pMediaRapida(10); // pMediaIntermediaria(50); // pMediaLenta(200); // pTamanhoPosicao(100); // --------------------------------------------------------------------- // ---------------------- Variáveis globais ---------------------------- // OBS: // --------------------------------------------------------------------- input pGatilhoDeteccao(2.0); pQtdePeriodosAnaliseVolat(50); var bStarted : boolean; bSinalCompra,bSinalVenda,bSinalLiquida : boolean; bComprado,bVendido : boolean; fMediaRapida,fMediaIntermediaria,fMediaLenta : float; //Parametros pTamanhoPosicao: integer; fTBDetector, fUltimoTopo, fUltimoFundo: float; // Variáveis do indicador top e fundo iIdentUltimaBarraIdentificada : integer; fMaximoAtual,fMinimoAtual : float; fVolatilidadeMedia: float; fTopoFundoConfirmado, Topo, Fundo : float; begin //****************************************************************** // COMEÇA AQUI INDICADOR TOPO E FUNDO //****************************************************************** // --------------------------------------------------------------------- // ------------ Atribuição de variáveis por processamento -------------- // --------------------------------------------------------------------- // Manutenção de valor da variável entre processamentos da estratégia // O comportamento de retenção de valor das variáveis tem sofrido alterações não previsiveis // nas últimas atualizações do Profit iIdentUltimaBarraIdentificada := iIdentUltimaBarraIdentificada[1]; fVolatilidadeMedia := (Summation(High,pQtdePeriodosAnaliseVolat)-Summation(Low,pQtdePeriodosAnaliseVolat)) /pQtdePeriodosAnaliseVolat; // --------------------------------------------------------------------- // --------------------- Cálculo do indicador ------------------------- // OBS: Inserir lógica de cálculo do indicador e caso ele possa ser plo_ // tado, atribuir em algum momento True para variável bPlotIndicador // --------------------------------------------------------------------- // Inicialização do algoritmo quando tem dados suficientes if CurrentBar = pQtdePeriodosAnaliseVolat then begin fMaximoAtual := High[1]; fMinimoAtual := Low[1]; iIdentUltimaBarraIdentificada := -1*(CurrentBar-1); end; // Algoritmo inicia execução if CurrentBar > pQtdePeriodosAnaliseVolat then begin // Última confirmação do indicador foi um topo if (iIdentUltimaBarraIdentificada > 0) then begin // Verifica se houve retração de preço em relação ao valor mínimo atual maior do que o gatilho do parâmetro de entrada if (High >= (fMinimoAtual + pGatilhoDeteccao*fVolatilidadeMedia)) then begin // Plota o fundo identificado, atualiza o índice da barra de fundo com valor negativo (economia de memória) // e estabelece um valor inicial para o máximo atual fTopoFundoConfirmado := Lowest(Low,CurrentBar - Round(Abs(iIdentUltimaBarraIdentificada)) + 1); //plot(fTopoFundoConfirmado); iIdentUltimaBarraIdentificada := -1*CurrentBar; fMaximoAtual := High; //PaintBar(clGreen); //PlotText(fTopoFundoConfirmado,clGreen,-1,9); end; // Atualiza o valor mínimo atual if Low < fMinimoAtual then fMinimoAtual := Low; end // Última confirmação do indicador foi um fundo else begin // Verifica se houve retração de preço em relação ao valor máximo atual maior do que o gatilho do parâmetro de entrada if (Low <= (fMaximoAtual - pGatilhoDeteccao*fVolatilidadeMedia)) then begin // Plota o topo identificado, atualiza o índice da barra de topo com valor positivo (economia de memória) // e estabelece um valor inicial para o mínimo atual fTopoFundoConfirmado := Highest(High,CurrentBar - Round(Abs(iIdentUltimaBarraIdentificada)) + 1); //plot(fTopoFundoConfirmado); iIdentUltimaBarraIdentificada := CurrentBar; fMinimoAtual := Low; //PaintBar(clRed); //PlotText(fTopoFundoConfirmado,clRed,-1,9); end; // Atualiza o valor máximo atual if High > fMaximoAtual then fMaximoAtual := High; end; end; //************************************************************************ //TERMINA AQUI INDICADOR TOPO E FUNDO //************************************************************************ // --------------------------------------------------------------------- // ----------------- Inicialização da estratégia ----------------------- // OBS: Inicialização de variáveis a serem utilizadas na estratégia de // execuçaõ // --------------------------------------------------------------------- if Not bStarted then begin bStarted := True; end; //if (GraphicInterval <> itMinute) or (GraphicOffset <> 15) then // if LastBarOnChart then plotText("Mudar para 15 min!", clWhite, -1, 12) //else //begin // --------------------------------------------------------------------- // ------------------ Inicialização de variáveis ----------------------- // OBS: Inicialização de variáveis p/ cada tick/barra // Nem todas as variáveis são inicializadas aqui porque se não houver // dados suficientes não faz sentido inicializar algumas variáveis // --------------------------------------------------------------------- fTBDetector := fTopoFundoConfirmado; se (fTBDetector <> 0) e (fTBDetector = maxima) entao topo := fTBDetector senao topo := topo[1]; se (fTBDetector <> 0) e (fTBDetector = minima) entao fundo := fTBDetector senao fundo := fundo[1]; plot(topo); plot2(fundo); end;