bifitnex-trading/setup.sh
kroutony 36225df832 Add Claude auto-fix to check_errors.py, distinguish LLM failure in Slack reports
- check_errors.py: on errors, call Claude CLI to diagnose and attempt auto-fix,
  include fix report in Slack alert
- slack_notifier.py: show "LLM 分析失敗" when LLM fails instead of "All HOLD"
- main.py: track llm_ok flag and pass to Slack reporter
- setup.sh: restore ~/.local/bin in crontab PATH for claude CLI
- llm_analyzer.py: use shutil.which for robust claude binary lookup

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 03:08:06 +00:00

170 lines
5.6 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# ============================================================
# bifitnex-trading-2 — 新機器前置設定腳本
# 使用方式: chmod +x setup.sh && ./setup.sh
# ============================================================
set -euo pipefail
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
PYTHON=${PYTHON:-python3}
echo "=== bifitnex-trading-2 setup ==="
echo "Project dir: $PROJECT_DIR"
echo ""
# --------------------------------------------------
# 1. 檢查 Python 版本(需 3.12+
# --------------------------------------------------
echo "[1/6] Checking Python..."
if ! command -v $PYTHON &>/dev/null; then
echo "ERROR: $PYTHON not found. Install Python 3.12+ first."
exit 1
fi
PY_VER=$($PYTHON -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
PY_MAJOR=$($PYTHON -c 'import sys; print(sys.version_info.major)')
PY_MINOR=$($PYTHON -c 'import sys; print(sys.version_info.minor)')
if [ "$PY_MAJOR" -lt 3 ] || [ "$PY_MINOR" -lt 12 ]; then
echo "ERROR: Python 3.12+ required, got $PY_VER"
exit 1
fi
echo " Python $PY_VER"
# --------------------------------------------------
# 2. 建立 venv 並安裝 pip 套件
# --------------------------------------------------
echo "[2/6] Setting up venv and installing packages..."
VENV_DIR="$PROJECT_DIR/.venv"
if [ ! -d "$VENV_DIR" ]; then
$PYTHON -m venv "$VENV_DIR"
echo " created .venv"
fi
VENV_PYTHON="$VENV_DIR/bin/python"
"$VENV_PYTHON" -m pip install -r "$PROJECT_DIR/requirements.txt" -q
echo " packages installed ✓"
# --------------------------------------------------
# 3. 檢查 .env
# --------------------------------------------------
echo "[3/6] Checking .env..."
if [ ! -f "$PROJECT_DIR/.env" ]; then
cp "$PROJECT_DIR/.env.example" "$PROJECT_DIR/.env"
echo " Created .env from .env.example"
echo " ⚠️ 請編輯 .env 填入以下資訊:"
echo " - BFX_API_KEY"
echo " - BFX_API_SECRET"
echo " - SLACK_WEBHOOK_URL"
echo " - PAPER_TRADING=false (正式交易)"
ENV_READY=false
else
# 檢查必填欄位
ENV_READY=true
for key in BFX_API_KEY BFX_API_SECRET SLACK_WEBHOOK_URL; do
val=$(grep "^$key=" "$PROJECT_DIR/.env" | cut -d= -f2-)
if [ -z "$val" ] || [[ "$val" == *"your_"* ]]; then
echo " ⚠️ $key 尚未設定"
ENV_READY=false
fi
done
if [ "$ENV_READY" = true ]; then
echo " .env configured ✓"
else
echo " 請編輯 $PROJECT_DIR/.env 填入缺少的值"
fi
fi
# --------------------------------------------------
# 4. 檢查 Claude CLILLM 分析必需)
# --------------------------------------------------
echo "[4/6] Checking Claude CLI..."
if command -v claude &>/dev/null; then
CLAUDE_VER=$(claude --version 2>/dev/null || echo "unknown")
echo " claude $CLAUDE_VER"
else
echo " ⚠️ Claude CLI 未安裝"
echo " 安裝方式: npm install -g @anthropic-ai/claude-code"
echo " 安裝後執行 claude 登入 Anthropic 帳號"
fi
# --------------------------------------------------
# 5. 初始化資料檔案
# --------------------------------------------------
echo "[5/6] Initializing data files..."
cd "$PROJECT_DIR"
# positions.json
if [ ! -f positions.json ]; then
echo '{"total_balance_usdt": 0, "available_usdt": 0, "positions": {}, "trade_history": []}' > positions.json
echo " created positions.json"
fi
# cost_tracking.json
if [ ! -f cost_tracking.json ]; then
echo '{}' > cost_tracking.json
echo " created cost_tracking.json"
fi
# stop_orders.json
if [ ! -f stop_orders.json ]; then
echo '{}' > stop_orders.json
echo " created stop_orders.json"
fi
# bot_state.json
if [ ! -f bot_state.json ]; then
echo '{"last_status_report": 0, "run_count": 0}' > bot_state.json
echo " created bot_state.json"
fi
echo " data files ✓"
# --------------------------------------------------
# 6. 設定 crontab
# --------------------------------------------------
echo "[6/6] Setting up crontab..."
VENV_PYTHON="$PROJECT_DIR/.venv/bin/python"
CRON_MAIN="*/5 * * * * sleep 30 && cd $PROJECT_DIR && $VENV_PYTHON main.py >> cron.log 2>&1"
CRON_SYNC="2,32 * * * * cd $PROJECT_DIR && $VENV_PYTHON sync_cost_basis.py >> sync_cost_basis_cron.log 2>&1"
CRON_CHECK="7 * * * * cd $PROJECT_DIR && $VENV_PYTHON check_errors.py 2>&1"
CRON_ENV="PATH=$HOME/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# 檢查是否已有此專案的 crontab
if crontab -l 2>/dev/null | grep -q "bifitnex-trading"; then
echo " crontab already has bifitnex entries, skipping"
echo " 現有 crontab:"
crontab -l 2>/dev/null | grep "bifitnex" || true
else
# 備份現有 crontab 並附加
(crontab -l 2>/dev/null || true; cat <<CRONTAB
# --- bifitnex-trading-2 ---
$CRON_ENV
$CRON_MAIN
$CRON_SYNC
$CRON_CHECK
CRONTAB
) | crontab -
echo " crontab installed ✓"
fi
# --------------------------------------------------
# 完成
# --------------------------------------------------
echo ""
echo "=== Setup complete ==="
if [ "$ENV_READY" = true ]; then
echo "✅ 可以開始運行。測試方式:"
echo " cd $PROJECT_DIR"
echo " python3 main.py # 手動執行一次交易 cycle"
echo " python3 sync_cost_basis.py # 手動同步成本"
else
echo "⚠️ 請先完成 .env 設定,然後執行:"
echo " cd $PROJECT_DIR && python3 main.py"
fi
echo ""
echo "Crontab 排程:"
echo " main.py: 每 5 分鐘(延遲 30 秒)"
echo " sync_cost_basis.py: 每小時 :02 和 :32"
echo " check_errors.py: 每小時 :07有錯才 Slack @channel"