This repository has been archived on 2025-12-11. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
npp-hft-winq25-scalper/WINQ25_HFT_Scalper.ntsl

273 lines
7.4 KiB
Text
Raw Permalink Normal View History

2025-08-01 12:20:50 -03:00
// ============================================================================
// ROBÔ HFT SCALPER WINQ25 - NELOGICA PROFIT PRO 5.0
// Versão 1.0 - Estratégia Price Action Scalper
// Mercado: BMF - Futuro WINQ25
// Timeframe: M1 (1 minuto)
// Horário: 08:55 às 18:00 (Segunda a Sexta)
// ============================================================================
// CONFIGURAÇÕES BÁSICAS
2025-08-05 20:12:23 -03:00
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;
2025-08-01 12:20:50 -03:00
2025-08-05 20:12:23 -03:00
// ============================================================================
// 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;
2025-08-01 12:20:50 -03:00
// ============================================================================
// FUNÇÃO PRINCIPAL
// ============================================================================
Begin
// Verificar horário de operação (08:55 às 18:00, Segunda a Sexta)
2025-08-05 20:12:23 -03:00
If Not HorarioOperacao() Then
Begin
If PosicaoAberta Then
FecharPosicao();
2025-08-01 12:20:50 -03:00
Exit;
2025-08-05 20:12:23 -03:00
End;
2025-08-01 12:20:50 -03:00
// Calcular indicadores técnicos
CalcularIndicadores();
// Verificar se pode operar (cooldown)
2025-08-05 20:12:23 -03:00
If (Time - UltimaOperacao) < (IntervaloCooldown / 1440) Then
2025-08-01 12:20:50 -03:00
Exit;
// Gerenciar posição existente
2025-08-05 20:12:23 -03:00
If PosicaoAberta Then
Begin
2025-08-01 12:20:50 -03:00
GerenciarPosicao();
Exit;
2025-08-05 20:12:23 -03:00
End;
2025-08-01 12:20:50 -03:00
// Identificar setups de entrada
IdentificarSetups();
// Executar entradas
2025-08-05 20:12:23 -03:00
If CompraSetup And ValidarEntrada() Then
2025-08-01 12:20:50 -03:00
AbrirCompra();
2025-08-05 20:12:23 -03:00
If VendaSetup And ValidarEntrada() Then
2025-08-01 12:20:50 -03:00
AbrirVenda();
// Atualizar variáveis
PrecoAnterior := Close;
End;
// ============================================================================
// FUNÇÕES AUXILIARES
// ============================================================================
Function HorarioOperacao(): Boolean;
2025-08-05 20:12:23 -03:00
Var
2025-08-01 12:20:50 -03:00
HoraAtual: Integer;
MinutoAtual: Integer;
DiaSemana: Integer;
2025-08-05 20:12:23 -03:00
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
2025-08-01 12:20:50 -03:00
Result := False;
Exit;
2025-08-05 20:12:23 -03:00
End;
2025-08-01 12:20:50 -03:00
// Das 08:55 às 18:00
2025-08-05 20:12:23 -03:00
If (HoraAtual = 8) And (MinutoAtual >= 55) Then
2025-08-01 12:20:50 -03:00
Result := True
2025-08-05 20:12:23 -03:00
Else If (HoraAtual >= 9) And (HoraAtual < 18) Then
2025-08-01 12:20:50 -03:00
Result := True
2025-08-05 20:12:23 -03:00
Else
2025-08-01 12:20:50 -03:00
Result := False;
2025-08-05 20:12:23 -03:00
End;
2025-08-01 12:20:50 -03:00
Procedure CalcularIndicadores();
2025-08-05 20:12:23 -03:00
Begin
2025-08-01 12:20:50 -03:00
MA := Average(Close, PeriodoMA);
VolumeAtual := Volume;
2025-08-05 20:12:23 -03:00
End;
2025-08-01 12:20:50 -03:00
Procedure IdentificarSetups();
2025-08-05 20:12:23 -03:00
Var
2025-08-01 12:20:50 -03:00
ForcaAlta: Boolean;
ForcaBaixa: Boolean;
VolumeBom: Boolean;
2025-08-05 20:12:23 -03:00
Begin
2025-08-01 12:20:50 -03:00
CompraSetup := False;
VendaSetup := False;
// Verificar volume adequado
VolumeBom := VolumeAtual >= VolumeMinimo;
2025-08-05 20:12:23 -03:00
If Not VolumeBom Then Exit;
2025-08-01 12:20:50 -03:00
// Setup de compra: preço acima da MA e movimento forte para cima
2025-08-05 20:12:23 -03:00
ForcaAlta := (Close > MA) And
(Close > Open) And
((High - Low) >= MinVariacao) And
2025-08-01 12:20:50 -03:00
(Close > PrecoAnterior + MinVariacao/2);
// Setup de venda: preço abaixo da MA e movimento forte para baixo
2025-08-05 20:12:23 -03:00
ForcaBaixa := (Close < MA) And
(Close < Open) And
((High - Low) >= MinVariacao) And
2025-08-01 12:20:50 -03:00
(Close < PrecoAnterior - MinVariacao/2);
CompraSetup := ForcaAlta;
VendaSetup := ForcaBaixa;
2025-08-05 20:12:23 -03:00
End;
2025-08-01 12:20:50 -03:00
Function ValidarEntrada(): Boolean;
2025-08-05 20:12:23 -03:00
Begin
2025-08-01 12:20:50 -03:00
// Não operar se já teve operação recente
2025-08-05 20:12:23 -03:00
If (Time - UltimaOperacao) < (IntervaloCooldown / 1440) Then
Begin
2025-08-01 12:20:50 -03:00
Result := False;
Exit;
2025-08-05 20:12:23 -03:00
End;
2025-08-01 12:20:50 -03:00
// Não operar nos últimos 15 minutos do pregão
2025-08-05 20:12:23 -03:00
If (Hour(Time) >= 17) And (Minute(Time) >= 45) Then
Begin
2025-08-01 12:20:50 -03:00
Result := False;
Exit;
2025-08-05 20:12:23 -03:00
End;
2025-08-01 12:20:50 -03:00
Result := True;
2025-08-05 20:12:23 -03:00
End;
2025-08-01 12:20:50 -03:00
Procedure AbrirCompra();
2025-08-05 20:12:23 -03:00
Begin
If PosicaoAberta Then Exit;
2025-08-01 12:20:50 -03:00
2025-08-05 20:12:23 -03:00
Buy MaxPosicao Shares Next Bar At Market;
2025-08-01 12:20:50 -03:00
PosicaoAberta := True;
PrecoEntrada := Close;
BarrasEntrada := 0;
BreakEvenAtivo := False;
2025-08-05 20:12:23 -03:00
UltimaOperacao := Time;
2025-08-01 12:20:50 -03:00
// Configurar stop loss e take profit
2025-08-05 20:12:23 -03:00
Sell MaxPosicao Shares Next Bar At (PrecoEntrada - StopLoss) Stop;
Sell MaxPosicao Shares Next Bar At (PrecoEntrada + TakeProfit) Limit;
2025-08-01 12:20:50 -03:00
2025-08-05 20:12:23 -03:00
Print("COMPRA executada em: ", PrecoEntrada:0:2);
End;
2025-08-01 12:20:50 -03:00
Procedure AbrirVenda();
2025-08-05 20:12:23 -03:00
Begin
If PosicaoAberta Then Exit;
2025-08-01 12:20:50 -03:00
2025-08-05 20:12:23 -03:00
SellShort MaxPosicao Shares Next Bar At Market;
2025-08-01 12:20:50 -03:00
PosicaoAberta := True;
PrecoEntrada := Close;
BarrasEntrada := 0;
BreakEvenAtivo := False;
2025-08-05 20:12:23 -03:00
UltimaOperacao := Time;
2025-08-01 12:20:50 -03:00
// Configurar stop loss e take profit
2025-08-05 20:12:23 -03:00
BuyToCover MaxPosicao Shares Next Bar At (PrecoEntrada + StopLoss) Stop;
BuyToCover MaxPosicao Shares Next Bar At (PrecoEntrada - TakeProfit) Limit;
2025-08-01 12:20:50 -03:00
2025-08-05 20:12:23 -03:00
Print("VENDA executada em: ", PrecoEntrada:0:2);
End;
2025-08-01 12:20:50 -03:00
Procedure GerenciarPosicao();
2025-08-05 20:12:23 -03:00
Var
2025-08-01 12:20:50 -03:00
TempoEmPosicao: Integer;
2025-08-05 20:12:23 -03:00
LucroAtual: Float;
Begin
2025-08-01 12:20:50 -03:00
BarrasEntrada := BarrasEntrada + 1;
TempoEmPosicao := BarrasEntrada;
// Calcular lucro atual
2025-08-05 20:12:23 -03:00
If Position > 0 Then
2025-08-01 12:20:50 -03:00
LucroAtual := Close - PrecoEntrada
2025-08-05 20:12:23 -03:00
Else
2025-08-01 12:20:50 -03:00
LucroAtual := PrecoEntrada - Close;
// Ativar break even se configurado
2025-08-05 20:12:23 -03:00
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;
2025-08-01 12:20:50 -03:00
BreakEvenAtivo := True;
Print("Break Even ativado");
2025-08-05 20:12:23 -03:00
End;
2025-08-01 12:20:50 -03:00
// Fechar por tempo máximo
2025-08-05 20:12:23 -03:00
If TempoEmPosicao >= TempoMaxPosicao Then
Begin
FecharPosicao();
End;
End;
2025-08-01 12:20:50 -03:00
2025-08-05 20:12:23 -03:00
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;
2025-08-01 12:20:50 -03:00
PosicaoAberta := False;
BarrasEntrada := 0;
BreakEvenAtivo := False;
2025-08-05 20:12:23 -03:00
Print("Posição fechada");
End;