# Algo Trading System - Complete Guide ## Overview A complete algorithmic trading system that combines your multi-agent AI analysis with automated trade execution, position management, and risk controls. **Key Features:** - ✅ Screen stocks and detect pump signals - ✅ Automatic position sizing (8% max per stock) - ✅ Portfolio limits (25% max in risky trades) - ✅ Profit targets & stop losses - ✅ Time-based position exits - ✅ Webull paper trading integration - ✅ Full audit trail of all trades ## Architecture ``` ┌─────────────────────────────────────────────────────────┐ │ ALGO TRADING BOT (Main Orchestrator) │ └─────────────────────────────────────────────────────────┘ │ │ │ ▼ ▼ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Analysis │ │ Portfolio │ │ Execution │ │ (LangGraph)│ │ Manager │ │ (Webull) │ │ │ │ │ │ │ │ • Screening │ │ • Position │ │ • Buy/Sell │ │ • Pump Det. │ │ sizing │ │ • Orders │ │ • Signals │ │ • Limits │ │ • Account │ │ │ │ • Tracking │ │ info │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ └────────────────────┴────────────────────┘ │ ▼ ┌──────────────────────┐ │ Exit Strategy │ │ │ │ • Profit targets │ │ • Stop losses │ │ • Time limits │ │ • Trailing stops │ └──────────────────────┘ ``` ## Core Components ### 1. Portfolio Manager (`tradingagents/strategy/portfolio_manager.py`) Manages position sizing and portfolio constraints. **Key Settings:** - `max_position_pct`: Max 8% per stock - `max_risky_pct`: Max 25% in risky trades (pump/momentum) - `max_positions`: Max 10 open positions - `min_position_size`: Min $100 per trade - `max_position_size`: Max $2000 per trade **Methods:** ```python # Calculate position size based on signal strength position = pm.calculate_position_size( current_price=150.0, signal_score=75.0, # 0-100 position_type="pump" ) # Add a position pm.add_position( ticker="NVDA", shares=10, entry_price=150.0, signal_score=75.0, position_type="pump" ) # Close a position result = pm.close_position( ticker="NVDA", exit_price=158.0, reason="profit_target" ) # Get status status = pm.get_portfolio_status() # Returns: { # "total_value": 10500.0, # "cash": 8700.0, # "positions_value": 1800.0, # "num_positions": 2, # "cash_utilization": 17.1%, # "risky_exposure": 12.5% # } ``` **How Position Sizing Works:** 1. Max position = 8% of portfolio 2. Scaled by signal strength: position = max * (signal_score / 100) 3. Capped by min ($100) and max ($2000) 4. Check if enough cash available 5. For risky trades: check doesn't exceed 25% risky limit Example: - Portfolio: $10,000 - Max position: $800 (8%) - Signal score: 75% → position = $800 * 0.75 = $600 - Stock price: $150 → shares = 4 ### 2. Exit Strategy (`tradingagents/strategy/exit_strategy.py`) Automatically exits positions when: **Default Settings:** - **Profit Target**: 5% gain → SELL - **Stop Loss**: 2% loss → SELL - **Max Hold**: 5 days → SELL (even if break-even) - **Trailing Stop**: 2% from peak → SELL - **Signal Deterioration**: Signal drops below 40 → SELL (for pump trades) **Example:** ```python exit = ExitStrategy() # Check if should exit signal = exit.evaluate_exit( ticker="NVDA", current_price=158.0, entry_price=150.0, entry_date=datetime.now(), signal_score=35.0, position_type="pump" ) # Returns: { # "exit_signal": True, # "reason": "profit_target", # or "stop_loss", "time_limit", etc. # "exit_price": 158.0, # "pnl_pct": 5.3% # } # Get targets targets = exit.get_exit_targets(entry_price=150.0) # Returns: { # "profit_target": 157.50, # +5% # "stop_loss": 147.00, # -2% # "trailing_stop_trigger": 147.00 # } ``` ### 3. Trade Validator (`tradingagents/strategy/trade_validator.py`) Pre-flight checks before executing any trade. **Validates:** - Sufficient funds - Position size constraints - Price sanity (no >50% jumps) - Liquidity ```python validator = TradeValidator() # Validate buy result = validator.validate_buy_order( ticker="NVDA", shares=10, price=150.0, available_cash=8700.0, portfolio_value=10000.0, max_position_pct=0.08 ) # Returns: {"is_valid": True, "order_value": 1500.0, ...} # Validate sell result = validator.validate_sell_order( ticker="NVDA", shares=10, price=158.0, position_shares=10, position_value=1500.0 ) ``` ### 4. Paper Trading (`tradingagents/agents/trader/paper_trading.py`) Webull integration for paper trading execution. **Setup:** ```bash pip install webull ``` **Usage:** ```python from tradingagents.agents.trader.paper_trading import PaperTrader # Initialize trader = PaperTrader( email="your_email@example.com", password="your_password", is_paper=True ) # Login trader.login() # Get trade token (required once per session) trader.get_trade_token(pin="123456") # Buy trader.place_buy_order( ticker="NVDA", quantity=10, limit_price=150.0 ) # Sell trader.place_sell_order( ticker="NVDA", quantity=10, limit_price=158.0 ) # Get positions positions = trader.get_positions() # Get account balance account = trader.get_account_balance() # Returns: { # "account_value": 10500.0, # "cash": 8700.0, # "buying_power": 34800.0 # } # Get quote quote = trader.get_stock_quote("NVDA") # Returns: {"price": 150.25, "bid": 150.20, "ask": 150.30} ``` ## Main Workflow ### 1. Demo Mode (No Authentication) Test without Webull credentials: ```python from algo_trading_workflow import AlgoTradingBot # Create bot in demo mode bot = AlgoTradingBot( portfolio_cash=10000.0, paper_trading=False, # Demo mode selected_analysts=["market"] ) # Run single iteration bot.run_iteration() # Check status print(bot.get_status()) # View summary bot.print_summary() ``` ### 2. Paper Trading Mode (Webull Connected) Live paper trading with real data: ```python import os # Set environment variables os.environ["WEBULL_EMAIL"] = "your_email@example.com" os.environ["WEBULL_PASSWORD"] = "your_password" bot = AlgoTradingBot( portfolio_cash=10000.0, paper_trading=True, selected_analysts=["market", "social", "news"], webull_email=os.environ.get("WEBULL_EMAIL"), webull_password=os.environ.get("WEBULL_PASSWORD"), webull_pin="123456" # Trading PIN ) # Run continuously (5 min intervals) bot.run(iterations=-1, interval_seconds=300) ``` ### 3. Run Specific Iterations ```python # Run 10 iterations (50 min total) bot.run(iterations=10, interval_seconds=300) # Print summary bot.print_summary() # Save state bot.save_state("my_trading_state.json") ``` ## Trade Flow Example Let's say you're running the bot on NVDA: ``` 1. SCREENING (find candidates) → NVDA identified as trending 2. PUMP DETECTION (analyze opportunity) → Pump score: 82/100 → Signal type: "pump" 3. ENTRY DECISION → Signal >= 70? YES → Position size = 8% * (82/100) = $656 → 4 shares @ $150 4. POSITION ADDED → Portfolio: $9,400 cash, 4 NVDA shares 5. MONITORING (continuous) → Current: $158 → P/L: +5.3% → HIT PROFIT TARGET → EXIT → Profit: $32 OR if: → Current: $147 → P/L: -2.0% → HIT STOP LOSS → EXIT → Loss: $12 OR if: → 5 days passed → HIT TIME LIMIT → EXIT → P/L: -1.5% → Loss: $9 6. POSITION CLOSED → Trade recorded → Cash restored → Ready for next trade ``` ## Risk Management Summary | Constraint | Limit | Why | |-----------|-------|-----| | Max position | 8% | Doesn't bet too much on one stock | | Max risky | 25% | Doesn't exceed comfort zone for high-risk trades | | Max positions | 10 | Not too many to manage | | Stop loss | 2% | Cuts losses quickly | | Profit target | 5% | Takes gains before reversal | | Max hold | 5 days | Doesn't hold momentum trades too long | | Trailing stop | 2% | Exits if momentum reverses | ## Monitoring & Debugging ### Check Bot Status ```python status = bot.get_status() print(status) # { # "iteration": 12, # "portfolio": {...}, # "trades": 8, # "paper_trading": True # } ``` ### View Trade Log ```python for trade in bot.trade_log: print(f"{trade['action']} {trade['shares']}x {trade['ticker']} @ ${trade['price']:.2f}") ``` ### View Portfolio Positions ```python portfolio = bot.portfolio_manager.get_portfolio_status() for ticker, position in portfolio['positions'].items(): print(f"{ticker}: {position['shares']} shares @ ${position['entry_price']:.2f}") ``` ### Load Previous State ```python import json with open("trading_bot_state.json") as f: state = json.load(f) print(f"Previous portfolio value: ${state['portfolio']['cash']:.2f}") print(f"Total trades: {len(state['trades'])}") ``` ## Configuration Examples ### Conservative Strategy (Lower Risk) ```python AlgoTradingBot( portfolio_cash=10000.0, selected_analysts=["market", "news", "fundamentals"], # Skip social webull_pin="123456" ) # Modify exit strategy bot.exit_strategy.config.profit_target_pct = 3.0 # Take profit at 3% bot.exit_strategy.config.stop_loss_pct = 1.5 # Stop at 1.5% bot.exit_strategy.config.max_hold_days = 3 # Hold max 3 days # Modify portfolio constraints bot.portfolio_manager.max_position_pct = 0.05 # 5% max per stock bot.portfolio_manager.max_risky_pct = 0.15 # 15% in risky bot.portfolio_manager.max_positions = 5 # Only 5 positions ``` ### Aggressive Strategy (Higher Risk) ```python AlgoTradingBot( portfolio_cash=10000.0, selected_analysts=["market", "social"], # Include social signals webull_pin="123456" ) # Modify exit strategy bot.exit_strategy.config.profit_target_pct = 10.0 # Hold for bigger gains bot.exit_strategy.config.stop_loss_pct = 5.0 # Wider stop bot.exit_strategy.config.max_hold_days = 10 # Hold longer # Modify portfolio constraints bot.portfolio_manager.max_position_pct = 0.12 # 12% max per stock bot.portfolio_manager.max_risky_pct = 0.40 # 40% in risky bot.portfolio_manager.max_positions = 15 # More positions ``` ## Troubleshooting ### Webull Login Issues ```python # Check credentials if not bot.paper_trader.is_authenticated: print("Not authenticated with Webull") bot._setup_paper_trading(pin="123456") # Check trade token try: bot.paper_trader.get_trade_token(pin="123456") except Exception as e: print(f"Trade token error: {e}") ``` ### Position Not Sizing Correctly ```python # Debug position calculation position = bot.portfolio_manager.calculate_position_size( current_price=150.0, signal_score=75.0, position_type="pump" ) if not position: print("Position sizing returned None - check constraints") status = bot.portfolio_manager.get_portfolio_status() print(f"Cash: ${status['cash']:.2f}") print(f"Positions: {status['num_positions']}/{status['max_positions']}") ``` ### Order Failing to Execute ```python # Validate before placing validation = bot.validator.validate_buy_order( ticker="NVDA", shares=4, price=150.0, available_cash=bot.portfolio_manager.cash, portfolio_value=bot.portfolio_manager.portfolio_value ) if not validation['is_valid']: print(f"Validation failed: {validation['issues']}") ``` ## Next Steps 1. **Test in Demo Mode**: Run `algo_trading_workflow.py` to see how it works 2. **Set Up Webull Account**: Create paper trading account at webull.com 3. **Configure Strategy**: Customize portfolio limits and exit rules 4. **Start Paper Trading**: Connect Webull credentials and run 5. **Monitor Closely**: Check daily results and adjust rules 6. **Scale to Live**: Only after consistent profitability in paper trading ## Files Reference | File | Purpose | |------|---------| | `algo_trading_workflow.py` | Main bot orchestrator | | `tradingagents/strategy/portfolio_manager.py` | Position sizing & limits | | `tradingagents/strategy/exit_strategy.py` | Profit/loss management | | `tradingagents/strategy/trade_validator.py` | Pre-flight checks | | `tradingagents/agents/trader/paper_trading.py` | Webull integration | --- **Remember:** Paper trading is a great learning tool, but it's not perfect. Real trading has slippage, spreads, and execution delays. Start small, monitor closely, and only trade with money you can afford to lose. Good luck! 🚀