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-wdou25-scalper/robo_hft_wdou25_scalper.ntsl

262 lines
9 KiB
Text
Raw Permalink Normal View History

2025-07-31 10:25:28 -03:00
// ============================================================================
// ROBÔ HFT SCALPER WDOU25 - NELOGICA PROFIT PRO 5.0
// Versão: 1.0
// Desenvolvido para operar apenas na abertura do leilão BMF (08:55 - 09:15)
// ============================================================================
// CONFIGURAÇÕES GERAIS
strategy WDO_HFT_Scalper;
// VARIÁVEIS DE CONFIGURAÇÃO
inputs:
TakeProfit(4), // Take Profit em pontos (padrão: 4 pontos)
StopLoss(6), // Stop Loss em pontos (padrão: 6 pontos)
QuantidadeContratos(1), // Quantidade de contratos por operação
MaxOperacoesDia(20), // Máximo de operações por dia
HorarioInicioHora(8), // Hora de início (08:55)
HorarioInicioMinuto(55), // Minuto de início
HorarioFimHora(9), // Hora de fim (09:15)
HorarioFimMinuto(15), // Minuto de fim
VolumeMinimo(100), // Volume mínimo para considerar operação
DiferencaBooking(2); // Diferença mínima entre compra e venda no booking
// VARIÁVEIS DE CONTROLE
variables:
OperacoesRealizadas(0), // Contador de operações do dia
Posicionado(false), // Flag de posicionamento
UltimaOperacao(0), // Timestamp da última operação
PrecoCompra(0), // Preço de compra atual
PrecoVenda(0), // Preço de venda atual
VolumeCompra(0), // Volume de compra no booking
VolumeVenda(0), // Volume de venda no booking
SpreadAtual(0), // Spread atual do mercado
TendenciaCompra(false), // Tendência de compra
TendenciaVenda(false), // Tendência de venda
HorarioAtual(0), // Horário atual em minutos
DentroHorario(false), // Flag de horário de operação
PrecoUltimaNegociacao(0), // Preço da última negociação
VolumeUltimaNegociacao(0); // Volume da última negociação
// ============================================================================
// FUNÇÃO PRINCIPAL DE INICIALIZAÇÃO
// ============================================================================
once begin
// Resetar contadores no início do dia
OperacoesRealizadas := 0;
Posicionado := false;
// Configurar parâmetros do mercado
SetOrderType(Market);
SetBrokerageModel(ByTrade);
// Log de inicialização
Print("Robô HFT WDOU25 Scalper iniciado");
Print("Horário de operação: ", HorarioInicioHora, ":", HorarioInicioMinuto,
" às ", HorarioFimHora, ":", HorarioFimMinuto);
end;
// ============================================================================
// VERIFICAÇÃO DE HORÁRIO DE OPERAÇÃO
// ============================================================================
function VerificarHorarioOperacao() : boolean;
begin
HorarioAtual := Hour * 60 + Minute;
// Calcular horários em minutos
var HorarioInicio := HorarioInicioHora * 60 + HorarioInicioMinuto;
var HorarioFim := HorarioFimHora * 60 + HorarioFimMinuto;
// Verificar se está dentro do horário de operação
if (HorarioAtual >= HorarioInicio) and (HorarioAtual <= HorarioFim) then
result := true
else
result := false;
end;
// ============================================================================
// LEITURA DO BOOKING DE OFERTAS
// ============================================================================
function LerBookingOfertas() : boolean;
begin
// Obter dados do Level 2 (Booking)
PrecoCompra := BidPrice(0); // Melhor preço de compra
PrecoVenda := AskPrice(0); // Melhor preço de venda
VolumeCompra := BidSize(0); // Volume na melhor compra
VolumeVenda := AskSize(0); // Volume na melhor venda
// Calcular spread
SpreadAtual := PrecoVenda - PrecoCompra;
// Verificar se os dados são válidos
if (PrecoCompra > 0) and (PrecoVenda > 0) and
(VolumeCompra >= VolumeMinimo) and (VolumeVenda >= VolumeMinimo) then
result := true
else
result := false;
end;
// ============================================================================
// ANÁLISE DE TENDÊNCIA BASEADA EM TIMES & TRADES
// ============================================================================
function AnalisarTendencia() : boolean;
begin
TendenciaCompra := false;
TendenciaVenda := false;
// Obter dados do último trade
PrecoUltimaNegociacao := Close;
VolumeUltimaNegociacao := Volume;
// Análise baseada na direção do último trade
if PrecoUltimaNegociacao >= PrecoVenda then
begin
// Trade aconteceu no ask (tendência de compra)
TendenciaCompra := true;
result := true;
end
else if PrecoUltimaNegociacao <= PrecoCompra then
begin
// Trade aconteceu no bid (tendência de venda)
TendenciaVenda := true;
result := true;
end
else
result := false;
end;
// ============================================================================
// VERIFICAÇÃO DE CONDIÇÕES DE ENTRADA
// ============================================================================
function VerificarCondicoesEntrada() : boolean;
begin
result := false;
// Verificar se pode operar
if (OperacoesRealizadas >= MaxOperacoesDia) or Posicionado then
exit;
// Verificar horário
if not VerificarHorarioOperacao() then
exit;
// Verificar booking
if not LerBookingOfertas() then
exit;
// Verificar spread mínimo
if SpreadAtual < DiferencaBooking then
exit;
// Verificar tendência
if not AnalisarTendencia() then
exit;
result := true;
end;
// ============================================================================
// EXECUÇÃO DE COMPRA
// ============================================================================
procedure ExecutarCompra();
begin
if MarketPosition = 0 then
begin
Buy(QuantidadeContratos) shares next bar at market;
Posicionado := true;
OperacoesRealizadas := OperacoesRealizadas + 1;
UltimaOperacao := CurrentTime;
Print("COMPRA executada - Preço: ", PrecoVenda, " Operação: ", OperacoesRealizadas);
end;
end;
// ============================================================================
// EXECUÇÃO DE VENDA
// ============================================================================
procedure ExecutarVenda();
begin
if MarketPosition = 0 then
begin
SellShort(QuantidadeContratos) shares next bar at market;
Posicionado := true;
OperacoesRealizadas := OperacoesRealizadas + 1;
UltimaOperacao := CurrentTime;
Print("VENDA executada - Preço: ", PrecoCompra, " Operação: ", OperacoesRealizadas);
end;
end;
// ============================================================================
// GERENCIAMENTO DE POSIÇÃO E SAÍDAS
// ============================================================================
procedure GerenciarPosicao();
begin
if MarketPosition <> 0 then
begin
// Configurar Stop Loss e Take Profit
if MarketPosition > 0 then
begin
// Posição comprada
Sell next bar at EntryPrice + TakeProfit stop;
Sell next bar at EntryPrice - StopLoss limit;
end
else if MarketPosition < 0 then
begin
// Posição vendida
BuyToCover next bar at EntryPrice - TakeProfit stop;
BuyToCover next bar at EntryPrice + StopLoss limit;
end;
end
else
begin
Posicionado := false;
end;
end;
// ============================================================================
// FECHAMENTO FORÇADO NO FINAL DO HORÁRIO
// ============================================================================
procedure FecharPosicaoFinal();
begin
if (not VerificarHorarioOperacao()) and (MarketPosition <> 0) then
begin
if MarketPosition > 0 then
Sell next bar at market
else if MarketPosition < 0 then
BuyToCover next bar at market;
Print("Posição fechada por fim do horário de operação");
Posicionado := false;
end;
end;
// ============================================================================
// LÓGICA PRINCIPAL DO ROBÔ
// ============================================================================
begin
// Verificar condições gerais
if not VerificarCondicoesEntrada() then
begin
GerenciarPosicao();
FecharPosicaoFinal();
exit;
end;
// Lógica de entrada baseada na tendência identificada
if TendenciaCompra and (VolumeCompra > VolumeVenda * 1.2) then
begin
// Forte tendência de compra com volume significativo
ExecutarCompra();
end
else if TendenciaVenda and (VolumeVenda > VolumeCompra * 1.2) then
begin
// Forte tendência de venda com volume significativo
ExecutarVenda();
end;
// Gerenciar posições existentes
GerenciarPosicao();
// Verificar fechamento por horário
FecharPosicaoFinal();
end;