273 lines
No EOL
7.4 KiB
Text
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; |