CloseAll

 
tem alguma function para fazer closeall ja massivamente ?
 
Julio Cesar Maia Goncalvestem alguma function para fazer closeall ja massivamente ?
Esse método existe na classe CExpert, mas não sei se atende a sua necessidade - penso que vai precisar implementar mesmo.
 
Vinicius Pereira De Oliveira #:
Esse método existe na classe CExpert, mas não sei se atende a sua necessidade - penso que vai precisar implementar mesmo.

Esse método NÃO é server-side! Ele também faz um loop fechando uma-por-uma

Ainda é client-side (usa CTrade.PositionClose() )
Ainda fecha uma-por-uma (loop sequencial)
Ainda trava (usa OrderSend() síncrono)
Ainda tem slippage entre fechamentos

tem algum comando que seja server-site ? tipo TakeProfit?

 
Julio Cesar Maia Goncalves #:

Esse método NÃO é server-side! Ele também faz um loop fechando uma-por-uma

Ainda é client-side (usa CTrade.PositionClose() )
Ainda fecha uma-por-uma (loop sequencial)
Ainda trava (usa OrderSend() síncrono)
Ainda tem slippage entre fechamentos

tem algum comando que seja server-site ? tipo TakeProfit?

alguem ?
 

Explicação mais detalhada do problema (apenas atualizando):

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Travamento quando fecha as operacoes

Julio Cesar Maia Goncalves, 2026.02.08 16:42

Oi criei um bot 

mas estou com dificuldade ao fechar as operações se eu mudo o EA para fechar por TP quem gerencia é o Metatrader e realmente encerra a operação sem lag e sem erros

mas quando eu mudo o robo para fechar operacoes por saldo, aqui eu sofro demais se eu coloquei 50 dolares como saida e ter 300 operaçoes abertas ele demora 10-20 segundos e as vezes em vez de encerrar em 50 dolares ganho ele fecha em 100 dolares ganho, assim tambem como em vez de fechar com 50 dolares ele pode encerrar com -100 -500 dolares pela demora, 

fiz ate uma tabela por chatgpt para tentar algumas tecnicas diferentes mas praticamentes todas travam 

Método Velocidade Trava? CPU Server-Side Filtra Magic? Filtra Saldo?
TP/SL ⚡⚡⚡⚡⚡ Zero
Close All Nativo ⚡⚡⚡⚡ Zero
TP Dinâmico ⚡⚡⚡⚡ Baixo
Timer + Async ⚡⚡⚡⚡ Muito Baixo
OrderSendAsync Loop ⚡⚡⚡ Médio
OrderSend Loop ⚡⚡ Alto
CTrade ⚡⚡ Médio
Trailing Stop ⚡⚡⚡⚡ Baixo
Virtual TP ⚡⚡⚡ Depende Alto


Julio Cesar, não entendi por que você rejeitou o TP dinâmico... As atualizações dos TPs travam seu sistema?

<EDITADO 1> Caso seja esse o motivo, compartilhe esse trecho do seu código para obter sugestões de melhorias e tentar contornar esse travamento, porque, a meu ver, essa é a solução mais viável.

 

CExpert e CTrade são wrappers síncronos ("bloqueantes") que transformam o MT5 numa carroça quando você precisa de velocidade.

Para responder sua pergunta diretamente: NÃO existe um comando nativo "Server-Side Close All" disponível via MQL5. O servidor da MetaQuotes não expõe uma função OrderCloseAll() que você dispara e ele se vira. O comando TakeProfit é server-side, mas ele é um gatilho de preço condicional por posição, não um comando de execução imediata em massa.

Se você quer fechar 100 ordens em milissegundos sem esperar o "ok" do servidor para cada uma, você precisa sair do síncrono da CTrade e usar a função assíncrona diretamente.

A solução é usar assincronia pura com OrderSendAsync.

O OrderComplete (ou PositionClose da CTrade) envia a ordem e espera a resposta do servidor. Isso adiciona a latência de rede (Ping) + tempo de processamento do broker a CADA ordem. 100 ordens x 50ms = 5 segundos congelado.

