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:
INPUTDesvio(2); PeriodoBanda(40); Alvo(1);StopTicks(150);SpreadTicks(50);HrInicio (945);HrFim (1200);HrFechar (1700);
VarBSup,BInf,StopVTicks, StopCTicks:float;SinalVenda, SinalCompra : Booleano;
begin
//=== Regras das VariaveisBSup := 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) entaoInicioSellShortStop(minima - 1*MinPriceIncrement, minima - 3*MinPriceIncrement );Fim;
se IsSold entãoInicioBuyToCoverStop(StopVTicks, StopVTicks+SpreadTicks); BuyToCoverLimit(Lowest(low,Alvo)+ 3 *MinPriceIncrement,SellPosition); Fim;Fim;
//======= COMPRA ==========
SinalCompra := (Fechamento[1] < BInf) e (Fechamento > BInf)e (Fechamento < Highest(high,Alvo)-10*MinPriceIncrement);
se (not isBought) e SinalCompra = True entãoInicioBuyStop(maxima + 1*MinPriceIncrement, maxima + 3*MinPriceIncrement );Fim;
se isBought entãoInicioSellToCoverStop(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);
InicioSe (Time>HrFechar) e hasPosition então CancelPendingOrders;Se (Time>HrFechar) e HasPosition então ClosePosition;Fim;
=== Agora, segue o outro codigo, em que tudo esta entrelaçado usando a expressao "senao"
INPUTDesvio(2); //testar os parametros, com 1 desvio, faz 40k e 1400operacoesPeriodoBanda(40); //testar os parametrosAlvo(1);StopTicks(150);SpreadTicks(50);HorarioInicio(0945); HorarioFim(1200); HorarioFecharPosicoes(1700);
VarBSup,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ãoHorarioNegociacao := verdadeiroSenaoHorarioNegociacao := falso;
//====== VERIFICA O HORARIO DE ZERAGEM ======Se (Time >= HorarioFecharPosicoes) entãoHorarioZeragem := verdadeiroSenaoHorarioZeragem := falso;
//====== VERIFICA SE ESTÁ COMPRADO ======Se IsBought e (CurrentBar <> BarraNaoPosicionado) entao InicioSellToCoverStop(StopCTicks, StopCTicks-SpreadTicks);SellToCoverLimit(Highest(high,Alvo) - 3*MinPriceIncrement,BuyPosition);Se HorarioZeragem ou (Abertura < StopVTicks) entao ClosePosition; FimSenaoInicio//====== VERIFICA SE ESTÁ VENDIDO =====Se IsSold e (CurrentBar <> BarraNaoPosicionado) entaoInicioBuyToCoverStop(StopVTicks, StopVTicks+SpreadTicks); BuyToCoverLimit(Lowest(low,Alvo)+ 3 *MinPriceIncrement,SellPosition); Se HorarioZeragem ou (Abertura > StopVTicks) entao ClosePosition;BarraPosicionado := CurrentBar; FimSenaoInicio//====== VERIFICA SE O HORARIO ATUAL PERMITE NOVAS ENTRADAS ======Se HorarioNegociacao e (CurrentBar <> BarraPosicionado) entaoInicio//====== ENTRADAS COMPRAS =====SinalCompra := (Fechamento[1] < BInf) e (Fechamento > BInf)e (Fechamento < Highest(high,Alvo)-10*MinPriceIncrement);
se (not isBought) e SinalCompra = True entãoInicioBuyStop(maxima + 1*MinPriceIncrement, maxima + 3*MinPriceIncrement );FimSenao//====== ENTRADAS VENDAS =====SinalVenda := (Fechamento[1] > BSup)e (Fechamento < BSup)e (Fechamento > (Lowest(low,Alvo))+10*MinPriceIncrement);Se (not IsSold) e (SinalVenda = True) entaoSellShortStop(minima - 1*MinPriceIncrement, minima - 3*MinPriceIncrement );BarraNaoPosicionado := CurrentBar;FimSenao//====== 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!