initial: import DOLPHIN baseline 2026-04-21 from dolphinng5_predict working tree
Includes core prod + GREEN/BLUE subsystems: - prod/ (BLUE harness, configs, scripts, docs) - nautilus_dolphin/ (GREEN Nautilus-native impl + dvae/ preserved) - adaptive_exit/ (AEM engine + models/bucket_assignments.pkl) - Observability/ (EsoF advisor, TUI, dashboards) - external_factors/ (EsoF producer) - mc_forewarning_qlabs_fork/ (MC regime/envelope) Excludes runtime caches, logs, backups, and reproducible artifacts per .gitignore.
This commit is contained in:
257
nautilus_dolphin/tests/test_0_nautilus_bootstrap.py
Executable file
257
nautilus_dolphin/tests/test_0_nautilus_bootstrap.py
Executable file
@@ -0,0 +1,257 @@
|
||||
"""
|
||||
Test 0: Nautilus Bootstrap - Sine Qua Non
|
||||
=========================================
|
||||
|
||||
This test MUST pass before any other Nautilus-Dolphin tests.
|
||||
It verifies that:
|
||||
1. Nautilus Trader is installed and functional
|
||||
2. Basic Nautilus components can be imported
|
||||
3. All N-Dolphin Nautilus-dependent components can be imported
|
||||
|
||||
This is the foundation test - if this fails, nothing else will work.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
import sys
|
||||
|
||||
|
||||
def test_nautilus_trader_installed():
|
||||
"""
|
||||
Test 0.0: Verify Nautilus Trader is installed.
|
||||
|
||||
This is the most basic check - can we import Nautilus?
|
||||
"""
|
||||
try:
|
||||
import nautilus_trader
|
||||
from nautilus_trader.common.component import LiveClock, Logger
|
||||
from nautilus_trader.common import Environment
|
||||
from nautilus_trader.system.kernel import NautilusKernel
|
||||
from nautilus_trader.system.config import NautilusKernelConfig
|
||||
from nautilus_trader.model.identifiers import TraderId
|
||||
from nautilus_trader.core.uuid import UUID4
|
||||
print("[Test 0.0] Nautilus Trader imports: SUCCESS")
|
||||
print(f"[Test 0.0] Nautilus Trader version: {nautilus_trader.__version__}")
|
||||
except ImportError as e:
|
||||
pytest.fail(f"Nautilus Trader not installed: {e}. Run: pip install nautilus_trader")
|
||||
|
||||
|
||||
def test_nautilus_basic_config():
|
||||
"""
|
||||
Test 0.1: Verify NautilusKernel config can be created.
|
||||
"""
|
||||
from nautilus_trader.common import Environment
|
||||
from nautilus_trader.model.identifiers import TraderId
|
||||
from nautilus_trader.system.config import NautilusKernelConfig
|
||||
|
||||
config = NautilusKernelConfig(
|
||||
environment=Environment.BACKTEST,
|
||||
trader_id=TraderId("DOLPHIN-001"),
|
||||
)
|
||||
|
||||
assert config is not None
|
||||
assert config.environment == Environment.BACKTEST
|
||||
print("[Test 0.1] NautilusKernelConfig creation: SUCCESS")
|
||||
|
||||
|
||||
def test_nautilus_dolphin_core_imports():
|
||||
"""
|
||||
Test 0.2: Import all N-Dolphin core components.
|
||||
|
||||
These components don't depend on Nautilus.
|
||||
"""
|
||||
from nautilus_dolphin.nautilus.circuit_breaker import CircuitBreakerManager
|
||||
from nautilus_dolphin.nautilus.metrics_monitor import MetricsMonitor
|
||||
from nautilus_dolphin.nautilus.adaptive_circuit_breaker import (
|
||||
AdaptiveCircuitBreaker, ACBConfig, ACBPositionSizer
|
||||
)
|
||||
|
||||
# Verify they work
|
||||
acb = AdaptiveCircuitBreaker()
|
||||
sizer = ACBPositionSizer()
|
||||
|
||||
assert acb is not None
|
||||
assert sizer is not None
|
||||
print("[Test 0.2] N-Dolphin core component imports: SUCCESS")
|
||||
|
||||
|
||||
def test_nautilus_dolphin_strategy_import():
|
||||
"""
|
||||
Test 0.3: Import DolphinExecutionStrategy class.
|
||||
|
||||
Note: Instantiation requires Nautilus StrategyConfig.
|
||||
"""
|
||||
from nautilus_dolphin.nautilus.strategy import DolphinExecutionStrategy
|
||||
|
||||
assert DolphinExecutionStrategy is not None
|
||||
print("[Test 0.3] DolphinExecutionStrategy import: SUCCESS")
|
||||
|
||||
|
||||
def test_nautilus_dolphin_signal_bridge_import():
|
||||
"""
|
||||
Test 0.4: Import SignalBridgeActor class.
|
||||
"""
|
||||
from nautilus_dolphin.nautilus.signal_bridge import SignalBridgeActor
|
||||
|
||||
assert SignalBridgeActor is not None
|
||||
print("[Test 0.4] SignalBridgeActor import: SUCCESS")
|
||||
|
||||
|
||||
def test_nautilus_dolphin_exec_algorithm_import():
|
||||
"""
|
||||
Test 0.5: Import SmartExecAlgorithm class.
|
||||
"""
|
||||
from nautilus_dolphin.nautilus.smart_exec_algorithm import SmartExecAlgorithm
|
||||
|
||||
assert SmartExecAlgorithm is not None
|
||||
print("[Test 0.5] SmartExecAlgorithm import: SUCCESS")
|
||||
|
||||
|
||||
def test_nautilus_dolphin_other_imports():
|
||||
"""
|
||||
Test 0.6: Import remaining Nautilus-dependent components.
|
||||
"""
|
||||
from nautilus_dolphin.nautilus.position_manager import PositionManager
|
||||
from nautilus_dolphin.nautilus.volatility_detector import VolatilityRegimeDetector
|
||||
from nautilus_dolphin.nautilus.data_adapter import JSONEigenvalueDataAdapter, BacktestDataLoader
|
||||
|
||||
print("[Test 0.6] Other Nautilus component imports: SUCCESS")
|
||||
|
||||
|
||||
def test_acb_functionality():
|
||||
"""
|
||||
Test 0.7: Verify ACB works independently.
|
||||
"""
|
||||
from nautilus_dolphin.nautilus.adaptive_circuit_breaker import (
|
||||
AdaptiveCircuitBreaker, ACBPositionSizer
|
||||
)
|
||||
|
||||
acb = AdaptiveCircuitBreaker()
|
||||
sizer = ACBPositionSizer()
|
||||
|
||||
# Test cut calculation for a date
|
||||
final_size, acb_info = acb.apply_cut_to_position_size(
|
||||
base_size=1000.0,
|
||||
date_str="2025-01-01"
|
||||
)
|
||||
|
||||
# Verify cut rate is valid
|
||||
assert final_size >= 0
|
||||
assert acb_info['cut'] in [0.0, 0.15, 0.45, 0.55, 0.75, 0.8]
|
||||
|
||||
# Test position sizing with ACB
|
||||
sized_size, sizing_info = sizer.calculate_size(
|
||||
base_size=1000.0,
|
||||
date_str="2025-01-01"
|
||||
)
|
||||
|
||||
assert sized_size >= 0
|
||||
assert sized_size <= 1000.0 # Should be reduced by cut
|
||||
|
||||
print("[Test 0.7] ACB functionality: SUCCESS")
|
||||
|
||||
|
||||
def test_circuit_breaker_functionality():
|
||||
"""
|
||||
Test 0.8: Verify CircuitBreaker works independently.
|
||||
"""
|
||||
from nautilus_dolphin.nautilus.circuit_breaker import CircuitBreakerManager
|
||||
|
||||
cb = CircuitBreakerManager()
|
||||
|
||||
# Test basic functionality
|
||||
assert not cb.is_tripped() # Should not be tripped initially
|
||||
|
||||
# Test position opening (returns tuple[bool, str])
|
||||
can_open, reason = cb.can_open_position(
|
||||
asset="BTCUSDT",
|
||||
current_balance=10000.0
|
||||
)
|
||||
assert isinstance(can_open, bool)
|
||||
assert isinstance(reason, str)
|
||||
|
||||
# Test status
|
||||
status = cb.get_status()
|
||||
assert 'is_tripped' in status
|
||||
assert 'active_positions' in status
|
||||
|
||||
print("[Test 0.8] CircuitBreaker functionality: SUCCESS")
|
||||
|
||||
|
||||
def test_launcher_import():
|
||||
"""
|
||||
Test 0.9: Verify launcher is importable.
|
||||
"""
|
||||
from nautilus_dolphin.nautilus.launcher import NautilusDolphinLauncher
|
||||
|
||||
assert NautilusDolphinLauncher is not None
|
||||
print("[Test 0.9] Launcher import: SUCCESS")
|
||||
|
||||
|
||||
def test_full_import_chain():
|
||||
"""
|
||||
Test 0.10: Full import chain - all components from top-level.
|
||||
"""
|
||||
from nautilus_dolphin import (
|
||||
# Core
|
||||
CircuitBreakerManager,
|
||||
MetricsMonitor,
|
||||
AdaptiveCircuitBreaker,
|
||||
ACBConfig,
|
||||
ACBPositionSizer,
|
||||
# Nautilus-dependent classes
|
||||
SignalBridgeActor,
|
||||
DolphinExecutionStrategy,
|
||||
SmartExecAlgorithm,
|
||||
PositionManager,
|
||||
VolatilityRegimeDetector,
|
||||
# Launcher
|
||||
NautilusDolphinLauncher,
|
||||
)
|
||||
|
||||
print("[Test 0.10] Full import chain: SUCCESS")
|
||||
print("\n" + "=" * 80)
|
||||
print("ALL TESTS PASSED - NAUTILUS-DOLPHIN SYSTEM IS BOOTABLE")
|
||||
print("=" * 80)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("=" * 80)
|
||||
print("NAUTILUS-DOLPHIN BOOTSTRAP TEST (Test 0)")
|
||||
print("=" * 80)
|
||||
print()
|
||||
|
||||
# Run tests in sequence
|
||||
tests = [
|
||||
("0.0", test_nautilus_trader_installed, "Nautilus Trader installed"),
|
||||
("0.1", test_nautilus_basic_config, "Nautilus kernel config"),
|
||||
("0.2", test_nautilus_dolphin_core_imports, "Core component imports"),
|
||||
("0.3", test_nautilus_dolphin_strategy_import, "Strategy import"),
|
||||
("0.4", test_nautilus_dolphin_signal_bridge_import, "SignalBridge import"),
|
||||
("0.5", test_nautilus_dolphin_exec_algorithm_import, "ExecAlgorithm import"),
|
||||
("0.6", test_nautilus_dolphin_other_imports, "Other component imports"),
|
||||
("0.7", test_acb_functionality, "ACB functionality"),
|
||||
("0.8", test_circuit_breaker_functionality, "CircuitBreaker functionality"),
|
||||
("0.9", test_launcher_import, "Launcher import"),
|
||||
("0.10", test_full_import_chain, "Full import chain"),
|
||||
]
|
||||
|
||||
passed = 0
|
||||
failed = 0
|
||||
|
||||
for num, test_func, desc in tests:
|
||||
try:
|
||||
test_func()
|
||||
print(f"[PASS] Test {num}: {desc}")
|
||||
passed += 1
|
||||
except Exception as e:
|
||||
print(f"[FAIL] Test {num}: {desc}")
|
||||
print(f" Error: {e}")
|
||||
failed += 1
|
||||
|
||||
print()
|
||||
print("=" * 80)
|
||||
print(f"RESULTS: {passed} passed, {failed} failed")
|
||||
print("=" * 80)
|
||||
|
||||
if failed > 0:
|
||||
sys.exit(1)
|
||||
Reference in New Issue
Block a user