144 lines
4.8 KiB
Bash
Executable File
144 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# Foxhunt HFT Trading System - Complete System Startup
|
|
# Starts 3 standalone services + databases as per FXT_PLAN.md architecture
|
|
|
|
set -euo pipefail
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
echo -e "${GREEN}🦊 Starting Foxhunt HFT Trading System${NC}"
|
|
echo "===================================================="
|
|
echo "Architecture: FXT CLI → 3 Standalone Services → Docker Databases"
|
|
echo ""
|
|
|
|
# Function to check if a port is available
|
|
check_port() {
|
|
local port=$1
|
|
if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null; then
|
|
return 1
|
|
else
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
# Function to wait for service to be ready
|
|
wait_for_service() {
|
|
local service_name=$1
|
|
local port=$2
|
|
local max_attempts=30
|
|
local attempt=0
|
|
|
|
echo -e "${YELLOW}⏳ Waiting for $service_name on port $port...${NC}"
|
|
while [ $attempt -lt $max_attempts ]; do
|
|
if nc -z localhost $port 2>/dev/null; then
|
|
echo -e "${GREEN}✅ $service_name is ready${NC}"
|
|
return 0
|
|
fi
|
|
attempt=$((attempt + 1))
|
|
sleep 2
|
|
done
|
|
|
|
echo -e "${RED}❌ $service_name failed to start on port $port${NC}"
|
|
return 1
|
|
}
|
|
|
|
# Step 1: Start Docker databases
|
|
echo -e "${BLUE}🗄️ Starting Docker databases...${NC}"
|
|
if ! command -v docker-compose >/dev/null 2>&1 && ! command -v docker >/dev/null 2>&1; then
|
|
echo -e "${RED}❌ Docker/docker-compose not found. Please install Docker.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# Use docker compose (newer) or docker-compose (older)
|
|
DOCKER_COMPOSE_CMD="docker compose"
|
|
if ! command -v docker >/dev/null 2>&1 || ! docker compose version >/dev/null 2>&1; then
|
|
DOCKER_COMPOSE_CMD="docker-compose"
|
|
fi
|
|
|
|
echo "Starting databases with $DOCKER_COMPOSE_CMD..."
|
|
$DOCKER_COMPOSE_CMD up -d
|
|
|
|
# Wait for databases to be ready
|
|
echo -e "${YELLOW}⏳ Waiting for databases to initialize...${NC}"
|
|
sleep 15
|
|
|
|
# Step 2: Set environment variables for database connections
|
|
export DATABASE_URL="postgresql://trading_service:trading_dev_password@localhost:5432/foxhunt"
|
|
export BACKTESTING_DATABASE_URL="postgresql://backtesting_service:backtesting_dev_password@localhost:5432/foxhunt_backtesting"
|
|
export ML_DATABASE_URL="postgresql://ml_service:ml_dev_password@localhost:5432/foxhunt_ml_training"
|
|
export REDIS_URL="redis://localhost:6379"
|
|
export INFLUXDB_URL="http://localhost:8086"
|
|
export RUST_LOG="info"
|
|
|
|
# Step 3: Check ports and stop conflicting services
|
|
echo -e "${BLUE}🔍 Checking service ports...${NC}"
|
|
TRADING_PORT=50051
|
|
BACKTESTING_PORT=50052
|
|
ML_TRAINING_PORT=50053
|
|
|
|
# Kill any existing services
|
|
pkill -f "trading-service" || true
|
|
pkill -f "backtesting-service" || true
|
|
pkill -f "ml-training-service" || true
|
|
sleep 2
|
|
|
|
# Step 4: Build and start the 3 standalone services
|
|
echo -e "${BLUE}🏗️ Building services...${NC}"
|
|
if ! cargo build --release --bin trading-service --bin backtesting-service -p ml_training_service; then
|
|
echo -e "${RED}❌ Failed to build services. Check compilation errors.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}✅ Services built successfully${NC}"
|
|
|
|
# Step 5: Start services in background
|
|
echo -e "${BLUE}🚀 Starting standalone services...${NC}"
|
|
|
|
# Start Trading Service (port 50051)
|
|
echo "📈 Starting Trading Service..."
|
|
cargo run --release --bin trading-service &
|
|
TRADING_PID=$!
|
|
echo $TRADING_PID > .trading-service.pid
|
|
|
|
# Start Backtesting Service (port 50052)
|
|
echo "🔄 Starting Backtesting Service..."
|
|
cargo run --release -p backtesting_service &
|
|
BACKTESTING_PID=$!
|
|
echo $BACKTESTING_PID > .backtesting-service.pid
|
|
|
|
# Start ML Training Service (port 50053)
|
|
echo "🧠 Starting ML Training Service..."
|
|
cargo run --release -p ml_training_service &
|
|
ML_TRAINING_PID=$!
|
|
echo $ML_TRAINING_PID > .ml-training-service.pid
|
|
|
|
# Step 6: Wait for all services to be ready
|
|
echo -e "${YELLOW}⏳ Waiting for services to start...${NC}"
|
|
wait_for_service "Trading Service" $TRADING_PORT
|
|
wait_for_service "Backtesting Service" $BACKTESTING_PORT
|
|
wait_for_service "ML Training Service" $ML_TRAINING_PORT
|
|
|
|
# Step 7: Display system status
|
|
echo -e "${GREEN}🎉 Foxhunt HFT System is running!${NC}"
|
|
echo ""
|
|
echo "System Architecture:"
|
|
echo "├── Trading Service: localhost:$TRADING_PORT (PID: $TRADING_PID)"
|
|
echo "├── Backtesting Service: localhost:$BACKTESTING_PORT (PID: $BACKTESTING_PID)"
|
|
echo "├── ML Training Service: localhost:$ML_TRAINING_PORT (PID: $ML_TRAINING_PID)"
|
|
echo "└── Databases: PostgreSQL(5432), InfluxDB(8086), Redis(6379)"
|
|
echo ""
|
|
echo "To start FXT CLI: cargo run --release -p fxt"
|
|
echo "To stop system: ./stop.sh"
|
|
echo "To view logs: docker logs foxhunt-postgres"
|
|
echo ""
|
|
echo -e "${GREEN}System ready for FXT connection!${NC}"
|
|
|
|
# Keep services running and handle shutdown
|
|
trap 'echo -e "\n${YELLOW}🛑 Shutting down services...${NC}"; ./stop.sh; exit 0' INT
|
|
echo "Press Ctrl+C to stop all services and databases"
|
|
wait |