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?
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?
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.
- 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