Eu faço reversões com parcial, acho que no seu caso ficaria da seguinte forma….
Se IsBought e SV entao sellshortatmarket(buyposition+5);
Se IsSold e SC entao buyatmarket(sellposition+5);
Nos meus códigos ele reverte corretamente com esse comando, pois independente de quantos contratos vocês esteja posicionado, com esse comando ele vai encerrar a posição e enviar mais 5.
abaixo segue a parte de um código de Martin Gale que eu criei para estudo.
os gatilhos de compra você pode criar como quiser…
input
periodo(5);
final(15);
stop(7);
offset(10);
var
compra, venda, condiçãoop, condiçãoparc : booleano;
condiçãocompra, condiçãovenda : booleano;
datacandle, condição : inteiro;
pontocompra, pontovenda : real;
begin
//se (date=currentdate) entao
//begin
//CORES
//PLOTAGENS
//ATRIBUIÇÕES DE COMPRA E VENDA
Compra := ;
Venda := ;
////////////////////////////////////////////////////////////////
/////////////////////////////EXECUÇAO///////////////////////////
////////////////////////////////////////////////////////////////
//ENTRADAS NAS OPERAÇÕES//
If (not hasposition) entao
begin
if compra then buyatmarket(1);
if venda then sellshortatmarket(1);
end;
////////////////SAIDAS E REVERÇÕES COM MARTIN GALE///////////////
///////////////SAIDAS DA COMPRA////////////////
se (isbought) entao
begin
selltocoverlimit(buyprice+final,buyposition);
//Encerramento e MG
se (close > buyprice) e venda then reverseposition;
se (close < buyprice) e venda then sellshortatmarket(buyposition+(buyposition*2));
fim;
///////////////SAIDAS DA VENDA////////////////
if (issold) then
begin
buytocoverlimit(sellprice-final,sellposition);
//Encerramento e MG
se (close < sellprice) e compra then reverseposition;
se (close > sellprice) e compra then buyatmarket(sellposition+(sellposition*2));
fim;
fim;
end;