A NeoTraderBot é a primeira comunidade aberta no Brasil com foco em compartilhar informações sobre automatização de estratégias
Olá pessoal.
Teríamos, por acaso, algum snippet que inclua realização parcial?
Desde já, muito obrigado.
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;