Intelligent and Strategic Trading Platform for Everyone.
iTrade is for study, research purpose only. Don't risk your real assets. Use iTrade at your own risk.
sequenceDiagram
participant User
participant StrategyManager
participant TradeEngine
participant Strategy
participant EventBus
participant Exchange
participant DataManager
User->>StrategyManager: Start Manager
StrategyManager->>DataManager: Load Active Strategies
DataManager-->>StrategyManager: Return Strategy Config
StrategyManager->>TradeEngine: Add Strategy
TradeEngine->>Strategy: Initialize
TradeEngine->>Exchange: Subscribe Market Data
Exchange-->>EventBus: Market Data Event
EventBus-->>TradeEngine: Forward Event
TradeEngine->>Strategy: Analyze Data
Strategy-->>EventBus: Emit Signal Event
EventBus-->>TradeEngine: Forward Signal
TradeEngine->>Exchange: Execute Order
Exchange-->>EventBus: Order Event
EventBus-->>DataManager: Save Order
EventBus-->>User: Notify Result
sequenceDiagram
participant User
participant CLI
participant BacktestCommand
participant TradeEngine
User->>CLI: Run `backtest` Command
CLI->>BacktestCommand: Parse Arguments
BacktestCommand->>TradeEngine: Load Strategy & Data
TradeEngine-->>BacktestCommand: Return Results
BacktestCommand-->>CLI: Format Output
CLI-->>User: Display Results
sequenceDiagram
participant User
participant WebUI
participant API
participant TradeEngine
User->>WebUI: Submit Trade Request
WebUI->>API: Send Request
API->>TradeEngine: Process Request
TradeEngine-->>API: Return Status
API-->>WebUI: Update UI
WebUI-->>User: Show Confirmation
pnpm add @itrade/core @itrade/strategies @itrade/logger @itrade/risk-manager @itrade/portfolio-manager @itrade/exchange-connectorsimport { TradingEngine, LogLevel } from '@itrade/core';
import { ConsoleLogger } from '@itrade/logger';
import { RiskManager } from '@itrade/risk-manager';
import { PortfolioManager } from '@itrade/portfolio-manager';
import { Decimal } from 'decimal.js';
// Create logger
const logger = new ConsoleLogger(LogLevel.INFO);
// Create risk manager with custom limits
const riskManager = new RiskManager({
maxDrawdown: new Decimal(20), // 20% max drawdown
maxPositionSize: new Decimal(10), // 10% max position size
maxDailyLoss: new Decimal(5), // 5% max daily loss
maxLeverage: new Decimal(1), // 1:1 leverage (no leverage)
});
// Create portfolio manager with initial balance
const portfolioManager = new PortfolioManager(new Decimal(10000)); // $10,000 initial balance
// Create trading engine
const engine = new TradingEngine(riskManager, portfolioManager, logger);import { MovingAverageStrategy } from '@itrade/strategies';
const strategy = new MovingAverageStrategy({
fastPeriod: 10,
slowPeriod: 30,
threshold: 0.001, // 0.1% minimum crossover threshold
});
engine.addStrategy('ma-strategy', strategy);import { BinanceExchange } from '@itrade/exchange-connectors';
// Create exchange instance (use true for testnet)
const binance = new BinanceExchange(true); // testnet
await binance.connect({
apiKey: 'YOUR_API_KEY',
secretKey: 'YOUR_SECRET_KEY',
sandbox: true, // Use testnet for safety
});
engine.addExchange('binance', binance);import { TypeOrmDataManager } from '@itrade/data-manager';
// Initialize database connection
const dataManager = new TypeOrmDataManager({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: 'postgres',
database: 'itrade',
synchronize: false, // Use migrations in production
});
await dataManager.initialize();// Start the trading engine
await engine.start();
logger.info('Trading engine started successfully');import { TradingEngine, LogLevel } from '@itrade/core';
import { ConsoleLogger } from '@itrade/logger';
import { RiskManager } from '@itrade/risk-manager';
import { PortfolioManager } from '@itrade/portfolio-manager';
import { MovingAverageStrategy } from '@itrade/strategies';
import { BinanceExchange } from '@itrade/exchange-connectors';
import { TypeOrmDataManager } from '@itrade/data-manager';
import { Decimal } from 'decimal.js';
async function main() {
// Initialize logger
const logger = new ConsoleLogger(LogLevel.INFO);
// Initialize database
const dataManager = new TypeOrmDataManager({
type: 'postgres',
host: process.env.DATABASE_HOST || 'localhost',
port: parseInt(process.env.DATABASE_PORT || '5432'),
username: process.env.DATABASE_USER || 'postgres',
password: process.env.DATABASE_PASSWORD || 'postgres',
database: process.env.DATABASE_NAME || 'itrade',
synchronize: false,
});
await dataManager.initialize();
logger.info('β
Database connected');
// Initialize components
const riskManager = new RiskManager({
maxDrawdown: new Decimal(20),
maxPositionSize: new Decimal(10),
maxDailyLoss: new Decimal(5),
});
const portfolioManager = new PortfolioManager(new Decimal(10000));
// Create engine
const engine = new TradingEngine(riskManager, portfolioManager, logger);
// Add strategy with subscription config
const strategy = new MovingAverageStrategy({
symbol: 'BTC/USDT',
exchange: 'binance',
fastPeriod: 10,
slowPeriod: 30,
threshold: 0.001, // 0.1% minimum crossover threshold
subscription: {
ticker: true,
klines: true,
method: 'rest', // Use 'websocket' for real-time data
},
});
engine.addStrategy('ma-strategy', strategy);
// Add exchange (use testnet)
const binance = new BinanceExchange(true);
await binance.connect({
apiKey: process.env.BINANCE_API_KEY || '',
secretKey: process.env.BINANCE_SECRET_KEY || '',
sandbox: true,
});
engine.addExchange('binance', binance);
// Start trading
await engine.start();
logger.info('β
Trading system is running...');
// Graceful shutdown
process.on('SIGINT', async () => {
logger.info('Shutting down...');
await engine.stop();
await dataManager.close();
process.exit(0);
});
}
main().catch(console.error);itrade/
βββ packages/
β βββ core/ # Core trading engine
β β βββ src/engine/ # Trading engine & subscription manager
β β βββ src/models/ # Base strategy, OrderManager, OrderSyncService
β β βββ src/events/ # Event bus system
β βββ strategies/ # Strategy implementations
β β βββ src/strategies/
β β βββ MovingAverageStrategy.ts
β βββ exchange-connectors/ # Exchange connectors
β β βββ src/
β β βββ binance/ # Binance exchange
β β βββ coinbase/ # Coinbase exchange
β β βββ okx/ # OKX exchange
β βββ data-manager/ # Data management with TypeORM
β β βββ src/
β β βββ entities/ # Database entities (Order, Strategy, etc.)
β β βββ repositories/ # Data repositories
β βββ risk-manager/ # Risk management
β βββ portfolio-manager/ # Portfolio management
β βββ logger/ # Logging utilities
β βββ utils/ # Shared utilities
βββ apps/
β βββ console/ # Console application (Node.js)
β β βββ src/
β β β βββ main.ts # Main entry point
β β β βββ strategy-manager.ts # Strategy sync & monitoring
β β β βββ order-tracker.ts # Order tracking & sync
β β βββ docs/ # Console-specific docs
β βββ web/ # Web manager (Next.js)
β β βββ app/ # Next.js routes
β β βββ components/ # React components
β β βββ docs/ # Web-specific docs
β βββ mobile/ # Mobile client (Flutter)
β β βββ lib/ # Dart code
β β βββ android/ # Android-specific code
β β βββ ios/ # iOS-specific code
β βββ services/ # Service configurations
β βββ db/ # Docker database setup
βββ docs/ # Project documentation
β βββ guides/ # User guides & tutorials
β β βββ PROJECT_QUICK_START.md
β β βββ STRATEGY_MANAGEMENT_GUIDE.md
β β βββ STRATEGY-EXAMPLE-CN.md
β β βββ STRATEGY-FLOW-CN.md
β βββ architecture/ # Architecture & design docs
β βββ api/ # API references
β βββ development/ # Development & implementation docs
β βββ migration/ # Migration guides
β βββ troubleshooting/ # Troubleshooting guides
βββ README.md # Project overview
βββ package.json # Project configuration
- Project Quick Start - Get started in minutes
- εΏ«ιεΌε§ζε (δΈζ) - δΈζεΏ«ιε ₯ι¨
- Run Commands Guide - How to run console, web, and mobile apps
- Strategy Management Guide - How to manage strategies
- Strategy Examples (CN) - ηη₯η€ΊδΎ
- Strategy Examples (EN) - Strategy examples
- Strategy Flow (CN) - ηη₯ζ§θ‘ζ΅η¨
- Strategy Flow (EN) - Strategy execution flow
- Strategy Debugging Guide - How to debug strategies
- Trading Engine Analysis - Engine architecture overview
- Market Data API Design - Market data system design
- Auto-Subscription Design - Auto-subscription mechanism
- Implementation Summary - Recent implementations
- Console & Web Improvements - UI improvements
- Order Tracker Fix - Order tracking improvements
- Typed Market Data Migration - Migrate to typed market data
- Troubleshooting Guide - Common issues and solutions
- Symbol Normalization - Symbol format issues
- WebSocket Blocked Solution - Fix WebSocket issues
- Core Package - Core engine documentation
- Data Manager - Database and data management
- Exchange Connectors - Exchange integrations
- ποΈ Modular Architecture - Clean separation of concerns with packages for core, strategies, exchanges, etc.
- π Multi-Exchange Support - Binance, Coinbase, OKX with unified interface
- π Real-time & Historical Data - Support for live trading and backtesting
- π‘οΈ Risk Management - Built-in risk controls (max drawdown, position size, daily loss)
- πΌ Portfolio Management - Track balances, positions, and P&L
- π Strategy Management - Database-backed strategy lifecycle management
- π Auto-Sync - Automatic synchronization between database and trading engine
- π Order Tracking - Real-time order status monitoring and reconciliation
- π― Event-Driven - Event bus for decoupled communication
- π± Multi-Platform - Console, Web (Next.js), and Mobile (Flutter) applications
Manages strategy lifecycle with automatic database synchronization:
- Auto-loading - Loads active strategies from database on startup
- Periodic Sync - Syncs strategies with database every 10 seconds
- Status Tracking - Monitors strategy performance and metrics
- Error Handling - Automatically handles strategy failures
Example usage:
import { StrategyManager } from './strategy-manager';
const strategyManager = new StrategyManager(engine, dataManager, logger);
await strategyManager.start();
// Strategies are automatically loaded and synced with database
// Changes in database (add/pause/stop) are reflected in TradeEngineMonitors and syncs orders between exchange and database:
- Real-time Monitoring - Tracks order status changes
- Auto-Sync - Periodic synchronization with exchange
- Status Updates - Updates database with latest order states
- Fill Tracking - Tracks partial and full fills
Example usage:
import { OrderTracker } from './order-tracker';
const orderTracker = new OrderTracker(dataManager, logger);
await orderTracker.start();
// Orders are automatically tracked and synced
// Database is updated with real-time order statusUse the logger in your strategy:
// In your strategy's analyze method
this.logger.info(`Fast MA: ${fastMA}, Slow MA: ${slowMA}`);
this.logger.debug(`Current price: ${currentPrice.toString()}`);Implement the IExchange interface by extending BaseExchange (refer to BinanceExchange or CoinbaseExchange implementation):
import { BaseExchange, ExchangeCredentials, ExchangeInfo } from '@itrade/exchange-connectors';
export class CustomExchange extends BaseExchange {
async connect(credentials: ExchangeCredentials): Promise<void> {
// Implement connection logic
}
async getExchangeInfo(): Promise<ExchangeInfo> {
// Implement exchange info retrieval
}
// Implement other required methods...
}Use the BacktestEngine from @itrade/backtesting:
import { BacktestEngine } from '@itrade/backtesting';
import { MovingAverageStrategy } from '@itrade/strategies';
import { TypeOrmDataManager } from '@itrade/data-manager';
import { Decimal } from 'decimal.js';
// Initialize data manager
const dataManager = new TypeOrmDataManager({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: 'postgres',
database: 'itrade',
});
await dataManager.initialize();
// Create backtest engine
const backtestEngine = new BacktestEngine();
// Create strategy
const strategy = new MovingAverageStrategy({
symbol: 'BTC/USDT',
exchange: 'binance',
fastPeriod: 10,
slowPeriod: 30,
threshold: 0.001, // 0.1% minimum crossover threshold
});
// Configure backtest
const config = {
symbols: ['BTC/USDT'],
startDate: new Date('2024-01-01'),
endDate: new Date('2024-12-31'),
initialBalance: new Decimal(10000),
interval: '1h',
};
// Run backtest
const results = await backtestEngine.runBacktest(strategy, config, dataManager);
console.log('Backtest Results:', results);For production environments, use proper database configuration:
import { TypeOrmDataManager } from '@itrade/data-manager';
const dataManager = new TypeOrmDataManager({
type: 'postgres',
host: process.env.DATABASE_HOST,
port: parseInt(process.env.DATABASE_PORT || '5432'),
username: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME,
ssl: process.env.NODE_ENV === 'production',
synchronize: false, // Never use synchronize in production
logging: ['error', 'warn'],
});
await dataManager.initialize();- π Read the Quick Start Guide - Project Quick Start
- π― Try the Console Application - Run Commands Guide
- π Understand Strategy Flow - Strategy Flow Guide
- π‘ Create Your First Strategy - Strategy Examples
- ποΈ Study the Architecture - Trading Engine Analysis
- π Add Custom Exchange - Implement
IExchangeinterface - π§ͺ Run Backtests - Use
BacktestEnginewith historical data - π Build Custom Strategies - Extend
BaseStrategyclass - π Deploy Web Interface - Use the Next.js web application
- π± Try Mobile App - Run the Flutter mobile application
- π Read Documentation Guide - Documentation Guide
- π§ Check Development Docs - Implementation Summary
- π Report Issues - Create GitHub issues with detailed information
- π» Submit PRs - Follow the project structure and coding standards
- π Documentation: Browse the docs directory
- π¬ Issues: Report bugs or request features on GitHub
- π Star this repo if you find it helpful!
This project is for study and research purposes only. Don't risk your real assets. Use iTrade at your own risk.
Made with β€οΈ for the trading community