O OrderSendAsync apenas coloca a requisição na fila de saída da sua placa de rede e retorna true imediatamente. 100 ordens x 0.01ms (CPU time) = 1ms para disparar tudo.

O gargalo deixa de ser a rede e passa a ser a capacidade do servidor do broker de processar a fila que você acabou de vomitar nele.

Isso é o mais próximo de um "Close All" server-side que você vai conseguir via terminal. Você dispara tudo e deixa o servidor se virar.

Riscos
  • SPAM: O broker pode não gostar de receber 100 requests em 1ms. Alguns têm limite de "requests per second". Verifique o retcode para entender a situação.
  • Memória: O terminal MT5 precisa gerenciar 100 transações pendentes. Isso consome RAM, mas para 100 ordens é tranquilo.
  • Ordem de Execução: Não há garantia de que a ordem 1 será executada antes da 100.


Pseudo-Código:

// Variáveis Globais para manter estado (sem alocação dinâmica no loop)
MqlTradeRequest request;
MqlTradeResult result;
bool MassKillSwitch = false;

void OnTick() {
    // 1. Monitoramento Leve
    if (!MassKillSwitch && CheckPL() >= TargetPL) {
        MassKillSwitch = true;
        ExecuteHypersonicKill();
    }
}

// O Loop da Violência
void ExecuteHypersonicKill() {
    // Preenche estáticos para economizar ciclos
    ZeroMemory(request);
    request.action = TRADE_ACTION_DEAL;
    request.type_filling = ORDER_FILLING_FOK; // Ou IOC, depende do broker
    request.deviation = 100; // Slippage generoso para GARANTIR execução (quem quer sair rápido não negocia preço)

    int total = PositionsTotal();
    
    for(int i = total - 1; i >= 0; i--) {
        ulong ticket = PositionGetTicket(i);
        
        string symbol = PositionGetString(POSITION_SYMBOL);
        long type = PositionGetInteger(POSITION_TYPE);
        double vol = PositionGetDouble(POSITION_VOLUME);
        
        request.position = ticket;
        request.symbol = symbol;
        request.volume = vol;
        
        if (type == POSITION_TYPE_BUY) {
            request.type = ORDER_TYPE_SELL;
            request.price = SymbolInfoDouble(symbol, SYMBOL_BID); 
        } else {
            request.type = ORDER_TYPE_BUY;
            request.price = SymbolInfoDouble(symbol, SYMBOL_ASK);
        }
        
        // DISPARO NO ESCURO
        // Não checamos result.retcode aqui pra não perder tempo. 
        // Apenas mandamos.
        if(!OrderSendAsync(request, result)) {
            // Se falhar aqui, é erro local grave (memória, validação básica).
            // Print("Falha crítica no envio: ", GetLastError());
        }
    }
}

// O Lixeiro (Limpa o que sobrou)
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& req,
                        const MqlTradeResult& res) {
    
    // Se estamos em modo Kill, verificamos se algo falhou
    if (MassKillSwitch) {
        if (trans.type == TRADE_TRANSACTION_REQUEST) {
            if (res.retcode != TRADE_RETCODE_DONE) {
                // Ops, uma ordem falhou (requote, sem liquidez, etc).
                // Re-enviar AQUI ou marcar para próxima passagem.
                // Arnaldo diz: Re-envie imediatamente se for erro tratável.
            }
        }
        
        // Se positions == 0, Desliga o KillSwitch.
        if (PositionsTotal() == 0) {
            MassKillSwitch = false;
            Print("Extermínio concluído com sucesso.");
        }
    }
}

> Nota: Em contas netting ou com muitas ordens, monitore o OnTradeTransaction para garantir que nenhuma ordem foi rejeitada (requote/off quotes) e reenvie se necessário.

 
Jonathan Pereira # :

CExpert e CTrade são wrappers síncronos ("bloqueantes") que transformam o MT5 numa carroça quando você precisa de velocidade.

...
O CTrade também funciona perfeitamente em modo assíncrono.