13 KiB
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 stockmax_risky_pct: Max 25% in risky trades (pump/momentum)max_positions: Max 10 open positionsmin_position_size: Min $100 per trademax_position_size: Max $2000 per trade
Methods:
# 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:
- Max position = 8% of portfolio
- Scaled by signal strength: position = max * (signal_score / 100)
- Capped by min ($100) and max ($2000)
- Check if enough cash available
- 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:
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
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:
pip install webull
Usage:
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:
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:
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
# 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
status = bot.get_status()
print(status)
# {
# "iteration": 12,
# "portfolio": {...},
# "trades": 8,
# "paper_trading": True
# }
View Trade Log
for trade in bot.trade_log:
print(f"{trade['action']} {trade['shares']}x {trade['ticker']} @ ${trade['price']:.2f}")
View Portfolio Positions
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
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)
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)
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
# 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
# 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
# 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
- Test in Demo Mode: Run
algo_trading_workflow.pyto see how it works - Set Up Webull Account: Create paper trading account at webull.com
- Configure Strategy: Customize portfolio limits and exit rules
- Start Paper Trading: Connect Webull credentials and run
- Monitor Closely: Check daily results and adjust rules
- 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! 🚀