Baixe o app do Guru IA

+ 2.000.000 downloads

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

12/04/26

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 o rangeLongo (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 maxLossDia impede que a estratégia continue operando em dias de baixa performance (fase de drawndown).
  • Cooldown: O cooldownCandles evita 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 * 2 no 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:

  1. Cálculo do PDH/PDL: O loop while que 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 como DailyHigh(1) poderiam simplificar esse bloco.
  2. 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 booleano ordemEnviada.
  3. Reset de Variáveis: O bloco de reset (if not temPosicao) é vital e está bem implementado, garantindo que o precoEntrada nã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.

Resolvedor

Resolva sua questão com 97% de assertividade

Envie sua pergunta ao nosso resolvedor de tarefas e receba a resposta na hora!

Equipe Meu Guru

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

Perguntas relacionadas