Avaliar o código // ============================================================ // FN_MULTI_PRO_1M_V12_ULTRA // WIN + WDO | NÍVEL HEDGE FUND REAL // ============================================================ // MELHORIAS V12: // [V1] Filtro anti-lateral (range compression) // [V2] Slippage real aplicado // [V3] Reset completo de variáveis // [V4] Execução mais precisa // ============================================================ input fatorStop : float(1.4); fatorAlvo : float(3.0); fatorTrailing : float(1.2); fatorBE : float(1.0); periodoATR : int(14); periodoADX : int(14); qtdContratos : int(1); horaInicio : int(910); horaZeragem : int(1700); margemTempo : int(30); maxDistMedia : float(2.0); cooldownCandles : int(5); maxLossDia : int(3); exigirFluxo : bool(true); fatorATRMax : float(3.0); var mme9, mme21, mme50 : float; atr, atrMedio : float; adx : float; vwap : float; pdh, pdl : float; tendAlta, tendBaixa : bool; mercadoForte : bool; volatOk : bool; lateral : bool; contextoCompra, contextoVenda : bool; fluxoCompra, fluxoVenda : bool; sinalC, sinalV : bool; temPosicao : bool; precoEntrada, alvo, stop : float; stopAtual : float; breakEvenAtivado : bool; ordemEnviada : bool; lossesDia : int; modoDefesa : bool; dataAnterior : int; ultimoSinalBar : int; emCooldown : bool; horarioValido : bool; pdhPdlIniciado : bool; slippage : float; begin // ── SLIPPAGE REAL ───────────────────────────── slippage := MinPriceIncrement * 2; // ── CONTROLE DE LOSS ───────────────────────── if PositionClosedThisBar then begin if LastTradeResult < 0 then lossesDia := lossesDia + 1; end; // ── RESET DIÁRIO ───────────────────────────── if Date <> dataAnterior then begin lossesDia := 0; modoDefesa := false; dataAnterior := Date; pdhPdlIniciado := false; end; // ── PDH/PDL ────────────────────────────────── if not pdhPdlIniciado then begin var i : int; i := 1; pdh := High[1]; pdl := Low[1]; while (i <= 200) and (Date[i] = Date[1]) do begin if High[i] > pdh then pdh := High[i]; if Low[i] < pdl then pdl := Low[i]; i := i + 1; end; pdhPdlIniciado := true; end; // ── HORÁRIO ────────────────────────────────── horarioValido := (Time >= horaInicio + margemTempo) and (Time <= horaZeragem - margemTempo); if (Time >= horaZeragem - margemTempo) and (IsBought or IsSold) then begin CancelOrders; ClosePosition; exit; end; if not horarioValido then exit; // ── INDICADORES ────────────────────────────── mme9 := ExpAverage(Close, 9); mme21 := ExpAverage(Close, 21); mme50 := ExpAverage(Close, 50); atr := AvgTrueRange(periodoATR); atrMedio := Average(atr, 20); adx := ADX(periodoADX); vwap := VWAP; if (atr <= 0) or (atrMedio <= 0) then exit; // ── FILTRO ANTI-LATERAL (V1) ───────────────── var rangeCurto, rangeLongo : float; rangeCurto := Highest(High, 10) - Lowest(Low, 10); rangeLongo := Highest(High, 30) - Lowest(Low, 30); lateral := rangeCurto < (rangeLongo * 0.5); // ── CONTEXTO ──────────────────────────────── tendAlta := (mme9 > mme21) and (mme21 > mme50); tendBaixa := (mme9 < mme21) and (mme21 < mme50); mercadoForte := adx > 20; volatOk := (atr >= atrMedio * 0.7) and (atr <= atrMedio * fatorATRMax); contextoCompra := Close > vwap; contextoVenda := Close < vwap; fluxoCompra := (Close > Open) and (Volume > Average(Volume, 20)); fluxoVenda := (Close < Open) and (Volume > Average(Volume, 20)); temPosicao := IsBought or IsSold; // ── DEFESA ────────────────────────────────── if lossesDia >= maxLossDia then modoDefesa := true; emCooldown := (BarIndex - ultimoSinalBar) < cooldownCandles; // ── SINAIS ────────────────────────────────── sinalC := false; sinalV := false; if (not temPosicao) and (not modoDefesa) and (not emCooldown) and (not lateral) and mercadoForte and volatOk and tendAlta and contextoCompra and (Abs(Close - vwap) <= atr * maxDistMedia) and (Close > pdh) and ((not exigirFluxo) or fluxoCompra) then sinalC := true; if (not temPosicao) and (not modoDefesa) and (not emCooldown) and (not lateral) and mercadoForte and volatOk and tendBaixa and contextoVenda and (Abs(Close - vwap) <= atr * maxDistMedia) and (Close < pdl) and ((not exigirFluxo) or fluxoVenda) then sinalV := true; if sinalC and sinalV then begin sinalC := false; sinalV := false; end; // ── ENTRADA ───────────────────────────────── if sinalC then begin BuyAtMarket(qtdContratos); ultimoSinalBar := BarIndex; breakEvenAtivado := false; ordemEnviada := false; end; if sinalV then begin SellShortAtMarket(qtdContratos); ultimoSinalBar := BarIndex; breakEvenAtivado := false; ordemEnviada := false; end; // ── PREÇO REAL ────────────────────────────── if IsBought and (precoEntrada = 0) then begin precoEntrada := BuyPrice; alvo := precoEntrada + (atr * fatorAlvo) - slippage; stop := precoEntrada - (atr * fatorStop) - slippage; stopAtual := stop; end; if IsSold and (precoEntrada = 0) then begin precoEntrada := SellPrice; alvo := precoEntrada - (atr * fatorAlvo) + slippage; stop := precoEntrada + (atr * fatorStop) + slippage; stopAtual := stop; end; // ── RESET COMPLETO (V3) ───────────────────── if not temPosicao then begin precoEntrada := 0; alvo := 0; stop := 0; stopAtual := 0; end; // ── OCO ───────────────────────────────────── if temPosicao and (not ordemEnviada) and (precoEntrada > 0) then begin CancelOrders; if IsBought then begin SellToCoverLimit(alvo); SellToCoverStop(stopAtual, stopAtual); end; if IsSold then begin BuyToCoverLimit(alvo); BuyToCoverStop(stopAtual, stopAtual); end; ordemEnviada := true; end; // ── BREAK EVEN ────────────────────────────── if IsBought and (not breakEvenAtivado) and (Close >= precoEntrada + atr * fatorBE) then begin stopAtual := precoEntrada; breakEvenAtivado := true; ordemEnviada := false; end; if IsSold and (not breakEvenAtivado) and (Close <= precoEntrada - atr * fatorBE) then begin stopAtual := precoEntrada; breakEvenAtivado := true; ordemEnviada := false; end; // ── TRAILING ──────────────────────────────── if IsBought and breakEvenAtivado then begin var novoStop : float; novoStop := Close - (atr * fatorTrailing); if novoStop > stopAtual then begin stopAtual := novoStop; ordemEnviada := false; end; end; if IsSold and breakEvenAtivado then begin var novoStop : float; novoStop := Close + (atr * fatorTrailing); if novoStop < stopAtual then begin stopAtual := novoStop; ordemEnviada := false; end; end; end;
F
Flávio
Resposta do Guru IA
O código apresentado, denominado FN_MULTI_PRO_1M_V12_ULTRA, é uma estratégia quantitativa robusta escrita em NTSL (Nelogica Trading System Language) para a plataforma Profit. Ela foca em operações de tendência com filtros avançados de volatilidade e contexto.
Abaixo, apresento uma avaliação técnica detalhada dividida por pilares:
1. Arquitetura e Filtros de Contexto
O código utiliza uma combinação clássica e eficaz de indicadores para definir a "saúde" do movimento:
- Alinhamento de Médias (MME 9, 21, 50): Garante que o robô opere apenas em tendências de médio/longo prazo confirmadas.
- Filtro Anti-Lateral (Range Compression): A lógica de comparar o
rangeCurto(10 períodos) com orangeLongo(30 períodos) é excelente para evitar o "chicote" (whipsaw) em mercados travados. - ADX e ATR: O uso do ADX > 20 assegura que há força na tendência, enquanto o ATR dinâmico filtra excessos de volatilidade (evitando entrar em candles exaustos ou mercados parados demais).
2. Gestão de Risco e Defesa
Este é o ponto mais forte da versão V12:
- Daily Max Loss: O
maxLossDiaimpede que a estratégia continue operando em dias de baixa performance (fase de drawndown). - Cooldown: O
cooldownCandlesevita a reentrada imediata após um sinal, o que previne o "overtrading" em zonas de briga de preço. - Slippage Real: A inclusão de
MinPriceIncrement * 2no cálculo de alvo e stop aproxima o backtest da realidade do pregão (custos operacionais e spread).
3. Execução e Manejo da Posição
- Break-Even e Trailing Stop: A transição do stop para o preço de entrada (BE) e o posterior rastreio pelo ATR (
fatorTrailing) protege o capital rapidamente e permite surfar grandes movimentos. - PDH/PDL (Prior Day High/Low): A estratégia utiliza o rompimento das máximas/mínimas anteriores como gatilho de confirmação, o que é um setup de alta probabilidade em ativos de índice (WIN) e dólar (WDO).
4. Pontos de Atenção e Sugestões
Apesar de muito bem estruturado, considere as seguintes observações:
- Cálculo do PDH/PDL: O loop
whileque percorre até 200 barras para encontrar a máxima/mínima do dia anterior pode ser computacionalmente custoso se usado em tempos gráficos muito curtos ou com muitos ativos simultâneos. No Profit, funções nativas comoDailyHigh(1)poderiam simplificar esse bloco. - Execução a Mercado vs OCO: O código tenta gerenciar ordens (
CancelOrders,SellToCoverLimit) via script. Em contas reais, a latência pode ser um problema. O ideal é garantir que a conta esteja configurada com uma regra OCO (One Cancels Other) básica para garantir a saída caso a conexão caia, embora o script tente mitigar isso com o booleanoordemEnviada. - Reset de Variáveis: O bloco de reset (
if not temPosicao) é vital e está bem implementado, garantindo que oprecoEntradanão carregue lixo de operações anteriores.
Veredito
O código é profissional e está muito acima da média de scripts comuns. Ele demonstra uma compreensão clara de Hedge Fund Trading: não foca apenas no sinal de entrada, mas sim na filtragem do ambiente (volatilidade/tendência) e na preservação de capital (gestão de risco diária).
Recomendação: Realize um Forward Test (Simulador em tempo real) por pelo menos uma semana para calibrar os fatores de ATR (fatorStop e fatorAlvo) de acordo com a volatilidade atual do WIN/WDO.
Resolva sua questão com 97% de assertividade
Envie sua pergunta ao nosso resolvedor de tarefas e receba a resposta na hora!
Prefere sua atividade resolvida por um professor especialista?
- Receba resolvida até o seu prazo
- Converse com o professor pelo chat
- Garantia de 7 dias contra erros