Um backtesting adequado deve buscar simular situações práticas do mercado (slippage, custo de operação, etc...)
Ola amigos,
Eu tenho uma estrategia que escrevi numa logica em que faço o entrelaço de Vendas e Compras separadamente sem usar a palavra "senao". E noutro, faço tudo entrelaçado, usando "senao". Colocarei abaixo os dois codigos (rodei Backtest em Winfut M5 e M15)
Alguem consegue me dizer se existe erro em algum desses codigos? Ja fiquei cego, de tanto revisar.
É possivel dizer qual dos dois codigos seria "mais confiavel"? ou seja, aquele que preduz o Backteste mais confiavel e com maior probabilidade de replicar em conta real?
===== Abaixo Codigo com entrelaços fechado:
INPUT
Desvio(2);
PeriodoBanda(40);
Alvo(1);
StopTicks(150);
SpreadTicks(50);
HrInicio (945);
HrFim (1200);
HrFechar (1700);
Var
BSup,BInf,StopVTicks, StopCTicks:float;
SinalVenda, SinalCompra : Booleano;
begin
//=== Regras das Variaveis
BSup := BollingerBands(Desvio, PeriodoBanda, 1)|0|;
BInf := BollingerBands(Desvio, PeriodoBanda, 1)|1|;
StopVTicks := SellPrice + StopTicks*MinPriceIncrement;
StopCTicks := BuyPrice - StopTicks*MinPriceIncrement;
Se (Time>HrInicio) e (HrFim<1300) entao
//======= VENDA =========
Inicio
SinalVenda := (Fechamento[1] > BSup)
e (Fechamento < BSup)
e (Fechamento > (Lowest(low,Alvo))+10*MinPriceIncrement);
se (not IsSold) e (SinalVenda = True) entao
Inicio
SellShortStop(minima - 1*MinPriceIncrement, minima - 3*MinPriceIncrement );
Fim;
se IsSold então
Inicio
BuyToCoverStop(StopVTicks, StopVTicks+SpreadTicks);
BuyToCoverLimit(Lowest(low,Alvo)+ 3 *MinPriceIncrement,SellPosition);
Fim;
Fim;
//======= COMPRA ==========
Inicio
SinalCompra := (Fechamento[1] < BInf)
e (Fechamento > BInf)
e (Fechamento < Highest(high,Alvo)-10*MinPriceIncrement);
se (not isBought) e SinalCompra = True então
Inicio
BuyStop(maxima + 1*MinPriceIncrement, maxima + 3*MinPriceIncrement );
Fim;
se isBought então
Inicio
SellToCoverStop(StopCTicks, StopCTicks-SpreadTicks);
SellToCoverLimit(Highest(high,Alvo) - 3*MinPriceIncrement,BuyPosition);
Fim;
Fim;
//=== plotagem ===========
Plot (BInf);
Plot2 (BSup);
Se SinalCompra=True então PaintBar(clGreeN);
Se SinalVenda=True então PaintBar(clYellow);
Inicio
Se (Time>HrFechar) e hasPosition então CancelPendingOrders;
Se (Time>HrFechar) e HasPosition então ClosePosition;
Fim;
Fim;
=== Agora, segue o outro codigo, em que tudo esta entrelaçado usando a expressao "senao"
INPUT
Desvio(2); //testar os parametros, com 1 desvio, faz 40k e 1400operacoes
PeriodoBanda(40); //testar os parametros
Alvo(1);
StopTicks(150);
SpreadTicks(50);
HorarioInicio(0945);
HorarioFim(1200);
HorarioFecharPosicoes(1700);
Var
BSup,BInf,StopVTicks, StopCTicks:float;
SinalVenda, SinalCompra : Booleano;
StopCompra, StopVenda: real;
HorarioNegociacao, HorarioZeragem : booleano;
BarraPosicionado, BarraNaoPosicionado : inteiro;
Inicio
//===== CONFIGURA=====
BSup := BollingerBands(Desvio, PeriodoBanda, 1)|0|;
BInf := BollingerBands(Desvio, PeriodoBanda, 1)|1|;
StopVTicks := SellPrice + StopTicks*MinPriceIncrement;
StopCTicks := BuyPrice - StopTicks*MinPriceIncrement;
//====== VERIFICA O HORÁRIO DE NEGOCIAÇÃO ======
Se (Time >= HorarioInicio) e (Time <= HorarioFim) então
HorarioNegociacao := verdadeiro
Senao
HorarioNegociacao := falso;
//====== VERIFICA O HORARIO DE ZERAGEM ======
Se (Time >= HorarioFecharPosicoes) então
HorarioZeragem := verdadeiro
Senao
HorarioZeragem := falso;
//====== VERIFICA SE ESTÁ COMPRADO ======
Se IsBought e (CurrentBar <> BarraNaoPosicionado) entao
Inicio
SellToCoverStop(StopCTicks, StopCTicks-SpreadTicks);
SellToCoverLimit(Highest(high,Alvo) - 3*MinPriceIncrement,BuyPosition);
Se HorarioZeragem ou (Abertura < StopVTicks) entao ClosePosition;
Fim
Senao
Inicio
//====== VERIFICA SE ESTÁ VENDIDO =====
Se IsSold e (CurrentBar <> BarraNaoPosicionado) entao
Inicio
BuyToCoverStop(StopVTicks, StopVTicks+SpreadTicks);
BuyToCoverLimit(Lowest(low,Alvo)+ 3 *MinPriceIncrement,SellPosition);
Se HorarioZeragem ou (Abertura > StopVTicks) entao ClosePosition;
BarraPosicionado := CurrentBar;
Fim
Senao
Inicio
//====== VERIFICA SE O HORARIO ATUAL PERMITE NOVAS ENTRADAS ======
Se HorarioNegociacao e (CurrentBar <> BarraPosicionado) entao
Inicio
//====== ENTRADAS COMPRAS =====
SinalCompra := (Fechamento[1] < BInf)
e (Fechamento > BInf)
e (Fechamento < Highest(high,Alvo)-10*MinPriceIncrement);
se (not isBought) e SinalCompra = True então
Inicio
BuyStop(maxima + 1*MinPriceIncrement, maxima + 3*MinPriceIncrement );
Fim
Senao
//====== ENTRADAS VENDAS =====
SinalVenda := (Fechamento[1] > BSup)
e (Fechamento < BSup)
e (Fechamento > (Lowest(low,Alvo))+10*MinPriceIncrement);
Se (not IsSold) e (SinalVenda = True) entao
SellShortStop(minima - 1*MinPriceIncrement, minima - 3*MinPriceIncrement );
BarraNaoPosicionado := CurrentBar;
Fim
Senao
//====== CANCELA AS ORDENS PENDENTES CASO NÃO ESTEJA COMPRADO E NÃO ESTEJA EM HORÁRIO DE NEGOCIAÇÃO ======
CancelPendingOrders;
Fim;
Fim;
Fim;
Olá @paulo-ferreira!
É difícil dizer se há erro ou não no código porque precisariamos saber o que você quer de fato fazer no seu código.
Erros grosseiros de sintaxe já são capturados na compilação, enquanto erros de execução são mais sutis. O uso de "senão" não é determinante para saber se um código tem erro ou não. Mas eu recomendo sempre usar os blocos begin...end. Pois o compilador NTSL tem alguns bugs com ifs aninhados.
A coerência das simulações em backtesting com conta real dependem na verdade de outros fatores mais críticos tais como: tamanho de stoploss e alvo, ordem de execução na fila do Book, slippage, latências, etc...Alguns desses fatores podem ser "previstos" em backtesting. Outros não.
Especifique melhor o que acha que pode estar errado em seu código para sermos mais objetivos na análise.
Abs!