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

Realização Parcial

2 Posts
2 Usuários
2 Reactions
167 Visualizações
(@dfrobinson)
Membro ativo
Registrou: 2 anos atrás
Posts: 4
Iniciador do tópico  

Olá pessoal.

Teríamos, por acaso, algum snippet que inclua realização parcial?

Desde já, muito obrigado.


   
Citar
Credson
(@m4tr1xbr)
Membro Moderator
Registrou: 2 anos atrás
Posts: 45
 

Olá, vou postar um exemplo para que você possa adaptar o seu código, nesse exemplo é para contratos, mas pode ser usado para lotes também. Outra coisa no exemplo estou fazendo uma saída parcial com a metade da posição, caso queira usar um valor fixo é só substituir o valor da variável iTamanhoPosicaoParcial pela quantidade desejada. 

const

cTamanhoPosicaoInicial (2);  //Define a constante para o tamanho inicial da posição.

var

bSinalCompra: boolean;
bSinalVenda: boolean;
fStopCompra, fStopVenda: float;
bEstaPosicionado: boolean;
fAlvoParcial: float;
iTamanhoPosicaoParcial: integer;




begin



{Busca as Entrada}

If Not (IsBought) and (bSinalCompra) then
begin
    fStopCompra :=
    fAlvoParcial :=
    BuyAtMarket(cTamanhoPosicaoInicial);
    bestaPosicionado := verdadeiro;
end;


//Verifica ainda não foi aberta uma posição comprada e se o sinal de compra é verdadeiro. Em seguida, define os valores do stop loss e do alvo parcial de lucro, bem como faz uma ordem de compra a mercado para a posição inicial. Por fim, atualiza a variável bestaPosicionado para verdadeiro, indicando que uma posição foi aberta.


If Not(IsSold) and ((bSinalVenda) then
begin
    fStopVenda :=
    fAlvoParcial :=
    SellShortAtMarket(cTamanhoPosicaoInicial);
    bestaPosicionado := verdadeiro;
end;

//Verifica ainda não foi aberta uma posição vendida e se o sinal de venda é verdadeiro. Atribuí os valores de Stoploss, Alvo e faz a venda, altera a variável bestaPosicionado para verdadeiro, indicando que uma posição foi aberta.



{Calcula os valores de saída parcial da compra}

if (IsBought) e (bEstaPosicionado) then
begin
    iTamanhoPosicaoParcial := Ceiling(cTamanhoPosicaoInicial / 2); 
    bEstaPosicionado := falso;
end;

//Se o ativo foi comprado e uma posição foi aberta, calcula o tamanho da posição parcial com base na metade do tamanho da posição inicial. A função Ceiling é usada caso a posição inicial seja um valor impar ex. 3, logo em seguida muda a variável /estaPosicionado para falso, indicando que a posição parcial foi calculada.


{Calcula os valores de saída parcial da venda}

if (IsSold) e (bEstaPosicionado) then
begin
    iTamanhoPosicaoParcial := Ceiling(cTamanhoPosicaoInicial / 2);
    bEstaPosicionado := falso;
end;

//Mesma lógica do bloco anterior para compra.


{Busca a saída parcial da compra}
  If (IsBought) And (Position = cTamanhoPosicaoInicial) then
    begin
      SellToCoverLimit(AlvoParcial,tamanhoPosicaoParcial);
    End;


  {Busca saída parcial da Venda}
  If (IsSold) and (Position = neg(iTamanhoPosicaoInicial)) then
    begin
      BuyToCoverLimit(fAlvoParcial,iTamanhoPosicaoParcial);
    end;

{Recalcula posicao e ordens de compra}

  if (IsBought) e (Position < cTamanhoPosicaoInicial) then
    begin
      iTamanhoPosicaoParcial := Position;
    end;

//Atribui a variável iTamanhoPosicaoParcial o valor do restante da posicao


 {Recalcula posição e ordens de venda}

//Como a função "Position" retorna um valor negativo é preciso usar a função "neg"
  if (IsSold) e (Position > neg(iTamanhoPosicaoInicial)) then
    inicio
      iTamanhoPosicaoParcial := Position;
    fim;
 
End;


   
ReplyCitar