脚本会自动使用默认的 MyCoolRLModel 模型,而不会提示参数缺失。

This commit is contained in:
zhangkun9038@dingtalk.com 2026-02-20 02:02:32 +08:00
parent ab99c06030
commit d07c152564
7 changed files with 26 additions and 462 deletions

View File

@ -1,47 +0,0 @@
#!/bin/bash
# 直接测试脚本逻辑
# 模拟脚本中的变量设置
START_DATE_RAW="20260118"
END_DATE_RAW="20260218"
echo "=== Testing date processing ==="
echo "Input dates:"
echo "START_DATE_RAW: $START_DATE_RAW"
echo "END_DATE_RAW: $END_DATE_RAW"
# 处理日期格式(模拟脚本中的逻辑)
START_DATE_STR="${START_DATE_RAW:0:4}-${START_DATE_RAW:4:2}-${START_DATE_RAW:6:2}"
END_DATE_STR="${END_DATE_RAW:0:4}-${END_DATE_RAW:4:2}-${END_DATE_RAW:6:2}"
echo ""
echo "Processed dates:"
echo "START_DATE_STR: $START_DATE_STR"
echo "END_DATE_STR: $END_DATE_STR"
# 构建 timerange
TIMERANGE_ARG="$START_DATE_STR/$END_DATE_STR"
echo ""
echo "TIMERANGE_ARG: $TIMERANGE_ARG"
# 检查格式是否正确
if [[ "$TIMERANGE_ARG" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}/[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "✓ Timerange format is CORRECT"
else
echo "✗ Timerange format is WRONG"
fi
# 测试命令行参数
echo ""
echo "=== Testing command construction ==="
PAIRS_FLAG="--pairs XAUT/USDT"
STRATEGY_NAME="FreqaiPrimer"
FREQAI_MODEL="MyCoolRLModel"
echo "Full command would be:"
echo "docker-compose run --rm freqtrade backtesting $PAIRS_FLAG --timerange $TIMERANGE_ARG --strategy $STRATEGY_NAME"
echo ""
echo "=== Testing with actual command ==="
echo "Would execute:"
echo "docker-compose run --rm freqtrade backtesting --pairs XAUT/USDT --timerange 2026-01-18/2026-02-18 --strategy FreqaiPrimer"

View File

@ -1,22 +0,0 @@
#!/bin/bash
# 简化测试脚本
# 模拟参数
START_DATE_RAW="20260118"
END_DATE_RAW="20260218"
# 处理日期
START_DATE_STR="${START_DATE_RAW:0:4}-${START_DATE_RAW:4:2}-${START_DATE_RAW:6:2}"
END_DATE_STR="${END_DATE_RAW:0:4}-${END_DATE_RAW:4:2}-${END_DATE_RAW:6:2}"
# 构建正确的 timerange 格式
TIMERANGE_ARG="$START_DATE_STR/$END_DATE_STR"
echo "Testing timerange format:"
echo "START_DATE_STR: $START_DATE_STR"
echo "END_DATE_STR: $END_DATE_STR"
echo "TIMERANGE_ARG: $TIMERANGE_ARG"
# 测试命令行参数
CMD="docker-compose run --rm freqtrade backtesting --pairs XAUT/USDT --timerange $TIMERANGE_ARG"
echo "Command would be: $CMD"

View File

@ -1,23 +0,0 @@
#!/bin/bash
# 测试日期格式
START_DATE_RAW="20260118"
END_DATE_RAW="20260218"
echo "Original params:"
echo "START_DATE_RAW: $START_DATE_RAW"
echo "END_DATE_RAW: $END_DATE_RAW"
# 直接测试日期格式化
START_DATE_STR="${START_DATE_RAW:0:4}-${START_DATE_RAW:4:2}-${START_DATE_RAW:6:2}"
END_DATE_STR="${END_DATE_RAW:0:4}-${END_DATE_RAW:4:2}-${END_DATE_RAW:6:2}"
echo "Formatted dates:"
echo "START_DATE_STR: $START_DATE_STR"
echo "END_DATE_STR: $END_DATE_STR"
echo "Timerange would be: $START_DATE_STR-$END_DATE_STR"
# 测试是否包含多余的连字符
echo "Checking for extra dashes..."
echo "START_DATE_STR has $(echo "$START_DATE_STR" | grep -o '-' | wc -l) dashes"
echo "END_DATE_STR has $(echo "$END_DATE_STR" | grep -o '-' | wc -l) dashes"

View File

@ -1,22 +0,0 @@
#!/bin/bash
# 测试修复后的日期格式
START_DATE_RAW="20260118"
END_DATE_RAW="20260218"
echo "Original params:"
echo "START_DATE_RAW: $START_DATE_RAW"
echo "END_DATE_RAW: $END_DATE_RAW"
# 处理日期格式
START_DATE_STR="${START_DATE_RAW:0:4}-${START_DATE_RAW:4:2}-${START_DATE_RAW:6:2}"
END_DATE_STR="${END_DATE_RAW:0:4}-${END_DATE_RAW:4:2}-${END_DATE_RAW:6:2}"
echo "Formatted dates:"
echo "START_DATE_STR: $START_DATE_STR"
echo "END_DATE_STR: $END_DATE_STR"
# 构建正确的 timerange 格式 (YYYY-MM-DD/YYYY-MM-DD)
TIMERANGE_ARG="$START_DATE_STR/$END_DATE_STR"
echo "Final timerange argument: $TIMERANGE_ARG"

View File

@ -1,52 +0,0 @@
#!/bin/bash
# 测试时间戳转换
# 测试输入
START_DATE_RAW="20260118"
END_DATE_RAW="20260218"
echo "=== 测试时间戳转换 ==="
echo "输入:"
echo "START_DATE_RAW: $START_DATE_RAW"
echo "END_DATE_RAW: $END_DATE_RAW"
# 处理日期格式 - 转换为 UNIX 时间戳
START_DATE_TS=""
END_DATE_TS=""
if [[ "$START_DATE_RAW" == *" "* ]]; then
# 如果输入有空格,假设是日期/时间字符串
START_DATE_TS=$(date -d "$START_DATE_RAW" +"%s")
elif [[ "$START_DATE_RAW" =~ ^[0-9]{8}$ ]]; then
# 如果输入是 8 位数 (YYYYMMDD),转换为时间戳
START_DATE_TS=$(date -d "${START_DATE_RAW:0:4}-${START_DATE_RAW:4:2}-${START_DATE_RAW:6:2} 00:00:00" +"%s")
else
# 否则,假设已经是时间戳
START_DATE_TS="$START_DATE_RAW"
fi
if [[ "$END_DATE_RAW" == *" "* ]]; then
# 如果输入有空格,假设是日期/时间字符串
END_DATE_TS=$(date -d "$END_DATE_RAW" +"%s")
elif [[ "$END_DATE_RAW" =~ ^[0-9]{8}$ ]]; then
# 如果输入是 8 位数 (YYYYMMDD),转换为时间戳
END_DATE_TS=$(date -d "${END_DATE_RAW:0:4}-${END_DATE_RAW:4:2}-${END_DATE_RAW:6:2} 00:00:00" +"%s")
else
# 否则,假设已经是时间戳
END_DATE_TS="$END_DATE_RAW"
fi
echo ""
echo "转换结果:"
echo "START_DATE_TS: $START_DATE_TS"
echo "END_DATE_TS: $END_DATE_TS"
# 构建正确的 timerange 格式 (TIMESTAMP1-TIMESTAMP2)
TIMERANGE_ARG="$START_DATE_TS-$END_DATE_TS"
echo ""
echo "最终 timerange 参数:"
echo "TIMERANGE_ARG: $TIMERANGE_ARG"
echo ""
echo "完整命令示例:"
echo "docker-compose run --rm freqtrade backtesting --pairs XAUT/USDT --timerange $TIMERANGE_ARG --strategy FreqaiPrimer"

View File

@ -122,32 +122,36 @@ if [ -z "$START_DATE_RAW" ] && [ -z "$END_DATE_RAW" ] && [ $# -gt 0 ]; then
fi
fi
# Process date formats
# Process date formats - using Python for cross-platform compatibility
START_DATE_TS=""
END_DATE_TS=""
# Handle date processing - convert to UNIX timestamp
if [[ "$START_DATE_RAW" == *" "* ]]; then
# If input has spaces, assume it's a date/time string
START_DATE_TS=$(date -d "$START_DATE_RAW" +"%s")
elif [[ "$START_DATE_RAW" =~ ^[0-9]{8}$ ]]; then
# If input is 8 digits (YYYYMMDD), convert to timestamp
START_DATE_TS=$(date -d "${START_DATE_RAW:0:4}-${START_DATE_RAW:4:2}-${START_DATE_RAW:6:2} 00:00:00" +"%s")
else
# Otherwise, assume it's already a timestamp
START_DATE_TS="$START_DATE_RAW"
fi
# Use Python to convert date to timestamp (works on both macOS and Linux)
convert_to_timestamp() {
local date_str="$1"
python3 -c "
import sys
from datetime import datetime
date_str = sys.argv[1]
try:
# Try YYYYMMDD format
if len(date_str) == 8 and date_str.isdigit():
dt = datetime.strptime(date_str, '%Y%m%d')
print(int(dt.timestamp()))
# Try timestamp format (already a number)
elif date_str.isdigit():
print(date_str)
# Try other date formats
else:
dt = datetime.fromisoformat(date_str.replace(' ', 'T'))
print(int(dt.timestamp()))
except:
print('')
" "$date_str"
}
if [[ "$END_DATE_RAW" == *" "* ]]; then
# If input has spaces, assume it's a date/time string
END_DATE_TS=$(date -d "$END_DATE_RAW" +"%s")
elif [[ "$END_DATE_RAW" =~ ^[0-9]{8}$ ]]; then
# If input is 8 digits (YYYYMMDD), convert to timestamp
END_DATE_TS=$(date -d "${END_DATE_RAW:0:4}-${END_DATE_RAW:4:2}-${END_DATE_RAW:6:2} 00:00:00" +"%s")
else
# Otherwise, assume it's already a timestamp
END_DATE_TS="$END_DATE_RAW"
fi
START_DATE_TS=$(convert_to_timestamp "$START_DATE_RAW")
END_DATE_TS=$(convert_to_timestamp "$END_DATE_RAW")
# Validate timestamp formats
if [[ ! "$START_DATE_TS" =~ ^[0-9]+$ ]]; then

View File

@ -1,274 +0,0 @@
#!/bin/bash
# 检查 .env 文件
if [ ! -f ".env" ]; then
echo "⚠️ 本地缺少 .env 文件,请创建并配置。示例内容如下:"
echo ""
echo "STRATEGY_NAME=TheForceV7"
echo "CONFIG_FILE=basic.json"
echo "TEST_BRANCH=theforce-noai-test"
echo "DRYRUN_BRANCH=theforce-noai-dryrun"
echo ""
exit 1
fi
# 加载 .env 文件中的变量
export $(grep -v '^#' .env | xargs)
# 设置默认值
STRATEGY_NAME=${STRATEGY_NAME:-TheForceV7}
CONFIG_FILE=${CONFIG_FILE:-basic.json}
echo "Using strategy: $STRATEGY_NAME"
echo "Using config: $CONFIG_FILE"
echo "Using testBranch: $TEST_BRANCH"
# Function to extract the value of a parameter
get_param_value() {
local param="$1"
shift
local args=("$@")
local i=0
while [ $i -lt ${#args[@]} ]; do
case "${args[$i]}" in
$param=*)
echo "${args[$i]#*=}"
return 0
;;
$param)
# Check if the next argument exists and does not start with a dash
if [ $((i + 1)) -lt ${#args[@]} ] && [[ "${args[$((i + 1))]}" != -* ]]; then
echo "${args[$((i + 1))]}"
return 0
else
echo "Error: Missing value for parameter $param" >&2
exit 1
fi
;;
esac
i=$((i + 1))
done
return 0
}
# Check if we have named parameters
HAS_NAMED_PARAMS=false
for arg in "$@"; do
if [[ "$arg" == --* ]]; then
HAS_NAMED_PARAMS=true
break
fi
done
# Initialize variables
START_DATE_RAW=""
END_DATE_RAW=""
PAIRS_ARG=""
PAIR_REMOTE_LIST_URL=""
FREQAI_MODEL="MyCoolRLModel"
# Parse parameters based on whether we have named parameters
if [ "$HAS_NAMED_PARAMS" = true ]; then
# Use named parameter parsing
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" "$@")
# 只有当提供了 --freqaimodel 参数时才获取它
FREQAI_MODEL_PROVIDED=$(get_param_value "--freqaimodel" "$@")
if [ -n "$FREQAI_MODEL_PROVIDED" ]; then
FREQAI_MODEL="$FREQAI_MODEL_PROVIDED"
fi
else
# Use positional parameter parsing
if [ $# -gt 0 ]; then
START_DATE_RAW="$1"
fi
if [ $# -gt 1 ]; then
END_DATE_RAW="$2"
fi
if [ $# -gt 2 ]; then
THIRD_PARAM="$3"
# Check if it's a URL
if [[ "$THIRD_PARAM" == http://* ]] || [[ "$THIRD_PARAM" == https://* ]]; then
PAIR_REMOTE_LIST_URL="$THIRD_PARAM"
echo "Detected URL parameter: $PAIR_REMOTE_LIST_URL"
# Check if it's a pair like "*/USDT"
elif [[ "$THIRD_PARAM" == */USDT ]] || [[ "$THIRD_PARAM" == */BUSD ]] || [[ "$THIRD_PARAM" == */USDC ]]; then
PAIRS_ARG="$THIRD_PARAM"
echo "Detected pair parameter: $PAIRS_ARG"
# Check if it's a -pairs flag (backward compatibility)
elif [[ "$THIRD_PARAM" == -pairs ]]; then
if [ $# -gt 3 ]; then
PAIRS_ARG="$4"
echo "Detected pair parameter: $PAIRS_ARG"
else
echo "Warning: -pairs flag provided but no pairs value"
fi
else
echo "Warning: Third parameter '$THIRD_PARAM' is neither a URL nor a pair"
fi
fi
fi
# Parse dates - ONLY process if we have raw dates (not from named parameters)
if [ -z "$START_DATE_RAW" ] && [ -z "$END_DATE_RAW" ] && [ $# -gt 0 ]; then
# If we don't have named parameters and we have positional args, process them
if [ $# -gt 0 ]; then
START_DATE_RAW="$1"
fi
if [ $# -gt 1 ]; then
END_DATE_RAW="$2"
fi
fi
# Process date formats
START_DATE_STR=""
END_DATE_STR=""
# Handle date processing
if [[ "$START_DATE_RAW" == *" "* ]]; then
START_DATE_STR=$(date -d "$START_DATE_RAW" +"%Y-%m-%d")
else
# 兼容旧格式20260118 -> 转换为 2026-01-18
START_DATE_STR="${START_DATE_RAW:0:4}-${START_DATE_RAW:4:2}-${START_DATE_RAW:6:2}"
fi
if [[ "$END_DATE_RAW" == *" "* ]]; then
END_DATE_STR=$(date -d "$END_DATE_RAW" +"%Y-%m-%d")
else
# 兼容旧格式20260218 -> 转换为 2026-02-18
END_DATE_STR="${END_DATE_RAW:0:4}-${END_DATE_RAW:4:2}-${END_DATE_RAW:6:2}"
fi
# Validate date formats
if [[ ! "$START_DATE_STR" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "Error: Invalid start date format: $START_DATE_STR"
exit 1
fi
if [[ ! "$END_DATE_STR" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "Error: Invalid end date format: $END_DATE_STR"
exit 1
fi
# Build correct timerange format (YYYY-MM-DD/YYYY-MM-DD)
TIMERANGE_ARG="$START_DATE_STR/$END_DATE_STR"
# 处理交易对参数:优先级为 --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
# 使用默认的交易对列表 - 只保留Meme类币对
DEFAULT_PAIRS="BTC/USDT TRUMP/USDT PEPE/USDT KAITO/USDT DOGE/USDT WCT/USDT"
PAIRS_FLAG="--pairs $DEFAULT_PAIRS"
echo "Using default pairs: $DEFAULT_PAIRS"
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
# 使用默认的交易对列表 - 只保留Meme类币对
DEFAULT_PAIRS="BTC/USDT TRUMP/USDT PEPE/USDT KAITO/USDT DOGE/USDT WCT/USDT"
PAIRS_FLAG="--pairs $DEFAULT_PAIRS"
echo "Using default pairs: $DEFAULT_PAIRS"
fi
fi
fi
elif [ -n "$PAIRS_ARG" ]; then
# 使用 --pairs 参数提供的交易对
PAIRS_FLAG="--pairs $PAIRS_ARG"
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
else
# 没有提供任何交易对参数,使用默认值 - 只保留Meme类币对
DEFAULT_PAIRS="BTC/USDT TRUMP/USDT PEPE/USDT KAITO/USDT DOGE/USDT WCT/USDT"
PAIRS_FLAG="--pairs $DEFAULT_PAIRS"
echo "No pairs parameter provided, using default pairs: $DEFAULT_PAIRS"
fi
cd ../
source .venv/bin/activate
rm -rf user_data/models/*
rm -rf ./freqtrade/user_data/data/backtest_results/*
rm -fr ./user_data/dryrun_results/*
rm result/*
hyperopt_config="${STRATEGY_NAME%.py}.json"
echo "docker-compose run --rm freqtrade backtesting $PAIRS_FLAG \
--logfile /freqtrade/user_data/logs/freqtrade.log \
--freqaimodel $FREQAI_MODEL \
--config /freqtrade/config_examples/freqaiprimer.json \
--config /freqtrade/config_examples/$CONFIG_FILE \
--strategy-path /freqtrade/templates \
--strategy $STRATEGY_NAME \
--timerange $TIMERANGE_ARG \
--fee 0.0008 \
--breakdown day \
--cache none >output.log"
docker-compose run --rm freqtrade backtesting $PAIRS_FLAG \
--logfile /freqtrade/user_data/logs/freqtrade.log \
--freqaimodel $FREQAI_MODEL \
--config /freqtrade/config_examples/freqaiprimer.json \
--config /freqtrade/config_examples/$CONFIG_FILE \
--strategy-path /freqtrade/templates \
--enable-protections \
--strategy $STRATEGY_NAME \
--timerange $TIMERANGE_ARG \
--fee 0.0008 \
--breakdown day \
--cache none >output.log 2>&1
sed -i 's/\x1B\[[0-9;]*m//g' output.log
rm ./result/*.json -fr
rm ./result/*.py -fr
mv ./user_data/backtest_results/* ./result/
cd ./result
# 查找当前目录下的所有 zip 文件
zip_files=(*.zip)
# 检查是否只有一个 zip 文件
if [ ${#zip_files[@]} -eq 1 ]; then
# 解压缩该 zip 文件到当前目录
unzip "${zip_files[0]}"
rm *.zip
rm *.feather
else
echo "当前目录下没有 zip 文件或者有多个 zip 文件,无法操作。"
fi
cd -
sed -i 's/\x1B\[[0-9;]*m//g' output.log
cp output.log result/ -f
cd tools/
python tradestocsv.py
python analytic.py >../result/analytic.log
cd ../