脚本支持 pairRemoteList 参数

This commit is contained in:
phyer 2025-08-08 10:19:50 +08:00
parent 392effbccd
commit 3ad13472f9
5 changed files with 300 additions and 42 deletions

View File

@ -34,11 +34,6 @@
"rateLimit": 500,
"timeout": 20000
},
"pair_whitelist": [
"BTC/USDT",
"SOL/USDT"
],
"pair_blacklist": []
},
"entry_pricing": {
"price_side": "same",
@ -55,11 +50,6 @@
"use_order_book": true,
"order_book_top": 1
},
"pairlists": [
{
"method": "StaticPairList"
}
],
"freqai": {
"enabled": true,
"data_kitchen": {

View File

@ -21,22 +21,50 @@ CONFIG_FILE=${CONFIG_FILE:-basic.json}
echo "Using strategy: $STRATEGY_NAME"
echo "Using config: $CONFIG_FILE"
echo "Using testBranch: $TEST_BRANCH"
# Parse command line arguments
START_DATE=${1:-$(date -d "2 days ago" +"%Y%m%d")}
END_DATE=${2:-$(date -d "tomorrow" +"%Y%m%d")}
PAIRS_ARG=${3:-""} # Optional --pairs argument for docker-compose
PARAMS_NAME=$(echo "$STRATEGY_NAME" | tr '[:upper:]' '[:lower:]')
# If PAIRS_ARG is provided, format it for docker-compose
if [ -n "$PAIRS_ARG" ]; then
PAIRS_FLAG="--pairs $PAIRS_ARG"
else
PAIRS_FLAG=""
fi
# Parse command line arguments
START_DATE_RAW=${1:-$(date -d "2 days ago" +"%Y-%m-%d %H:%M:%S")}
END_DATE_RAW=${2:-$(date -d "tomorrow" +"%Y-%m-%d %H:%M:%S")}
# 判断是否包含空格,如果是,则按完整时间解析并转为时间戳
# Function to extract the value of a parameter
get_param_value() {
local param="$1"
shift
while [[ $# -gt 0 ]]; do
case "$1" in
$param=*)
echo "${1#*=}"
return
;;
$param)
# Check if the next argument exists and does not start with a dash
if [[ -n "$2" && "$2" != -* ]]; then
echo "$2"
return
else
echo "Error: Missing value for parameter $param" >&2
exit 1
fi
;;
esac
shift
done
echo ""
return
}
# Parse command line arguments
START_DATE_RAW=$(get_param_value "--start-date" "$@")
END_DATE_RAW=$(get_param_value "--end-date" "$@")
PAIRS_ARG=$(get_param_value "--pairs" "$@")
PAIR_REMOTE_LIST_URL=$(get_param_value "--pairRemoteList" "$@")
# Set default values if parameters not provided
if [ -z "$START_DATE_RAW" ]; then
START_DATE_RAW=$(date -d "2 days ago" +"%Y-%m-%d %H:%M:%S")
fi
if [ -z "$END_DATE_RAW" ]; then
END_DATE_RAW=$(date -d "tomorrow" +"%Y-%m-%d %H:%M:%S")
fi
# Parse dates
if [[ "$START_DATE_RAW" == *" "* ]]; then
START_DATE=$(date -d "$START_DATE_RAW" +"%s")
else
@ -50,6 +78,57 @@ else
END_DATE=$(date -d "${END_DATE_RAW:0:4}-${END_DATE_RAW:4:2}-${END_DATE_RAW:6:2} 00:00:00" +"%s")
fi
# 处理交易对参数:优先级为 --pairRemoteList > --pairs > 默认值
if [ -n "$PAIR_REMOTE_LIST_URL" ]; then
# 从远程API获取交易对列表
echo "Fetching pairs from remote URL: $PAIR_REMOTE_LIST_URL"
pairs_json=$(curl -s "$PAIR_REMOTE_LIST_URL")
# 检查API响应是否成功
if [[ $? -ne 0 || -z "$pairs_json" ]]; then
echo "Error: Failed to fetch pairs from remote URL, using --pairs parameter or default"
if [ -n "$PAIRS_ARG" ]; then
PAIRS_FLAG="--pairs $PAIRS_ARG"
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
else
PAIRS_FLAG=""
echo "No pairs parameter provided, using freqtrade default"
fi
else
# 解析JSON并提取交易对将连字符替换为斜杠
remote_pairs=$(echo "$pairs_json" | python3 -c "
import sys, json
data = json.load(sys.stdin)
pairs = [pair.replace('-', '/') for pair in data.get('pairlist', [])]
print(' '.join(pairs) if pairs else '')
")
# 如果解析成功且有交易对
if [[ -n "$remote_pairs" ]]; then
PAIRS_FLAG="--pairs $remote_pairs"
echo "Successfully fetched $(echo "$remote_pairs" | wc -w) pairs from remote URL"
echo "Pairs: $remote_pairs"
else
echo "Error: Failed to parse or empty pairlist from remote URL, using --pairs parameter or default"
if [ -n "$PAIRS_ARG" ]; then
PAIRS_FLAG="--pairs $PAIRS_ARG"
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
else
PAIRS_FLAG=""
echo "No pairs parameter provided, using freqtrade default"
fi
fi
fi
elif [ -n "$PAIRS_ARG" ]; then
# 使用 --pairs 参数提供的交易对
PAIRS_FLAG="--pairs $PAIRS_ARG"
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
else
# 没有提供任何交易对参数
PAIRS_FLAG=""
echo "No pairs parameter provided, using freqtrade default"
fi
cd ../
source .venv/bin/activate
rm -rf user_data/models/*
@ -58,7 +137,6 @@ rm -fr ./user_data/dryrun_results/*
rm result/*
hyperopt_config="${STRATEGY_NAME%.py}.json"
#docker-compose -f docker-compose_backtest.yml run --rm freqtrade >output.log 2>&1
echo "docker-compose run --rm freqtrade backtesting $PAIRS_FLAG \
--logfile /freqtrade/user_data/logs/freqtrade.log \
@ -69,8 +147,9 @@ echo "docker-compose run --rm freqtrade backtesting $PAIRS_FLAG \
--enable-protections \
--timerange $START_DATE-$END_DATE \
--fee 0.0008 \
--breakdown day \
--cache none >output.log"
#LightGBMRegressorMultiTarget
docker-compose run --rm freqtrade backtesting $PAIRS_FLAG \
--logfile /freqtrade/user_data/logs/freqtrade.log \
--freqaimodel LightGBMRegressorMultiTarget \
@ -82,9 +161,8 @@ docker-compose run --rm freqtrade backtesting $PAIRS_FLAG \
--fee 0.0008 \
--breakdown day \
--cache none >output.log 2>&1
sed -i 's/\x1B\[[0-9;]*m//g' output.log
#python3 tools/filter.py
sed -i 's/\x1B\[[0-9;]*m//g' output.log
rm ./result/*.json -fr
rm ./result/*.py -fr
@ -106,7 +184,6 @@ fi
cd -
sed -i 's/\x1B\[[0-9;]*m//g' output.log
#python3 ../filter.py
cp output.log result/ -f
cd tools/
python tradestocsv.py

View File

@ -74,7 +74,32 @@ timeframe=$(get_csv_param_value "--timeframe" "$@")
# Use default values if parameters are not provided
if [[ -z "$pairs" ]]; then
pairs="BTC/USDT TON/USDT DOT/USDT XRP/USDT OKB/USDT SOL/USDT DOGE/USDT WCT/USDT TRUMP/USDT SUI/USDT PEPE/USDT TRB/USDT MASK/USDT UNI/USDT KAITO/USDT"
# 从API获取交易对列表
echo "Fetching pairs from API..."
pairs_json=$(curl -s "http://pairlist.xl.home/api/pairlist?mute=true&count=50")
# 检查API响应是否成功
if [[ $? -ne 0 || -z "$pairs_json" ]]; then
echo "Error: Failed to fetch pairs from API, using fallback list"
pairs="BTC/USDT TON/USDT DOT/USDT XRP/USDT OKB/USDT SOL/USDT DOGE/USDT WCT/USDT TRUMP/USDT SUI/USDT PEPE/USDT TRB/USDT MASK/USDT UNI/USDT KAITO/USDT"
else
# 解析JSON并提取交易对将连字符替换为斜杠
pairs=$(echo "$pairs_json" | python3 -c "
import sys, json
data = json.load(sys.stdin)
pairs = [pair.replace('-', '/') for pair in data.get('pairlist', [])]
print(' '.join(pairs) if pairs else '')
")
# 如果解析失败,使用备用列表
if [[ -z "$pairs" ]]; then
echo "Error: Failed to parse API response, using fallback list"
pairs="BTC/USDT TON/USDT DOT/USDT XRP/USDT OKB/USDT SOL/USDT DOGE/USDT WCT/USDT TRUMP/USDT SUI/USDT PEPE/USDT TRB/USDT MASK/USDT UNI/USDT KAITO/USTS"
else
echo "Successfully fetched $(echo "$pairs" | wc -w) pairs from API"
echo "Pairs: $pairs"
fi
fi
fi
if [[ -z "$timeframe" ]]; then
@ -86,7 +111,7 @@ IFS=',' read -r -a timeframe_array <<<"$timeframe"
timeframe_array_str=$(printf " '%s'" "${timeframe_array[@]}")
# Initialize the base command
cmd="docker-compose run --rm freqtrade download-data --config /freqtrade/config_examples/basic.json --pairs $pairs --timeframe$timeframe_array_str"
cmd="docker-compose run --rm freqtrade download-data --config /freqtrade/config_examples/basic.json --pairs $pairs --timeframe$timeframe_array_str --days 50"
# Add timerange or days if provided
if [[ -n "$timerange" ]]; then

View File

@ -1,6 +1,7 @@
#!/bin/bash
set -e # 出错立即停止
# 检查 .env 文件
if [ ! -f ".env" ]; then
echo "⚠️ 本地缺少 .env 文件,请创建并配置。示例内容如下:"
@ -12,6 +13,7 @@ if [ ! -f ".env" ]; then
echo ""
exit 1
fi
# 加载 .env 文件中的变量(位于项目根目录)
if [ -f ".env" ]; then
export $(grep -v '^#' .env | xargs)
@ -35,8 +37,8 @@ else
fi
# 如果当前分支名称包含 "dryrun",执行 git reset --hard
if [[ "$CURRENT_BRANCH" == *"dryrun"* ]]; then
echo "当前分支为 '$CURRENT_BRANCH',正在执行 git reset --hard 以确保代码干净..."
if [[ "$current_branch" == *"dryrun"* ]]; then
echo "当前分支为 '$current_branch',正在执行 git reset --hard 以确保代码干净..."
git reset --hard
if [ $? -ne 0 ]; then
echo "⚠️ 执行 git reset --hard 失败,请检查 Git 状态。"
@ -45,6 +47,37 @@ if [[ "$CURRENT_BRANCH" == *"dryrun"* ]]; then
echo "Git 工作区已清理。"
fi
# Function to extract the value of a parameter
get_param_value() {
local param="$1"
shift
while [[ $# -gt 0 ]]; do
case "$1" in
$param=*)
echo "${1#*=}"
return
;;
$param)
# Check if the next argument exists and does not start with a dash
if [[ -n "$2" && "$2" != -* ]]; then
echo "$2"
return
else
echo "Error: Missing value for parameter $param" >&2
exit 1
fi
;;
esac
shift
done
echo ""
return
}
# Parse command line arguments
PAIRS_ARG=$(get_param_value "--pairs" "$@")
PAIR_REMOTE_LIST_URL=$(get_param_value "--pairRemoteList" "$@")
# 加载 .env 文件中的变量
export $(grep -v '^#' .env | xargs)
# 设置默认值
@ -55,9 +88,57 @@ PARAMS_NAME=$(echo "$STRATEGY_NAME" | tr '[:upper:]' '[:lower:]')
echo "Using strategy: $STRATEGY_NAME"
echo "Using config: $CONFIG_FILE"
echo "Using testBranch: $TEST_BRANCH"
# Parse command line arguments
START_DATE=${1:-$(date -d "2 days ago" +"%Y%m%d")}
END_DATE=${2:-$(date -d "tomorrow" +"%Y%m%d")}
# 处理交易对参数:优先级为 --pairRemoteList > --pairs > 默认值
if [ -n "$PAIR_REMOTE_LIST_URL" ]; then
# 从远程API获取交易对列表
echo "Fetching pairs from remote URL: $PAIR_REMOTE_LIST_URL"
pairs_json=$(curl -s "$PAIR_REMOTE_LIST_URL")
# 检查API响应是否成功
if [[ $? -ne 0 || -z "$pairs_json" ]]; then
echo "Error: Failed to fetch pairs from remote URL, using --pairs parameter or default"
if [ -n "$PAIRS_ARG" ]; then
PAIRS_FLAG="--pairs $PAIRS_ARG"
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
else
PAIRS_FLAG=""
echo "No pairs parameter provided, using freqtrade default"
fi
else
# 解析JSON并提取交易对将连字符替换为斜杠
remote_pairs=$(echo "$pairs_json" | python3 -c "
import sys, json
data = json.load(sys.stdin)
pairs = [pair.replace('-', '/') for pair in data.get('pairlist', [])]
print(' '.join(pairs) if pairs else '')
")
# 如果解析成功且有交易对
if [[ -n "$remote_pairs" ]]; then
PAIRS_FLAG="--pairs $remote_pairs"
echo "Successfully fetched $(echo "$remote_pairs" | wc -w) pairs from remote URL"
echo "Pairs: $remote_pairs"
else
echo "Error: Failed to parse or empty pairlist from remote URL, using --pairs parameter or default"
if [ -n "$PAIRS_ARG" ]; then
PAIRS_FLAG="--pairs $PAIRS_ARG"
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
else
PAIRS_FLAG=""
echo "No pairs parameter provided, using freqtrade default"
fi
fi
fi
elif [ -n "$PAIRS_ARG" ]; then
# 使用 --pairs 参数提供的交易对
PAIRS_FLAG="--pairs $PAIRS_ARG"
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
else
# 没有提供任何交易对参数
PAIRS_FLAG=""
echo "No pairs parameter provided, using freqtrade default"
fi
cd ../
source .venv/bin/activate
@ -71,6 +152,7 @@ docker rm $(docker ps -aq) -f || true
# 获取当前 Git Commit 的前 8 位
GIT_COMMIT_SHORT=$(git rev-parse HEAD | cut -c 1-8)
echo "docker-compose run -d --rm --name freqtrade-dryrun-${GIT_COMMIT_SHORT} -p 8080:8080 freqtrade trade \
--logfile /freqtrade/user_data/logs/freqtrade.log \
--db-url sqlite:////freqtrade/user_data/tradesv3.sqlite \
@ -84,6 +166,7 @@ echo "docker-compose run -d --rm --name freqtrade-dryrun-${GIT_COMMIT_SHORT} -p
--strategy-path /freqtrade/templates"
docker-compose run -d --rm --name freqtrade-dryrun-${GIT_COMMIT_SHORT} -p 8080:8080 freqtrade trade \
$PAIRS_FLAG \
--logfile /freqtrade/user_data/logs/freqtrade.log \
--db-url sqlite:////freqtrade/user_data/tradesv3.sqlite \
--dry-run \
@ -92,5 +175,6 @@ docker-compose run -d --rm --name freqtrade-dryrun-${GIT_COMMIT_SHORT} -p 8080:8
--config /freqtrade/templates/${PARAMS_NAME}.json \
--enable-protections \
--strategy $STRATEGY_NAME \
--config /freqtrade/freqtrade/templates/${STRATEGY_NAME}.json \
--fee 0.0008 \
--strategy-path /freqtrade/templates

View File

@ -1,6 +1,7 @@
#!/bin/bash
set -e # 出错立即停止
# 检查 .env 文件
if [ ! -f ".env" ]; then
echo "⚠️ 本地缺少 .env 文件,请创建并配置。示例内容如下:"
@ -12,6 +13,7 @@ if [ ! -f ".env" ]; then
echo ""
exit 1
fi
# 加载 .env 文件中的变量(位于项目根目录)
if [ -f ".env" ]; then
export $(grep -v '^#' .env | xargs)
@ -35,8 +37,8 @@ else
fi
# 如果当前分支名称包含 "dryrun",执行 git reset --hard
if [[ "$CURRENT_BRANCH" == *"dryrun"* ]]; then
echo "当前分支为 '$CURRENT_BRANCH',正在执行 git reset --hard 以确保代码干净..."
if [[ "$current_branch" == *"dryrun"* ]]; then
echo "当前分支为 '$current_branch',正在执行 git reset --hard 以确保代码干净..."
git reset --hard
if [ $? -ne 0 ]; then
echo "⚠️ 执行 git reset --hard 失败,请检查 Git 状态。"
@ -45,6 +47,37 @@ if [[ "$CURRENT_BRANCH" == *"dryrun"* ]]; then
echo "Git 工作区已清理。"
fi
# Function to extract the value of a parameter
get_param_value() {
local param="$1"
shift
while [[ $# -gt 0 ]]; do
case "$1" in
$param=*)
echo "${1#*=}"
return
;;
$param)
# Check if the next argument exists and does not start with a dash
if [[ -n "$2" && "$2" != -* ]]; then
echo "$2"
return
else
echo "Error: Missing value for parameter $param" >&2
exit 1
fi
;;
esac
shift
done
echo ""
return
}
# Parse command line arguments
PAIRS_ARG=$(get_param_value "--pairs" "$@")
PAIR_REMOTE_LIST_URL=$(get_param_value "--pairRemoteList" "$@")
# 加载 .env 文件中的变量
export $(grep -v '^#' .env | xargs)
# 设置默认值
@ -56,9 +89,57 @@ PARAMS_NAME=$(echo "$STRATEGY_NAME" | tr '[:upper:]' '[:lower:]')
echo "Using strategy: $STRATEGY_NAME"
echo "Using config: $CONFIG_FILE"
echo "Using testBranch: $TEST_BRANCH"
# Parse command line arguments
START_DATE=${1:-$(date -d "2 days ago" +"%Y%m%d")}
END_DATE=${2:-$(date -d "tomorrow" +"%Y%m%d")}
# 处理交易对参数:优先级为 --pairRemoteList > --pairs > 默认值
if [ -n "$PAIR_REMOTE_LIST_URL" ]; then
# 从远程API获取交易对列表
echo "Fetching pairs from remote URL: $PAIR_REMOTE_LIST_URL"
pairs_json=$(curl -s "$PAIR_REMOTE_LIST_URL")
# 检查API响应是否成功
if [[ $? -ne 0 || -z "$pairs_json" ]]; then
echo "Error: Failed to fetch pairs from remote URL, using --pairs parameter or default"
if [ -n "$PAIRS_ARG" ]; then
PAIRS_FLAG="--pairs $PAIRS_ARG"
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
else
PAIRS_FLAG=""
echo "No pairs parameter provided, using freqtrade default"
fi
else
# 解析JSON并提取交易对将连字符替换为斜杠
remote_pairs=$(echo "$pairs_json" | python3 -c "
import sys, json
data = json.load(sys.stdin)
pairs = [pair.replace('-', '/') for pair in data.get('pairlist', [])]
print(' '.join(pairs) if pairs else '')
")
# 如果解析成功且有交易对
if [[ -n "$remote_pairs" ]]; then
PAIRS_FLAG="--pairs $remote_pairs"
echo "Successfully fetched $(echo "$remote_pairs" | wc -w) pairs from remote URL"
echo "Pairs: $remote_pairs"
else
echo "Error: Failed to parse or empty pairlist from remote URL, using --pairs parameter or default"
if [ -n "$PAIRS_ARG" ]; then
PAIRS_FLAG="--pairs $PAIRS_ARG"
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
else
PAIRS_FLAG=""
echo "No pairs parameter provided, using freqtrade default"
fi
fi
fi
elif [ -n "$PAIRS_ARG" ]; then
# 使用 --pairs 参数提供的交易对
PAIRS_FLAG="--pairs $PAIRS_ARG"
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
else
# 没有提供任何交易对参数
PAIRS_FLAG=""
echo "No pairs parameter provided, using freqtrade default"
fi
cd ../
source .venv/bin/activate
@ -84,6 +165,7 @@ echo "docker-compose run -d --rm --name freqtrade-dryrun-${GIT_COMMIT_SHORT} -p
--strategy-path /freqtrade/templates"
docker-compose run -d --rm --name freqtrade-dryrun-${GIT_COMMIT_SHORT} -p 8080:8080 freqtrade trade \
$PAIRS_FLAG \
--logfile /freqtrade/user_data/logs/freqtrade.log \
--db-url sqlite:////freqtrade/user_data/tradesv3.sqlite \
--freqaimodel LightGBMRegressorMultiTarget \