zhangkun9038@dingtalk.com da4c6ca193 default pairlist
2025-12-22 06:22:03 +08:00

246 lines
6.9 KiB
Bash
Executable File
Raw 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.

#!/bin/bash
set -e # 出错立即停止
### 函数定义区 ###
# 定义 remove_existing_containers 函数
remove_existing_containers() {
echo "正在查找并移除所有名称符合 'freqtrade-dryrun-*' 的容器..."
# 查找所有名称以 freqtrade-dryrun- 开头的容器
CONTAINERS=$(docker ps -aq --filter "name=freqtrade-dryrun-*")
if [ -z "$CONTAINERS" ]; then
echo "未找到任何名称符合 'freqtrade-dryrun-*' 的容器。"
return
fi
echo "找到以下容器:"
docker ps -a --filter "name=freqtrade-dryrun-*"
echo "正在自动移除所有符合条件的容器..."
# 停止并移除容器
for CONTAINER in $CONTAINERS; do
echo "正在停止容器 $CONTAINER..."
docker stop "$CONTAINER" >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "警告:无法停止容器 $CONTAINER"
continue
fi
echo "正在移除容器 $CONTAINER..."
docker rm "$CONTAINER" >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "警告:无法移除容器 $CONTAINER"
continue
fi
echo "容器 $CONTAINER 已成功移除。"
done
echo "所有符合条件的容器已处理完毕。"
}
# 1. 从SQLite数据库获取当前开放交易的币对列表
get_open_trades_pairs() {
local db_path="$1"
local pairs=()
if [ ! -f "$db_path" ]; then
echo "⚠️ 交易数据库文件 $db_path 不存在,开放交易对列表为空" >&2
echo ""
return
fi
local query_result=$(sqlite3 -header -csv "$db_path" "SELECT id, pair, open_date, amount, open_rate, max_rate, close_profit, stake_amount FROM trades WHERE is_open = 1 ORDER BY open_date DESC LIMIT 10;")
pairs=($(echo "$query_result" | awk -F ',' 'NR > 1 {print $2}' | tr -d '"'))
echo "从数据库获取到开放交易对: ${pairs[*]}" >&2
echo "${pairs[@]}"
}
# 2. 验证JSON文件格式是否有效
validate_json_file() {
local json_path="$1"
if ! command -v jq &>/dev/null; then
echo "❌ 未安装jq工具请先安装jq" >&2
exit 1
fi
if [ ! -f "$json_path" ]; then
echo "❌ JSON配置文件 $json_path 不存在" >&2
exit 1
fi
if ! jq . "$json_path" >/dev/null 2>&1; then
echo "❌ JSON文件格式错误$json_path" >&2
exit 1
fi
}
# 3. 更新live.json中的pair_whitelist
update_live_json_pair_whitelist() {
local json_path="$1"
local -a pairlist=($2)
validate_json_file "$json_path"
local json_array=$(printf '%s\n' "${pairlist[@]}" | jq -R . | jq -s .)
echo "正在更新 $json_path 中的exchange.pair_whitelist..." >&2
jq --argjson pairs "$json_array" '.exchange.pair_whitelist = $pairs' "$json_path" >"$json_path.tmp" && mv "$json_path.tmp" "$json_path"
if [ $? -eq 0 ]; then
echo "✅ 成功更新 $json_path新的pair_whitelist包含 ${#pairlist[@]} 个币对" >&2
else
echo "❌ 更新 $json_path 失败" >&2
exit 1
fi
}
### 主逻辑区 ###
# 检查 .env 文件
if [ ! -f ".env" ]; then
echo "⚠️ 本地缺少 .env 文件,请创建并配置" >&2
exit 1
fi
# 加载 .env 变量
export $(grep -v '^#' .env | xargs)
# 检查必要环境变量
if [ -z "$TEST_BRANCH" ] || [ -z "$DRYRUN_BRANCH" ]; then
echo "⚠️ .env 文件缺少 TEST_BRANCH 或 DRYRUN_BRANCH 配置" >&2
exit 1
fi
# 检查当前分支
current_branch=$(git rev-parse --abbrev-ref HEAD)
if [[ "$current_branch" != "$TEST_BRANCH" && "$current_branch" != "$DRYRUN_BRANCH" ]]; then
echo "⚠️ 错误:当前分支 '$current_branch' 不符合配置要求" >&2
exit 1
else
echo "✅ 当前分支 '$current_branch' 符合配置要求" >&2
fi
# dryrun分支清理
if [[ "$current_branch" == *"dryrun"* ]]; then
echo "当前为dryrun分支执行git reset --hard清理工作区..." >&2
git reset --hard || {
echo "⚠️ git reset失败"
exit 1
}
echo "✅ Git工作区已清理" >&2
fi
# 解析命令行参数:获取手动指定的币对列表
MANUAL_PAIRS=""
while [[ $# -gt 0 ]]; do
case "$1" in
--pairs=*)
MANUAL_PAIRS="${1#*=}"
shift
;;
--pairs)
if [[ -n "$2" && "$2" != -* ]]; then
MANUAL_PAIRS="$2"
shift 2
else
echo "错误:--pairs需要指定值" >&2
exit 1
fi
;;
*)
shift
;;
esac
done
# 加载策略配置
STRATEGY_NAME=${STRATEGY_NAME:-TheForceV7}
CONFIG_FILE=${CONFIG_FILE:-basic.json}
PARAMS_NAME=$(echo "$STRATEGY_NAME" | tr '[:upper:]' '[:lower:]')
echo "使用策略: $STRATEGY_NAME" >&2
echo "使用配置: $CONFIG_FILE" >&2
echo "测试分支: $TEST_BRANCH" >&2
### 核心:处理币对列表 ###
# 定义写死的币对白名单
DEFAULT_PAIRS="BTC/USDT TON/USDT DOT/USDT XRP/USDT OKB/USDT SOL/USDT DOGE/USDT BNB/USDT TRUMP/USDT SUI/USDT PEPE/USDT TRB/USDT MASK/USDT UNI/USDT KAITO/USDT"
# 1. 获取数据库币对(使用绝对路径)
db_path="/home/ubuntu/freqtrade/user_data/tradesv3.sqlite"
db_pairs=$(get_open_trades_pairs "$db_path")
# 2. 处理手动指定的币对
if [ -n "$MANUAL_PAIRS" ]; then
# 将逗号分隔的币对转换为空格分隔
final_pairs=$(echo "$MANUAL_PAIRS" | tr ',' ' ')
echo "使用手动指定的币对: $final_pairs" >&2
else
# 如果没有手动指定的币对,则使用写死的币对白名单
final_pairs=$DEFAULT_PAIRS
echo "使用写死的币对白名单作为最终列表: $final_pairs" >&2
fi
# 3. 更新配置文件
update_live_json_pair_whitelist "../config_examples/live.json" "$final_pairs"
# 编辑 ../freqtrade/templates/${PARAMS_NAME}.json 文件,删除包含 "protection": {}, 的行
echo "正在编辑 ../freqtrade/templates/${PARAMS_NAME}.json 文件,删除 'protection': {} 行..." >&2
sed -i '/"protection": {},/d' "../freqtrade/templates/${PARAMS_NAME}.json"
if [ $? -eq 0 ]; then
echo "✅ 成功编辑 ../freqtrade/templates/${PARAMS_NAME}.json 文件" >&2
else
echo "❌ 编辑 ../freqtrade/templates/${PARAMS_NAME}.json 文件失败" >&2
exit 1
fi
### 启动容器 ###
GIT_COMMIT_SHORT=$(git rev-parse HEAD | cut -c 1-8)
CONTAINER_NAME="freqtrade-dryrun-${GIT_COMMIT_SHORT}"
echo "准备启动容器: $CONTAINER_NAME" >&2
# 移除已存在的同名容器
remove_existing_containers "$CONTAINER_NAME"
# 清理临时文件放置交叉感染
cd ../
source .venv/bin/activate
rm -rf user_data/models/*
rm -rf ./freqtrade/user_data/data/backtest_results/*
rm -fr ./user_data/dryrun_results/*
cd -
# 启动新容器
echo "启动容器: $CONTAINER_NAME" >&2
docker-compose run -d --rm \
--name "$CONTAINER_NAME" \
-p 8080:8080 \
freqtrade trade \
--logfile /freqtrade/user_data/logs/freqtrade.log \
--db-url sqlite:////freqtrade/user_data/tradesv3.sqlite \
--freqaimodel LightGBMRegressorMultiTarget \
--fee 0.0008 \
--config /freqtrade/config_examples/$CONFIG_FILE \
--config /freqtrade/templates/${PARAMS_NAME}.json \
--config /freqtrade/config_examples/live.json \
--strategy $STRATEGY_NAME \
--strategy-path /freqtrade/templates
if [ $? -eq 0 ]; then
echo "✅ 容器 $CONTAINER_NAME 启动完成" >&2
else
echo "❌ 容器启动失败" >&2
exit 1
fi