Limite de perda diária num Expert Advisor: quatro decisões que as prop firms exigem acertar

10 outubro 2026, 10:23
Bohdan Klok
0
3

Um limite de perda diária parece uma única linha de código: "se a perda de hoje passar de X%, pare". Na prática são quatro decisões, e cada uma muda o momento em que o limite dispara. As mesas proprietárias (prop firms) tornaram-nas inevitáveis: basta romper o limite diário uma vez para perder a conta, não importa o que a estratégia fez no resto do mês. Veja como o limite costuma ser contado, onde uma implementação simples erra e o código que uso no meu Expert Advisor.

1. O que é "hoje"?

O dia do servidor de negociação, não do seu computador: TimeCurrent() é o relógio que o MetaTrader mostra em toda parte. As prop firms zeram o limite à meia-noite do seu servidor ou de um fuso horário fixo; verifique qual a sua usa: se não for a meia-noite do servidor, a hora de reinício precisa ser deslocada. O início do dia do servidor é simplesmente:

datetime now = TimeCurrent();
datetime day = now - now % 86400;       // 00:00 server time

2. Perda em relação a quê?

Em relação ao saldo no início do dia. Muitas prop firms usam o saldo ou o patrimônio naquele momento, o que for maior, então a escolha mais rigorosa é a segura: se você entra na noite com um lucro flutuante de 300, esse lucro faz parte da base, e devolvê-lo conta como perda.

double base = MathMax(AccountInfoDouble(ACCOUNT_BALANCE), AccountInfoDouble(ACCOUNT_EQUITY));

3. Perda medida como?

Pelo patrimônio, não pelas operações fechadas. Um limite que olha só as operações fechadas deixa uma posição aberta passar muito dele: o monitor da prop firm vê a perda flutuante, o seu código não. Por isso a verificação roda a cada tick:

if(AccountInfoDouble(ACCOUNT_EQUITY) <= base * (1.0 - limitPercent / 100.0))
   stopped = true;      // close the positions, open nothing until the next day

e sobre a conta inteira. Um limite por Expert Advisor serve para o seu próprio controle de risco, mas a prop firm conta todas as posições juntas. Se várias cópias do programa rodam em vários gráficos, cada uma vê o mesmo patrimônio da conta e cada uma fecha as suas próprias posições.

4. O que sobrevive a uma reinicialização?

É o ponto em que uma implementação simples sempre erra. A base fica numa variável; o terminal reinicia às 14:00 (uma atualização, um reboot do VPS, uma mudança de parâmetros); o programa começa de novo, toma o saldo atual como "início do dia" - depois das perdas da manhã - e permite mais um limite inteiro. O estado do dia precisa ser guardado fora do programa. As variáveis globais do terminal existem para isso:

string key = StringFormat("DL_%I64d_%I64u_%s_", AccountInfoInteger(ACCOUNT_LOGIN), magic, _Symbol);
if(GlobalVariableCheck(key + "day") && (datetime)GlobalVariableGet(key + "day") == day)
  {
   base    = GlobalVariableGet(key + "base");       // the real start of the day
   stopped = GlobalVariableGet(key + "stop") != 0.0;
  }
else
  {
   GlobalVariableSet(key + "day", (double)day);      // a new day: remember it
   GlobalVariableSet(key + "base", base);
   GlobalVariableSet(key + "stop", 0.0);
  }

O terminal mantém as variáveis globais por quatro semanas após o último acesso e as grava em disco, então elas sobrevivem a uma reinicialização, a uma recompilação e a uma mudança de parâmetros.

Pequenos detalhes que importam

  • Fechar e parar: quando o limite dispara, feche as posições deste programa e recuse todo sinal novo até o dia seguinte. Avise onde o usuário olha (uma linha no painel do gráfico, um alerta, uma notificação push), não só no diário.
  • Um fechamento pode falhar: o mercado está fechado, o preço se moveu, o servidor está ocupado. Tente de novo, mas não a cada tick: uma vez por segundo enquanto a sessão de negociação está aberta basta.
  • No Testador de Estratégia as variáveis globais pertencem ao agente de teste, e um teste não reinicia no meio: ali o estado em memória basta.
  • Escolha uma porcentagem abaixo do limite da prop firm. Com risco de 1% por operação, um limite diário de 3% são três operações no stop; ponha o seu limite em 4% se o da empresa for 5%, porque o preço pode saltar além do seu stop.

No produto

Desde a versão 1.09 o Indicator Signal Trader Kb tem exatamente isso: "Daily loss limit" nos parâmetros, desligado por padrão, contado sobre a conta inteira a partir do maior entre saldo e patrimônio no início do dia do servidor, mantido entre reinicializações, com uma linha vermelha no painel quando dispara. No Testador de Estratégia, com o limite em 0,5% e risco de 1% por operação, ele disparou 372 vezes em 2022-2026 no GBPUSD, e nenhuma posição foi aberta depois no mesmo dia - que é a única coisa que um limite diário precisa garantir.