# Trading Agent System A modular, extensible cryptocurrency trading system that can connect to multiple exchanges through a common interface. ## Architecture The trading agent system consists of the following components: ### Exchange Interfaces - `ExchangeInterface`: Abstract base class that defines the common interface for all exchange implementations - `BinanceInterface`: Implementation for the Binance exchange (supports both mainnet and testnet) - `MEXCInterface`: Implementation for the MEXC exchange ### Trading Agent - `TradingAgent`: Main class that manages trading operations, including position sizing, risk management, and signal processing ### Neural Network Orchestrator - `NeuralNetworkOrchestrator`: Coordinates between neural network models and the trading agent to generate and process trading signals ## Getting Started ### Installation The trading agent system is built into the main application. No additional installation is needed beyond the requirements for the main application. ### Configuration Configuration can be provided via: 1. Command-line arguments 2. Environment variables 3. Configuration file #### Example Configuration ```json { "exchange": "binance", "api_key": "your_api_key", "api_secret": "your_api_secret", "test_mode": true, "trade_symbols": ["BTC/USDT", "ETH/USDT"], "position_size": 0.1, "max_trades_per_day": 5, "trade_cooldown_minutes": 60 } ``` ### Running the Trading System #### From Command Line ```bash # Run with Binance in test mode python trading_main.py --exchange binance --test-mode # Run with MEXC in production mode python trading_main.py --exchange mexc --api-key YOUR_API_KEY --api-secret YOUR_API_SECRET # Run with custom position sizing and limits python trading_main.py --exchange binance --test-mode --position-size 0.05 --max-trades-per-day 3 --trade-cooldown 120 ``` #### Using Environment Variables You can set these environment variables for configuration: ```bash # Set exchange API credentials export BINANCE_API_KEY=your_binance_api_key export BINANCE_API_SECRET=your_binance_api_secret # Enable neural network models export ENABLE_NN_MODELS=1 export NN_INFERENCE_INTERVAL=60 export NN_MODEL_TYPE=cnn export NN_TIMEFRAME=1h # Run the trading system python trading_main.py ``` ### Basic Usage Examples #### Creating a Trading Agent ```python from NN.trading_agent import TradingAgent # Initialize a trading agent for Binance testnet agent = TradingAgent( exchange_name="binance", api_key="your_api_key", api_secret="your_api_secret", test_mode=True, trade_symbols=["BTC/USDT", "ETH/USDT"], position_size=0.1, max_trades_per_day=5, trade_cooldown_minutes=60 ) # Start the trading agent agent.start() # Process a signal agent.process_signal( symbol="BTC/USDT", action="BUY", confidence=0.85 ) # Get current positions positions = agent.get_current_positions() print(f"Current positions: {positions}") # Stop the trading agent agent.stop() ``` #### Using an Exchange Interface Directly ```python from NN.exchanges import BinanceInterface # Initialize the Binance interface exchange = BinanceInterface( api_key="your_api_key", api_secret="your_api_secret", test_mode=True ) # Connect to the exchange exchange.connect() # Get ticker info ticker = exchange.get_ticker("BTC/USDT") print(f"Current BTC price: {ticker['last']}") # Get account balance btc_balance = exchange.get_balance("BTC") usdt_balance = exchange.get_balance("USDT") print(f"BTC balance: {btc_balance}") print(f"USDT balance: {usdt_balance}") # Place a market order order = exchange.place_order( symbol="BTC/USDT", side="buy", order_type="market", quantity=0.001 ) ``` ## Testing the Exchange Interfaces The system includes a test script that can be used to verify that exchange interfaces are working correctly: ```bash # Test Binance interface in test mode (no real trades) python -m NN.exchanges.trading_agent_test --exchange binance --test-mode # Test MEXC interface in test mode python -m NN.exchanges.trading_agent_test --exchange mexc --test-mode # Test with actual trades (use with caution!) python -m NN.exchanges.trading_agent_test --exchange binance --test-mode --execute-trades --test-trade-amount 0.001 ``` ## Adding a New Exchange To add support for a new exchange, you need to create a new class that inherits from `ExchangeInterface` and implements all the required methods: 1. Create a new file in the `NN/exchanges` directory (e.g., `kraken_interface.py`) 2. Implement the required methods (see `exchange_interface.py` for the specifications) 3. Add the new exchange to the imports in `__init__.py` 4. Update the `_create_exchange` method in `TradingAgent` to support the new exchange ### Example of a New Exchange Implementation ```python # NN/exchanges/kraken_interface.py import logging from typing import Dict, Any, List, Optional from .exchange_interface import ExchangeInterface logger = logging.getLogger(__name__) class KrakenInterface(ExchangeInterface): """Kraken Exchange API Interface""" def __init__(self, api_key: str = None, api_secret: str = None, test_mode: bool = True): super().__init__(api_key, api_secret, test_mode) self.base_url = "https://api.kraken.com" # Initialize other Kraken-specific properties def connect(self) -> bool: # Implement connection to Kraken API pass def get_balance(self, asset: str) -> float: # Implement getting balance for an asset pass def get_ticker(self, symbol: str) -> Dict[str, Any]: # Implement getting ticker data pass def place_order(self, symbol: str, side: str, order_type: str, quantity: float, price: float = None) -> Dict[str, Any]: # Implement placing an order pass def cancel_order(self, symbol: str, order_id: str) -> bool: # Implement cancelling an order pass def get_order_status(self, symbol: str, order_id: str) -> Dict[str, Any]: # Implement getting order status pass def get_open_orders(self, symbol: str = None) -> List[Dict[str, Any]]: # Implement getting open orders pass ``` Then update the imports in `__init__.py`: ```python from .exchange_interface import ExchangeInterface from .binance_interface import BinanceInterface from .mexc_interface import MEXCInterface from .kraken_interface import KrakenInterface __all__ = ['ExchangeInterface', 'BinanceInterface', 'MEXCInterface', 'KrakenInterface'] ``` And update the `_create_exchange` method in `TradingAgent`: ```python def _create_exchange(self) -> ExchangeInterface: """Create an exchange interface based on the exchange name.""" if self.exchange_name == 'mexc': return MEXCInterface( api_key=self.api_key, api_secret=self.api_secret, test_mode=self.test_mode ) elif self.exchange_name == 'binance': return BinanceInterface( api_key=self.api_key, api_secret=self.api_secret, test_mode=self.test_mode ) elif self.exchange_name == 'kraken': return KrakenInterface( api_key=self.api_key, api_secret=self.api_secret, test_mode=self.test_mode ) else: raise ValueError(f"Unsupported exchange: {self.exchange_name}") ``` ## Security Considerations - **API Keys**: Never hardcode API keys in your code. Use environment variables or secure storage. - **Permissions**: Restrict API key permissions to only what is needed (e.g., trading, but not withdrawals). - **Testing**: Always test with small amounts and use test mode/testnet when possible. - **Position Sizing**: Implement conservative position sizing to manage risk. - **Monitoring**: Set up monitoring and alerting for your trading system. ## Troubleshooting ### Common Issues 1. **Connection Problems**: Make sure you have internet connectivity and correct API credentials. 2. **Order Placement Errors**: Check for sufficient funds, correct symbol format, and valid order parameters. 3. **Rate Limiting**: Avoid making too many API requests in a short period to prevent being rate-limited. ### Logging The trading agent system uses Python's logging module with different levels: - **DEBUG**: Detailed information, typically useful for diagnosing problems. - **INFO**: Confirmation that things are working as expected. - **WARNING**: Indication that something unexpected happened, but the program can still function. - **ERROR**: Due to a more serious problem, the program has failed to perform some function. You can adjust the logging level in your trading script: ```python import logging logging.basicConfig( level=logging.DEBUG, # Change to INFO, WARNING, or ERROR as needed format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler("trading.log"), logging.StreamHandler() ] ) ```