262 lines
9 KiB
Text
262 lines
9 KiB
Text
|
|
// ============================================================================
|
||
|
|
// 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;
|