npp-hft-winv25-scalper/WINV25_HFT_Scalper.ntsl
2025-08-14 16:01:41 -03:00

273 lines
No EOL
7.4 KiB
Text

// ============================================================================
// ROBÔ HFT SCALPER WINV25 - NELOGICA PROFIT PRO 5.0
// Versão 1.0 - Estratégia Price Action Scalper
// Mercado: BMF - Futuro WINV25
// Timeframe: M1 (1 minuto)
// Horário: 08:55 às 18:00 (Segunda a Sexta)
// ============================================================================
// CONFIGURAÇÕES BÁSICAS
Var
TakeProfit: Integer; // Take Profit em pontos
StopLoss: Integer; // Stop Loss em pontos
MaxPosicao: Integer; // Máximo de contratos por posição
TempoMaxPosicao: Integer; // Tempo máximo em posição (minutos)
UsarBreakEven: Boolean; // Usar break even
PontosBreakEven: Integer; // Pontos para ativar break even
// PARÂMETROS PRICE ACTION
PeriodoMA: Integer; // Período da média móvel
MinVariacao: Float; // Variação mínima para entry
VolumeMinimo: Integer; // Volume mínimo para validar sinal
// VARIÁVEIS DE CONTROLE
BarrasEntrada: Integer;
PosicaoAberta: Boolean;
PrecoEntrada: Float;
BreakEvenAtivo: Boolean;
UltimaOperacao: Float;
IntervaloCooldown: Integer; // Minutos entre operações
// VARIÁVEIS TÉCNICAS
MA: Float;
PrecoAnterior: Float;
VolumeAtual: Integer;
CompraSetup: Boolean;
VendaSetup: Boolean;
// ============================================================================
// INICIALIZAÇÃO
// ============================================================================
Once
Begin
// Configurações padrão
TakeProfit := 15;
StopLoss := 10;
MaxPosicao := 1;
TempoMaxPosicao := 5;
UsarBreakEven := True;
PontosBreakEven := 8;
PeriodoMA := 9;
MinVariacao := 5.0;
VolumeMinimo := 100;
IntervaloCooldown := 3;
// Inicializar variáveis
BarrasEntrada := 0;
PosicaoAberta := False;
PrecoEntrada := 0;
BreakEvenAtivo := False;
UltimaOperacao := 0;
CompraSetup := False;
VendaSetup := False;
PrecoAnterior := Close;
End;
// ============================================================================
// FUNÇÃO PRINCIPAL
// ============================================================================
Begin
// Verificar horário de operação (08:55 às 18:00, Segunda a Sexta)
If Not HorarioOperacao() Then
Begin
If PosicaoAberta Then
FecharPosicao();
Exit;
End;
// Calcular indicadores técnicos
CalcularIndicadores();
// Verificar se pode operar (cooldown)
If (Time - UltimaOperacao) < (IntervaloCooldown / 1440) Then
Exit;
// Gerenciar posição existente
If PosicaoAberta Then
Begin
GerenciarPosicao();
Exit;
End;
// Identificar setups de entrada
IdentificarSetups();
// Executar entradas
If CompraSetup And ValidarEntrada() Then
AbrirCompra();
If VendaSetup And ValidarEntrada() Then
AbrirVenda();
// Atualizar variáveis
PrecoAnterior := Close;
End;
// ============================================================================
// FUNÇÕES AUXILIARES
// ============================================================================
Function HorarioOperacao(): Boolean;
Var
HoraAtual: Integer;
MinutoAtual: Integer;
DiaSemana: Integer;
Begin
HoraAtual := Hour(Time);
MinutoAtual := Minute(Time);
DiaSemana := DayOfWeek(Date);
// Segunda a Sexta (2-6 no NTSL)
If (DiaSemana < 2) Or (DiaSemana > 6) Then
Begin
Result := False;
Exit;
End;
// Das 08:55 às 18:00
If (HoraAtual = 8) And (MinutoAtual >= 55) Then
Result := True
Else If (HoraAtual >= 9) And (HoraAtual < 18) Then
Result := True
Else
Result := False;
End;
Procedure CalcularIndicadores();
Begin
MA := Average(Close, PeriodoMA);
VolumeAtual := Volume;
End;
Procedure IdentificarSetups();
Var
ForcaAlta: Boolean;
ForcaBaixa: Boolean;
VolumeBom: Boolean;
Begin
CompraSetup := False;
VendaSetup := False;
// Verificar volume adequado
VolumeBom := VolumeAtual >= VolumeMinimo;
If Not VolumeBom Then Exit;
// Setup de compra: preço acima da MA e movimento forte para cima
ForcaAlta := (Close > MA) And
(Close > Open) And
((High - Low) >= MinVariacao) And
(Close > PrecoAnterior + MinVariacao/2);
// Setup de venda: preço abaixo da MA e movimento forte para baixo
ForcaBaixa := (Close < MA) And
(Close < Open) And
((High - Low) >= MinVariacao) And
(Close < PrecoAnterior - MinVariacao/2);
CompraSetup := ForcaAlta;
VendaSetup := ForcaBaixa;
End;
Function ValidarEntrada(): Boolean;
Begin
// Não operar se já teve operação recente
If (Time - UltimaOperacao) < (IntervaloCooldown / 1440) Then
Begin
Result := False;
Exit;
End;
// Não operar nos últimos 15 minutos do pregão
If (Hour(Time) >= 17) And (Minute(Time) >= 45) Then
Begin
Result := False;
Exit;
End;
Result := True;
End;
Procedure AbrirCompra();
Begin
If PosicaoAberta Then Exit;
Buy MaxPosicao Shares Next Bar At Market;
PosicaoAberta := True;
PrecoEntrada := Close;
BarrasEntrada := 0;
BreakEvenAtivo := False;
UltimaOperacao := Time;
// Configurar stop loss e take profit
Sell MaxPosicao Shares Next Bar At (PrecoEntrada - StopLoss) Stop;
Sell MaxPosicao Shares Next Bar At (PrecoEntrada + TakeProfit) Limit;
Print("COMPRA executada em: ", PrecoEntrada:0:2);
End;
Procedure AbrirVenda();
Begin
If PosicaoAberta Then Exit;
SellShort MaxPosicao Shares Next Bar At Market;
PosicaoAberta := True;
PrecoEntrada := Close;
BarrasEntrada := 0;
BreakEvenAtivo := False;
UltimaOperacao := Time;
// Configurar stop loss e take profit
BuyToCover MaxPosicao Shares Next Bar At (PrecoEntrada + StopLoss) Stop;
BuyToCover MaxPosicao Shares Next Bar At (PrecoEntrada - TakeProfit) Limit;
Print("VENDA executada em: ", PrecoEntrada:0:2);
End;
Procedure GerenciarPosicao();
Var
TempoEmPosicao: Integer;
LucroAtual: Float;
Begin
BarrasEntrada := BarrasEntrada + 1;
TempoEmPosicao := BarrasEntrada;
// Calcular lucro atual
If Position > 0 Then
LucroAtual := Close - PrecoEntrada
Else
LucroAtual := PrecoEntrada - Close;
// Ativar break even se configurado
If UsarBreakEven And Not BreakEvenAtivo And (LucroAtual >= PontosBreakEven) Then
Begin
If Position > 0 Then
Sell MaxPosicao Shares Next Bar At PrecoEntrada Stop
Else
BuyToCover MaxPosicao Shares Next Bar At PrecoEntrada Stop;
BreakEvenAtivo := True;
Print("Break Even ativado");
End;
// Fechar por tempo máximo
If TempoEmPosicao >= TempoMaxPosicao Then
Begin
FecharPosicao();
End;
End;
Procedure FecharPosicao();
Begin
If Position > 0 Then
Sell Position Shares Next Bar At Market
Else If Position < 0 Then
BuyToCover Abs(Position) Shares Next Bar At Market;
PosicaoAberta := False;
BarrasEntrada := 0;
BreakEvenAtivo := False;
Print("Posição fechada");
End;