folder stricture reorganize
This commit is contained in:
362
tests/test_mexc_order_debug.py
Normal file
362
tests/test_mexc_order_debug.py
Normal file
@ -0,0 +1,362 @@
|
||||
"""
|
||||
MEXC Order Execution Debug Script
|
||||
|
||||
This script tests MEXC order execution step by step to identify any issues
|
||||
with the trading integration.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
import time
|
||||
from datetime import datetime
|
||||
from typing import Dict, Any
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# Add paths for imports
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), 'core'))
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), 'NN'))
|
||||
|
||||
from core.trading_executor import TradingExecutor
|
||||
from core.data_provider import DataProvider
|
||||
from NN.exchanges.mexc_interface import MEXCInterface
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||||
handlers=[
|
||||
logging.FileHandler("mexc_order_debug.log"),
|
||||
logging.StreamHandler()
|
||||
]
|
||||
)
|
||||
logger = logging.getLogger("mexc_debug")
|
||||
|
||||
class MEXCOrderDebugger:
|
||||
"""Debug MEXC order execution step by step"""
|
||||
|
||||
def __init__(self):
|
||||
self.test_symbol = 'ETH/USDC' # ETH with USDC (supported by MEXC API)
|
||||
self.test_quantity = 0.15 # $0.15 worth of ETH for testing (within our balance)
|
||||
|
||||
# Load environment variables
|
||||
load_dotenv()
|
||||
|
||||
self.api_key = os.getenv('MEXC_API_KEY')
|
||||
self.api_secret = os.getenv('MEXC_SECRET_KEY')
|
||||
|
||||
def run_comprehensive_test(self):
|
||||
"""Run comprehensive MEXC order execution test"""
|
||||
print("="*80)
|
||||
print("MEXC ORDER EXECUTION DEBUG TEST")
|
||||
print("="*80)
|
||||
|
||||
# Step 1: Test environment variables
|
||||
print("\n1. Testing Environment Variables...")
|
||||
if not self.test_environment_variables():
|
||||
return False
|
||||
|
||||
# Step 2: Test MEXC interface creation
|
||||
print("\n2. Testing MEXC Interface Creation...")
|
||||
mexc = self.test_mexc_interface_creation()
|
||||
if not mexc:
|
||||
return False
|
||||
|
||||
# Step 3: Test connection
|
||||
print("\n3. Testing MEXC Connection...")
|
||||
if not self.test_mexc_connection(mexc):
|
||||
return False
|
||||
|
||||
# Step 4: Test account info
|
||||
print("\n4. Testing Account Information...")
|
||||
if not self.test_account_info(mexc):
|
||||
return False
|
||||
|
||||
# Step 5: Test ticker data
|
||||
print("\n5. Testing Ticker Data...")
|
||||
current_price = self.test_ticker_data(mexc)
|
||||
if not current_price:
|
||||
return False
|
||||
|
||||
# Step 6: Test trading executor
|
||||
print("\n6. Testing Trading Executor...")
|
||||
executor = self.test_trading_executor_creation()
|
||||
if not executor:
|
||||
return False
|
||||
|
||||
# Step 7: Test order placement (simulation)
|
||||
print("\n7. Testing Order Placement...")
|
||||
if not self.test_order_placement(executor, current_price):
|
||||
return False
|
||||
|
||||
# Step 8: Test order parameters
|
||||
print("\n8. Testing Order Parameters...")
|
||||
if not self.test_order_parameters(mexc, current_price):
|
||||
return False
|
||||
|
||||
print("\n" + "="*80)
|
||||
print("✅ ALL TESTS COMPLETED SUCCESSFULLY!")
|
||||
print("MEXC order execution system appears to be working correctly.")
|
||||
print("="*80)
|
||||
|
||||
return True
|
||||
|
||||
def test_environment_variables(self) -> bool:
|
||||
"""Test environment variables"""
|
||||
try:
|
||||
api_key = os.getenv('MEXC_API_KEY')
|
||||
api_secret = os.getenv('MEXC_SECRET_KEY')
|
||||
|
||||
if not api_key:
|
||||
print("❌ MEXC_API_KEY environment variable not set")
|
||||
return False
|
||||
|
||||
if not api_secret:
|
||||
print("❌ MEXC_SECRET_KEY environment variable not set")
|
||||
return False
|
||||
|
||||
print(f"✅ MEXC_API_KEY: {api_key[:8]}...{api_key[-4:]} (length: {len(api_key)})")
|
||||
print(f"✅ MEXC_SECRET_KEY: {api_secret[:8]}...{api_secret[-4:]} (length: {len(api_secret)})")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error checking environment variables: {e}")
|
||||
return False
|
||||
|
||||
def test_mexc_interface_creation(self) -> MEXCInterface:
|
||||
"""Test MEXC interface creation"""
|
||||
try:
|
||||
api_key = os.getenv('MEXC_API_KEY')
|
||||
api_secret = os.getenv('MEXC_SECRET_KEY')
|
||||
|
||||
mexc = MEXCInterface(
|
||||
api_key=api_key,
|
||||
api_secret=api_secret,
|
||||
test_mode=True # Use testnet for safety
|
||||
)
|
||||
|
||||
print(f"✅ MEXC Interface created successfully")
|
||||
print(f" - Test mode: {mexc.test_mode}")
|
||||
print(f" - Base URL: {mexc.base_url}")
|
||||
|
||||
return mexc
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error creating MEXC interface: {e}")
|
||||
return None
|
||||
|
||||
def test_mexc_connection(self, mexc: MEXCInterface) -> bool:
|
||||
"""Test MEXC connection"""
|
||||
try:
|
||||
# Test ping
|
||||
ping_result = mexc.ping()
|
||||
print(f"✅ MEXC Ping successful: {ping_result}")
|
||||
|
||||
# Test server time
|
||||
server_time = mexc.get_server_time()
|
||||
print(f"✅ MEXC Server time: {server_time}")
|
||||
|
||||
# Test connection method
|
||||
connected = mexc.connect()
|
||||
print(f"✅ MEXC Connection: {connected}")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error testing MEXC connection: {e}")
|
||||
logger.error(f"MEXC connection error: {e}", exc_info=True)
|
||||
return False
|
||||
|
||||
def test_account_info(self, mexc: MEXCInterface) -> bool:
|
||||
"""Test account information retrieval"""
|
||||
try:
|
||||
account_info = mexc.get_account_info()
|
||||
print(f"✅ Account info retrieved successfully")
|
||||
print(f" - Can trade: {account_info.get('canTrade', 'Unknown')}")
|
||||
print(f" - Can withdraw: {account_info.get('canWithdraw', 'Unknown')}")
|
||||
print(f" - Can deposit: {account_info.get('canDeposit', 'Unknown')}")
|
||||
print(f" - Account type: {account_info.get('accountType', 'Unknown')}")
|
||||
|
||||
# Test balance retrieval
|
||||
balances = account_info.get('balances', [])
|
||||
usdc_balance = 0
|
||||
usdt_balance = 0
|
||||
for balance in balances:
|
||||
if balance.get('asset') == 'USDC':
|
||||
usdc_balance = float(balance.get('free', 0))
|
||||
elif balance.get('asset') == 'USDT':
|
||||
usdt_balance = float(balance.get('free', 0))
|
||||
|
||||
print(f" - USDC Balance: {usdc_balance}")
|
||||
print(f" - USDT Balance: {usdt_balance}")
|
||||
|
||||
if usdc_balance < self.test_quantity:
|
||||
print(f"⚠️ Warning: USDC balance ({usdc_balance}) is less than test amount ({self.test_quantity})")
|
||||
if usdt_balance >= self.test_quantity:
|
||||
print(f"💡 Note: You have sufficient USDT ({usdt_balance}), but we need USDC for ETH/USDC trading")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error retrieving account info: {e}")
|
||||
logger.error(f"Account info error: {e}", exc_info=True)
|
||||
return False
|
||||
|
||||
def test_ticker_data(self, mexc: MEXCInterface) -> float:
|
||||
"""Test ticker data retrieval"""
|
||||
try:
|
||||
ticker = mexc.get_ticker(self.test_symbol)
|
||||
if not ticker:
|
||||
print(f"❌ Failed to get ticker for {self.test_symbol}")
|
||||
return None
|
||||
|
||||
current_price = ticker['last']
|
||||
print(f"✅ Ticker data retrieved for {self.test_symbol}")
|
||||
print(f" - Last price: ${current_price:.2f}")
|
||||
print(f" - Bid: ${ticker.get('bid', 0):.2f}")
|
||||
print(f" - Ask: ${ticker.get('ask', 0):.2f}")
|
||||
print(f" - Volume: {ticker.get('volume', 0)}")
|
||||
|
||||
return current_price
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error retrieving ticker data: {e}")
|
||||
logger.error(f"Ticker data error: {e}", exc_info=True)
|
||||
return None
|
||||
|
||||
def test_trading_executor_creation(self) -> TradingExecutor:
|
||||
"""Test trading executor creation"""
|
||||
try:
|
||||
executor = TradingExecutor()
|
||||
print(f"✅ Trading Executor created successfully")
|
||||
print(f" - Trading enabled: {executor.trading_enabled}")
|
||||
print(f" - Trading mode: {executor.trading_mode}")
|
||||
print(f" - Simulation mode: {executor.simulation_mode}")
|
||||
|
||||
return executor
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error creating trading executor: {e}")
|
||||
logger.error(f"Trading executor error: {e}", exc_info=True)
|
||||
return None
|
||||
|
||||
def test_order_placement(self, executor: TradingExecutor, current_price: float) -> bool:
|
||||
"""Test order placement through executor"""
|
||||
try:
|
||||
print(f"Testing BUY signal execution...")
|
||||
|
||||
# Test BUY signal
|
||||
buy_success = executor.execute_signal(
|
||||
symbol=self.test_symbol,
|
||||
action='BUY',
|
||||
confidence=0.75,
|
||||
current_price=current_price
|
||||
)
|
||||
|
||||
print(f"✅ BUY signal execution: {'SUCCESS' if buy_success else 'FAILED'}")
|
||||
|
||||
if buy_success:
|
||||
# Check positions
|
||||
positions = executor.get_positions()
|
||||
if self.test_symbol in positions:
|
||||
position = positions[self.test_symbol]
|
||||
print(f" - Position created: {position.side} {position.quantity:.6f} @ ${position.entry_price:.2f}")
|
||||
|
||||
# Test SELL signal
|
||||
print(f"Testing SELL signal execution...")
|
||||
sell_success = executor.execute_signal(
|
||||
symbol=self.test_symbol,
|
||||
action='SELL',
|
||||
confidence=0.80,
|
||||
current_price=current_price * 1.001 # Simulate small price increase
|
||||
)
|
||||
|
||||
print(f"✅ SELL signal execution: {'SUCCESS' if sell_success else 'FAILED'}")
|
||||
|
||||
if sell_success:
|
||||
# Check trade history
|
||||
trades = executor.get_trade_history()
|
||||
if trades:
|
||||
last_trade = trades[-1]
|
||||
print(f" - Trade P&L: ${last_trade.pnl:.4f}")
|
||||
|
||||
return sell_success
|
||||
else:
|
||||
print("❌ No position found after BUY signal")
|
||||
return False
|
||||
|
||||
return buy_success
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error testing order placement: {e}")
|
||||
logger.error(f"Order placement error: {e}", exc_info=True)
|
||||
return False
|
||||
|
||||
def test_order_parameters(self, mexc: MEXCInterface, current_price: float) -> bool:
|
||||
"""Test order parameters and validation"""
|
||||
try:
|
||||
print("Testing order parameter calculation...")
|
||||
|
||||
# Calculate test order size
|
||||
crypto_quantity = self.test_quantity / current_price
|
||||
print(f" - USD amount: ${self.test_quantity}")
|
||||
print(f" - Current price: ${current_price:.2f}")
|
||||
print(f" - Crypto quantity: {crypto_quantity:.6f} ETH")
|
||||
|
||||
# Test order parameters formatting
|
||||
mexc_symbol = self.test_symbol.replace('/', '')
|
||||
print(f" - MEXC symbol format: {mexc_symbol}")
|
||||
|
||||
order_params = {
|
||||
'symbol': mexc_symbol,
|
||||
'side': 'BUY',
|
||||
'type': 'MARKET',
|
||||
'quantity': str(crypto_quantity),
|
||||
'recvWindow': 5000
|
||||
}
|
||||
|
||||
print(f" - Order parameters: {order_params}")
|
||||
|
||||
# Test signature generation (without actually placing order)
|
||||
print("Testing signature generation...")
|
||||
test_params = order_params.copy()
|
||||
test_params['timestamp'] = int(time.time() * 1000)
|
||||
|
||||
try:
|
||||
signature = mexc._generate_signature(test_params)
|
||||
print(f"✅ Signature generated successfully (length: {len(signature)})")
|
||||
except Exception as e:
|
||||
print(f"❌ Signature generation failed: {e}")
|
||||
return False
|
||||
|
||||
print("✅ Order parameters validation successful")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error testing order parameters: {e}")
|
||||
logger.error(f"Order parameters error: {e}", exc_info=True)
|
||||
return False
|
||||
|
||||
def main():
|
||||
"""Main test function"""
|
||||
try:
|
||||
debugger = MEXCOrderDebugger()
|
||||
success = debugger.run_comprehensive_test()
|
||||
|
||||
if success:
|
||||
print("\n🎉 MEXC order execution system is working correctly!")
|
||||
print("You can now safely execute live trades.")
|
||||
else:
|
||||
print("\n🚨 MEXC order execution has issues that need to be resolved.")
|
||||
print("Check the logs above for specific error details.")
|
||||
|
||||
return success
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error in main test: {e}", exc_info=True)
|
||||
print(f"\n❌ Critical error during testing: {e}")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Reference in New Issue
Block a user