Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!
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;