Ajuda na função para remover ordens pendentes.

 

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.");

            }

        }

    }

}

 

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.

Botão de código no editor