mt5-forex-xau-scalper-m1/Test_Script.mq5
2025-08-13 06:28:41 -03:00

398 lines
No EOL
16 KiB
MQL5

//+------------------------------------------------------------------+
//| Test_Script.mq5 |
//| Copyright 2024, Scalper HFT Systems Ltd. |
//| https://www.mql5.com/pt/users |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Scalper HFT Systems Ltd."
#property link "https://www.mql5.com/pt/users"
#property version "1.00"
#property script_show_inputs
#property description "Script de Teste para Validar Configurações do HFT Scalper"
#property description "Execute este script antes de usar o EA para verificar compatibilidade"
#include "HFT_Scalper_Profiles.mqh"
#include "FBS_Broker_Config.mqh"
//--- Input parameters
input group "=== CONFIGURAÇÕES DE TESTE ==="
input bool TestBrokerCompatibility = true; // Testar compatibilidade com broker
input bool TestSymbolInfo = true; // Testar informações do símbolo
input bool TestConnectionQuality = true; // Testar qualidade da conexão
input bool TestIndicators = true; // Testar criação de indicadores
input bool TestTradingConditions = true; // Testar condições de trading
input bool TestPerformanceMetrics = true; // Testar métricas de performance
input bool ShowDetailedReport = true; // Mostrar relatório detalhado
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
Print("=== INICIANDO TESTE DO HFT SCALPER ===");
Print("Horário do teste: ", TimeToString(TimeCurrent()));
string final_report = "";
bool all_tests_passed = true;
// Teste 1: Compatibilidade com Broker
if(TestBrokerCompatibility)
{
Print("\n--- TESTE 1: COMPATIBILIDADE COM BROKER ---");
bool broker_test = TestBroker();
final_report += "Broker: " + (broker_test ? "✅ PASSOU" : "❌ FALHOU") + "\n";
if(!broker_test) all_tests_passed = false;
}
// Teste 2: Informações do Símbolo
if(TestSymbolInfo)
{
Print("\n--- TESTE 2: INFORMAÇÕES DO SÍMBOLO ---");
bool symbol_test = TestSymbol();
final_report += "Símbolo: " + (symbol_test ? "✅ PASSOU" : "❌ FALHOU") + "\n";
if(!symbol_test) all_tests_passed = false;
}
// Teste 3: Qualidade da Conexão
if(TestConnectionQuality)
{
Print("\n--- TESTE 3: QUALIDADE DA CONEXÃO ---");
bool connection_test = TestConnection();
final_report += "Conexão: " + (connection_test ? "✅ PASSOU" : "❌ FALHOU") + "\n";
if(!connection_test) all_tests_passed = false;
}
// Teste 4: Indicadores
if(TestIndicators)
{
Print("\n--- TESTE 4: CRIAÇÃO DE INDICADORES ---");
bool indicators_test = TestIndicatorsCreation();
final_report += "Indicadores: " + (indicators_test ? "✅ PASSOU" : "❌ FALHOU") + "\n";
if(!indicators_test) all_tests_passed = false;
}
// Teste 5: Condições de Trading
if(TestTradingConditions)
{
Print("\n--- TESTE 5: CONDIÇÕES DE TRADING ---");
bool trading_test = TestTradingEnvironment();
final_report += "Trading: " + (trading_test ? "✅ PASSOU" : "❌ FALHOU") + "\n";
if(!trading_test) all_tests_passed = false;
}
// Teste 6: Métricas de Performance
if(TestPerformanceMetrics)
{
Print("\n--- TESTE 6: MÉTRICAS DE PERFORMANCE ---");
bool performance_test = TestPerformance();
final_report += "Performance: " + (performance_test ? "✅ PASSOU" : "❌ FALHOU") + "\n";
if(!performance_test) all_tests_passed = false;
}
// Relatório Final
Print("\n=== RELATÓRIO FINAL ===");
Print(final_report);
if(all_tests_passed)
{
Print("🎉 TODOS OS TESTES PASSARAM! O EA está pronto para uso.");
Alert("✅ TESTE COMPLETO - Sistema aprovado para trading!");
}
else
{
Print("⚠️ ALGUNS TESTES FALHARAM! Verifique os problemas antes de usar o EA.");
Alert("❌ TESTE FALHOU - Corrija os problemas antes de continuar!");
}
// Relatório detalhado
if(ShowDetailedReport)
{
ShowDetailedSystemReport();
}
}
//+------------------------------------------------------------------+
//| Testar compatibilidade com broker |
//+------------------------------------------------------------------+
bool TestBroker()
{
string broker_name = AccountInfoString(ACCOUNT_COMPANY);
Print("Nome do Broker: ", broker_name);
// Verificar se é FBS
bool is_fbs = FBSValidation::ValidateBroker();
Print("É FBS: ", is_fbs ? "Sim" : "Não");
// Verificar tipo de conta
ENUM_ACCOUNT_TRADE_MODE trade_mode = (ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE);
string mode_str = "";
switch(trade_mode)
{
case ACCOUNT_TRADE_MODE_DEMO: mode_str = "Demo"; break;
case ACCOUNT_TRADE_MODE_REAL: mode_str = "Real"; break;
case ACCOUNT_TRADE_MODE_CONTEST: mode_str = "Contest"; break;
default: mode_str = "Desconhecido"; break;
}
Print("Tipo de Conta: ", mode_str);
// Verificar se permite EAs
bool ea_allowed = TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) &&
MQLInfoInteger(MQL_TRADE_ALLOWED);
Print("EAs Permitidos: ", ea_allowed ? "Sim" : "Não");
// Verificar margem disponível
double free_margin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
Print("Margem Livre: $", free_margin);
return ea_allowed && free_margin > 100.0;
}
//+------------------------------------------------------------------+
//| Testar informações do símbolo |
//+------------------------------------------------------------------+
bool TestSymbol()
{
string symbol = Symbol();
Print("Símbolo Atual: ", symbol);
// Verificar se é XAU/USD
bool valid_symbol = FBSValidation::ValidateSymbol();
Print("Símbolo Válido: ", valid_symbol ? "Sim" : "Não");
if(!valid_symbol)
{
Print("❌ ERRO: Este EA funciona apenas com XAU/USD!");
return false;
}
// Informações do símbolo
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
double min_lot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
double max_lot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
double lot_step = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
Print("Point: ", point);
Print("Digits: ", digits);
Print("Lote Mínimo: ", min_lot);
Print("Lote Máximo: ", max_lot);
Print("Step do Lote: ", lot_step);
// Verificar spread atual
double spread = SymbolInfoInteger(symbol, SYMBOL_SPREAD) * point;
Print("Spread Atual: ", spread, " (", SymbolInfoInteger(symbol, SYMBOL_SPREAD), " pontos)");
bool spread_ok = FBSValidation::ValidateSpread();
Print("Spread Aceitável: ", spread_ok ? "Sim" : "Não");
// Verificar horário de trading
datetime market_open = (datetime)SymbolInfoInteger(symbol, SYMBOL_TIME);
bool market_open_status = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_FULL;
Print("Mercado Aberto: ", market_open_status ? "Sim" : "Não");
Print("Última Cotação: ", TimeToString(market_open));
return valid_symbol && spread_ok && market_open_status;
}
//+------------------------------------------------------------------+
//| Testar qualidade da conexão |
//+------------------------------------------------------------------+
bool TestConnection()
{
bool connected = TerminalInfoInteger(TERMINAL_CONNECTED);
double ping = TerminalInfoInteger(TERMINAL_PING_LAST);
Print("Conectado: ", connected ? "Sim" : "Não");
Print("Ping: ", ping, "ms");
string connection_status = FBSConnectionConfig::GetConnectionStatus();
Print("Status da Conexão: ", connection_status);
// Verificar estabilidade
bool stable_connection = FBSConnectionConfig::IsConnectionGood();
Print("Conexão Estável: ", stable_connection ? "Sim" : "Não");
// Testar velocidade de resposta
datetime start_time = GetMicrosecondCount();
double bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
double ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
datetime end_time = GetMicrosecondCount();
double response_time = (double)(end_time - start_time) / 1000.0; // em ms
Print("Tempo de Resposta: ", response_time, "ms");
Print("Bid: ", bid, " | Ask: ", ask);
return connected && ping < 200 && response_time < 10;
}
//+------------------------------------------------------------------+
//| Testar criação de indicadores |
//+------------------------------------------------------------------+
bool TestIndicatorsCreation()
{
// Testar criação de EMAs
int ema_fast = iMA(Symbol(), PERIOD_M1, 5, 0, MODE_EMA, PRICE_CLOSE);
int ema_slow = iMA(Symbol(), PERIOD_M1, 10, 0, MODE_EMA, PRICE_CLOSE);
int rsi = iRSI(Symbol(), PERIOD_M1, 7, PRICE_CLOSE);
bool ema_fast_ok = (ema_fast != INVALID_HANDLE);
bool ema_slow_ok = (ema_slow != INVALID_HANDLE);
bool rsi_ok = (rsi != INVALID_HANDLE);
Print("EMA Rápida (5): ", ema_fast_ok ? "✅ OK" : "❌ ERRO");
Print("EMA Lenta (10): ", ema_slow_ok ? "✅ OK" : "❌ ERRO");
Print("RSI (7): ", rsi_ok ? "✅ OK" : "❌ ERRO");
if(ema_fast_ok && ema_slow_ok && rsi_ok)
{
// Testar leitura de dados
double ema_fast_data[];
double ema_slow_data[];
double rsi_data[];
ArraySetAsSeries(ema_fast_data, true);
ArraySetAsSeries(ema_slow_data, true);
ArraySetAsSeries(rsi_data, true);
int ema_fast_copied = CopyBuffer(ema_fast, 0, 0, 3, ema_fast_data);
int ema_slow_copied = CopyBuffer(ema_slow, 0, 0, 3, ema_slow_data);
int rsi_copied = CopyBuffer(rsi, 0, 0, 3, rsi_data);
bool data_ok = (ema_fast_copied > 0 && ema_slow_copied > 0 && rsi_copied > 0);
Print("Leitura de Dados: ", data_ok ? "✅ OK" : "❌ ERRO");
if(data_ok)
{
Print("EMA Rápida[0]: ", ema_fast_data[0]);
Print("EMA Lenta[0]: ", ema_slow_data[0]);
Print("RSI[0]: ", rsi_data[0]);
}
// Limpar handles
IndicatorRelease(ema_fast);
IndicatorRelease(ema_slow);
IndicatorRelease(rsi);
return data_ok;
}
return false;
}
//+------------------------------------------------------------------+
//| Testar ambiente de trading |
//+------------------------------------------------------------------+
bool TestTradingEnvironment()
{
// Verificar timeframe
ENUM_TIMEFRAMES current_period = _Period;
bool correct_timeframe = (current_period == PERIOD_M1);
Print("Timeframe M1: ", correct_timeframe ? "✅ OK" : "❌ ERRO (atual: " + EnumToString(current_period) + ")");
// Verificar horário de trading
bool good_time = FBSTradingHours::IsGoodTradingTime();
bool bad_time = FBSTradingHours::IsBadTradingTime();
string session = FBSTradingHours::GetCurrentSession();
Print("Bom Horário: ", good_time ? "✅ Sim" : "❌ Não");
Print("Horário Ruim: ", bad_time ? "❌ Sim" : "✅ Não");
Print("Sessão Atual: ", session);
// Verificar configurações de trading
bool trading_allowed = TerminalInfoInteger(TERMINAL_TRADE_ALLOWED);
bool ea_trading = MQLInfoInteger(MQL_TRADE_ALLOWED);
Print("Trading Permitido: ", trading_allowed ? "✅ Sim" : "❌ Não");
Print("EA Trading: ", ea_trading ? "✅ Sim" : "❌ Não");
// Verificar margem
bool margin_ok = FBSMonitoring::CheckMarginLevel();
double margin_level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL);
Print("Nível de Margem: ", margin_level, "%");
Print("Margem OK: ", margin_ok ? "✅ Sim" : "❌ Não");
return correct_timeframe && trading_allowed && ea_trading && margin_ok;
}
//+------------------------------------------------------------------+
//| Testar métricas de performance |
//+------------------------------------------------------------------+
bool TestPerformance()
{
// Informações da conta
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
double margin = AccountInfoDouble(ACCOUNT_MARGIN);
double free_margin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
Print("Saldo: $", balance);
Print("Equity: $", equity);
Print("Margem: $", margin);
Print("Margem Livre: $", free_margin);
// Verificar capital adequado
bool adequate_capital = FBSValidation::ValidateBalance(100.0);
Print("Capital Adequado: ", adequate_capital ? "✅ Sim" : "❌ Não");
// Calcular lote recomendado
double recommended_lot = MoneyManagement::CalculateLotSize(balance, 2.0);
Print("Lote Recomendado: ", recommended_lot);
// Verificar configurações de risco
bool risk_ok = (recommended_lot >= 0.01 && recommended_lot <= 1.0);
Print("Configuração de Risco: ", risk_ok ? "✅ OK" : "❌ REVISAR");
return adequate_capital && risk_ok;
}
//+------------------------------------------------------------------+
//| Mostrar relatório detalhado do sistema |
//+------------------------------------------------------------------+
void ShowDetailedSystemReport()
{
Print("\n=== RELATÓRIO DETALHADO DO SISTEMA ===");
// Validação FBS
string fbs_report = FBSValidation::GetValidationReport();
Print(fbs_report);
// Informações do terminal
Print("\n--- INFORMAÇÕES DO TERMINAL ---");
Print("Nome: ", TerminalInfoString(TERMINAL_NAME));
Print("Empresa: ", TerminalInfoString(TERMINAL_COMPANY));
Print("Caminho: ", TerminalInfoString(TERMINAL_PATH));
Print("Build: ", TerminalInfoInteger(TERMINAL_BUILD));
Print("Conectado: ", TerminalInfoInteger(TERMINAL_CONNECTED) ? "Sim" : "Não");
Print("DLLs Permitidas: ", TerminalInfoInteger(TERMINAL_DLLS_ALLOWED) ? "Sim" : "Não");
Print("Trading Permitido: ", TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) ? "Sim" : "Não");
// Informações da conta
Print("\n--- INFORMAÇÕES DA CONTA ---");
Print("Servidor: ", AccountInfoString(ACCOUNT_SERVER));
Print("Nome: ", AccountInfoString(ACCOUNT_NAME));
Print("Número: ", AccountInfoInteger(ACCOUNT_LOGIN));
Print("Moeda: ", AccountInfoString(ACCOUNT_CURRENCY));
Print("Alavancagem: 1:", AccountInfoInteger(ACCOUNT_LEVERAGE));
// Configurações recomendadas
Print("\n--- CONFIGURAÇÕES RECOMENDADAS ---");
if(FBSValidation::ValidateBroker())
{
Print("Para FBS:");
Print("- Lote: ", FBSOptimizedConfig::LotSize());
Print("- Stop Loss: ", FBSOptimizedConfig::StopLoss(), " pips");
Print("- Take Profit: ", FBSOptimizedConfig::TakeProfit(), " pips");
Print("- Max Spread: ", FBSOptimizedConfig::MaxSpread(), " pips");
Print("- Slippage: ", FBSOptimizedConfig::Slippage(), " pontos");
}
else
{
Print("Para Broker Genérico:");
Print("- Lote: ", ModerateProfile::LotSize());
Print("- Stop Loss: ", ModerateProfile::StopLoss(), " pips");
Print("- Take Profit: ", ModerateProfile::TakeProfit(), " pips");
Print("- Max Spread: ", ModerateProfile::MaxSpread(), " pips");
}
Print("\n=== FIM DO RELATÓRIO ===");
}