Um backtesting adequado deve buscar simular situações práticas do mercado (slippage, custo de operação, etc...)
Olá a todos! Venho compartilhar com vocês parte de uma administração de ordens para estratégia de execução em Opções que venho usando em conta real há cerca de 20 dias. Meu objetivo com esse compartilhamento é que vocês possam me ajudar a melhorar o código, pois encontrei um certo bug. Abaixo o código.
Meus robozinhos somente operam Opções de call americanas de Petrobras por conta de liquidez e spread, no código temos até 5 sinais de compra e venda para que a estratégia possa ser executada e nesses 20 dias de uso notei somente um pequeno bug:
* Em certos momentos quando comprado por exemplo a ordem limite é menor que a posição, o que faz com que tenha uma saída precoce da operação, o mesmo para posição vendida, outra observação importante é que esse bug ocorre frequentemente quando troco de ativo já dentro da automatização, caso eu refaça todo o processo de "Nova Automação" dificilmente acontece.
Algo relevante também é que temos um tipo de trailing Stop e Trailing Gain que quando automação é executada de forma correta funciona super bem.
Vou agradecer bastante se puderem compartilhar o conhecimento de vocês para melhorar essa parte do código.
if not bPosicionado and (Time >= AberturaPosicao) and (Time <= FimAbertura) then begin if (pConfBuy = True) and (pConfBuy1 = True) then bSinalCompra := True; if (aConfBuy = True) and (aConfBuy1 = True) then aSinalCompra := True; if (zConfBuy = True) and (zConfBuy1 = True) then zSinalCompra := True; if (yConfBuy = True) and (yConfBuy1 = True) then ySinalCompra := True; if (rConfBuy = True) and (rConfBuy1 = True) then rSinalCompra := True; // Confirmação de posição de venda if (pConfSell = True) and (pConfSell1 = True) then bSinalVenda := True; if (aConfSell = True) and (aConfSell1 = True) then aSinalVenda := True; if (zConfSell = True) and (zConfSell1 = True) then zSinalVenda := True; if (yConfSell = True) and (yConfSell1 = True) then ySinalVenda := True; if (rConfSell = True) and (rConfSell1 = True) then rSinalVenda := True; end; if not bPosicionado and (bSinalCompra = True) or (aSinalCompra = True) or (ySinalCompra = True) or (rSinalCompra = True) or (zSinalCompra = True) then begin SendOrder(osBuy,otLimit,contratos,close + (Entrada*MinPriceIncrement),close); bConfigurouRisco := false; end; if GestaodeRisco then begin if (IsBought) then begin if not bConfigurouRisco and not bTrailingStopAtivado then begin fPrecoStop := BuyPrice - cStopEmTicks * MinPriceIncrement; fPrecoAlvo := BuyPrice + cAlvoEmTicks * MinPriceIncrement; fPrecoStopOffset := fPrecoStop - cStopOffSetEmTicks * MinPriceIncrement; bConfigurouRisco := True; end; if bConfigurouRisco then if ((close >= (BuyPrice + StopTrigger*MinPriceIncrement)) or (StopTrigger = 1)) then bTrailingStopAtivado := True; if (close >= BuyPrice) and (close > close[1]) then fFloorTraillingStop := BuyPrice + ((close - BuyPrice) / (cStepEmTicks*MinPriceIncrement)) * cStepEmTicks*MinPriceIncrement; if ((fFloorTraillingStop - cStepEmTicks*MinPriceIncrement) >= FprecoStop) and bTrailingStopAtivado then fPrecoStop := fFloorTraillingStop - cStopEmTicks*MinPriceIncrement; fPrecoStopOffSet := fPrecoStop - cStopOffSetEmTIcks*MinPriceIncrement; fPrecoAlvo := fFloorTraillingStop + cAlvoEmTicks*MinPriceIncrement; SellToCoverStop(fPrecoStop,fPrecoStopoffSet); SellToCoverLimit(fPrecoAlvo); if (close <= fPrecoStopOffSet) then ClosePosition; end; if not bPosicionado and (bSinalVenda = True) or (aSinalVenda = True) or (ySinalVenda = True) or (rSinalVenda = True) or (zSinalVenda = True) then begin SendOrder(osSell,otLimit,contratos,close - (entrada*MinPriceIncrement),close); bConfigurouRisco := false; end; if GestaodeRisco then begin if (IsSold) then begin if not bConfigurouRisco and not bTrailingStopAtivado then begin fPrecoStop := SellPrice + cStopEmTicks*MinPriceIncrement; fPrecoAlvo := SellPrice - cAlvoEmTicks*MinPriceIncrement; fPrecoStopOffset := fPrecoStop + cStopOffSetEmTicks*MinPriceIncrement; bConfigurouRisco := True; end; if bConfigurouRisco then if ((close <= (SellPrice - StopTrigger * MinPriceIncrement)) or (StopTrigger = 1)) then bTrailingStopAtivado := True; if (Close <= SellPrice) and (close < close[1]) Then fFloorTraillingStop := SellPrice - ((SellPrice - close) / (cStepEmTicks * MinPriceIncrement)) * cStepEmTicks * MinPriceIncrement; if ((fFloorTraillingStop + cStepEmTicks*MinPriceIncrement) <= fPrecoStop) and bTrailingStopAtivado then fPrecoStop := fFloorTraillingStop + cStopEmTicks*MinPriceIncrement; fPrecoStopOffSet := fPrecoStop + cStopOffSetEmTIcks*MinPriceIncrement; fPrecoAlvo := fFloorTraillingStop - cAlvoEmTicks*MinPriceIncrement; BuyToCoverStop(fPrecoStop,fPrecoStopoffSet); BuyToCoverLimit(fPrecoAlvo); if (close >= fPrecoStopOffSet) then ClosePosition; end; if not bPosicionado and (bConfigurouRisco = true) or (bTrailingStopAtivado = True) then begin bConfigurouRisco := false; bTrailingStopAtivado := false; end; end; end;