Limite de perda diária num Expert Advisor: quatro decisões que as prop firms exigem acertar
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.


