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] Mesma Estrategia em Codigos Diferentes gerando resultados diferentes

2 Posts
2 Usuários
0 Reactions
263 Visualizações
(@paulo-ferreira)
Membro ativo
Registrou: 2 anos atrás
Posts: 5
Iniciador do tópico  

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;

 


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

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!

 

 


   
ReplyCitar