Boa tarde, Marcus Vinicius!! O que eu acho: quando a posição é encerrada no SL e as ordens removidas, mas logo em seguida, em um intervalo menor do que PeriodSeconds(), é aberta nova posição e incluídas novas ordens, essas novas ordens serão removidas imediatamente a partir da função CheckStopLoss(), que vai continuar "enxergando" a posição encerrada anteriormente:
if(HistorySelect(TimeCurrent() - PeriodSeconds(), TimeCurrent()))
Eu não entendi o motivo do comando abaixo, já que a variável position_id não é utilizada posteriormente (a não ser que a função postada esteja incompleta):
HistoryDealGetInteger(deal_ticket, DEAL_POSITION_ID, position_id)
Pelo que entendi, a sua conta é Netting, né? Então, eu acho que essa verificação para remover as ordens pendentes solitárias poderia ser feita da seguinte forma (de novo, a não ser que exista mais alguma razão que eu não estou visualizando):
if(!PositionSelect(_Symbol)) { deletarordenspendentes(); }
Ah!!... Quando for compartilhar código, por favor, utilize o botão do CÓDIGO (Alt -S)... Facilitará bastante a leitura.

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Bom dia!
Fico grato se alguém puder me ajudar com esse problema:
Estou efetuando uma operação com stop loss e 2 ordens pendentes para realizar parciais, ativo é o mini índice. O que ocorre, estou testando e o robo efetua a operação com stop e as saidas, ao acionar o stop, ele exclui as ordens parciais pendentes, atér aqui funciona, o problema é que na próxima operação ele ja lança o stop, lança as ordens pendentes para saída parcial mas logo em seguida já as remove, não aguarda levar o stop ou o encerramento do dia conforme o esperado. Vou postar a parte do código para ver se alguém pode me ajudar!
//Variáveis
bool pendingOrdersRemoved = false; // Variável para rastrear se ordens pendentes foram removidas
bool stopLossTriggered = false; // Variável para rastrear se um stop loss foi acionado
//Resetar ao abrir nova posição
void OpenBuyPosition()
{
deletarordenspendentes(); // Cancela ordens pendentes antes de abrir nova posição
pendingOrdersRemoved = false; // Resetar a flag quando abrir uma nova posição
stopLossTriggered = false; // Resetar a flag quando abrir uma nova posição
// Restante do código para abrir posição de compra
}
void OpenSellPosition()
{
deletarordenspendentes(); // Cancela ordens pendentes antes de abrir nova posição
pendingOrdersRemoved = false; // Resetar a flag quando abrir uma nova posição
stopLossTriggered = false; // Resetar a flag quando abrir uma nova posição
// Restante do código para abrir posição de venda
}
//Verificar Stop e remover ordens pendentes
void CheckStopLoss()
{
if (HistorySelect(TimeCurrent() - PeriodSeconds(), TimeCurrent()))
{
for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
{
ulong deal_ticket = HistoryDealGetTicket(i);
if (HistoryDealSelect(deal_ticket))
{
long deal_reason = 0;
if (HistoryDealGetInteger(deal_ticket, DEAL_REASON, deal_reason) && deal_reason == DEAL_REASON_SL)
{
long position_id = 0;
if (HistoryDealGetInteger(deal_ticket, DEAL_POSITION_ID, position_id) && !pendingOrdersRemoved)
{
deletarordenspendentes();
pendingOrdersRemoved = true; // Marca que as ordens pendentes foram removidas
stopLossTriggered = true; // Marca que um stop loss foi acionado
}
}
}
}
}
}
//Deletar ordens pendentes
void deletarordenspendentes()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
ulong ticket = OrderGetTicket(i);
if (ticket > 0)
{
if (!trade.OrderDelete(ticket))
{
Print("Erro ao deletar ordem pendente: ", GetLastError());
}
else
{
Print("Ordens removidas com sucesso.");
}
}
}
}