123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- #!/usr/bin/env python3
- """
- Test script to verify the integrated TradingStats position tracking system.
- This test ensures that the enhanced position tracking in TradingStats
- works correctly for multi-entry/exit scenarios.
- """
- import sys
- import os
- import tempfile
- from datetime import datetime
- # Add src directory to path
- sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
- from src.stats import TradingStats
- def test_integrated_position_tracking():
- """Test the integrated position tracking system."""
-
- # Create temporary stats file
- with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
- temp_file = f.name
-
- try:
- # Initialize TradingStats
- stats = TradingStats(temp_file)
- stats.set_initial_balance(10000.0)
-
- print("Testing Integrated Position Tracking System")
- print("=" * 50)
-
- # Test Case 1: Simple long position
- print("\n1. Testing simple long position:")
- action_type = stats.record_trade_with_enhanced_tracking("ETH/USDC", "buy", 1.0, 3000.0, "test1")
- print(f" Action: {action_type}")
- position = stats.get_enhanced_position_state("ETH/USDC")
- print(f" Position: {position['contracts']} ETH @ ${position['avg_entry_price']:.2f}")
-
- # Test Case 2: Add to long position
- print("\n2. Adding to long position:")
- action_type = stats.record_trade_with_enhanced_tracking("ETH/USDC", "buy", 0.5, 3100.0, "test2")
- print(f" Action: {action_type}")
- position = stats.get_enhanced_position_state("ETH/USDC")
- print(f" Position: {position['contracts']} ETH @ ${position['avg_entry_price']:.2f}")
-
- # Test Case 3: Partial close
- print("\n3. Partial close of long position:")
- action_type = stats.record_trade_with_enhanced_tracking("ETH/USDC", "sell", 0.5, 3200.0, "test3")
- print(f" Action: {action_type}")
- position = stats.get_enhanced_position_state("ETH/USDC")
- print(f" Remaining position: {position['contracts']} ETH @ ${position['avg_entry_price']:.2f}")
-
- # Calculate P&L for the partial close
- pnl_data = stats.calculate_enhanced_position_pnl("ETH/USDC", 0.5, 3200.0)
- print(f" P&L for partial close: ${pnl_data['pnl']:.2f} ({pnl_data['pnl_percent']:.2f}%)")
-
- # Test Case 4: Full close
- print("\n4. Full close of remaining position:")
- action_type = stats.record_trade_with_enhanced_tracking("ETH/USDC", "sell", 1.0, 3150.0, "test4")
- print(f" Action: {action_type}")
- position = stats.get_enhanced_position_state("ETH/USDC")
- print(f" Final position: {position['contracts']} ETH @ ${position['avg_entry_price']:.2f}")
-
- # Test Case 5: Short position
- print("\n5. Testing short position:")
- action_type = stats.record_trade_with_enhanced_tracking("BTC/USDC", "sell", 0.1, 65000.0, "test5")
- print(f" Action: {action_type}")
- position = stats.get_enhanced_position_state("BTC/USDC")
- print(f" Position: {position['contracts']} BTC @ entry price tracking")
-
- # Test Case 6: Close short position
- print("\n6. Closing short position:")
- action_type = stats.record_trade_with_enhanced_tracking("BTC/USDC", "buy", 0.1, 64500.0, "test6")
- print(f" Action: {action_type}")
- pnl_data = stats.calculate_enhanced_position_pnl("BTC/USDC", 0.1, 64500.0)
- print(f" P&L for short close: ${pnl_data['pnl']:.2f} ({pnl_data['pnl_percent']:.2f}%)")
-
- # Test Case 7: Verify stats consistency
- print("\n7. Verifying stats consistency:")
- basic_stats = stats.get_basic_stats()
- trades_with_pnl = stats.calculate_trade_pnl()
-
- print(f" Total trades recorded: {basic_stats['total_trades']}")
- print(f" Completed trade cycles: {basic_stats['completed_trades']}")
- print(f" Total P&L: ${basic_stats['total_pnl']:.2f}")
-
- # Show all recorded trades
- print("\n8. All trades recorded:")
- for i, trade in enumerate(stats.data['trades'], 1):
- print(f" {i}. {trade['side'].upper()} {trade['amount']} {trade['symbol']} @ ${trade['price']:.2f}")
-
- print("\n✅ Integration test completed successfully!")
- print("🔄 Single source of truth for position tracking established!")
- return True
-
- except Exception as e:
- print(f"❌ Test failed: {e}")
- import traceback
- traceback.print_exc()
- return False
-
- finally:
- # Clean up temp file
- if os.path.exists(temp_file):
- os.unlink(temp_file)
- if __name__ == "__main__":
- success = test_integrated_position_tracking()
- exit(0 if success else 1)
|