From d9fac6c604c21485598895477cd4028c405788de Mon Sep 17 00:00:00 2001 From: "zhangkun9038@dingtalk.com" Date: Wed, 26 Nov 2025 10:44:09 +0800 Subject: [PATCH] backtest.sh --- tools/backtest.sh | 84 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 59 insertions(+), 25 deletions(-) diff --git a/tools/backtest.sh b/tools/backtest.sh index e1dbff6..9f07166 100755 --- a/tools/backtest.sh +++ b/tools/backtest.sh @@ -134,17 +134,56 @@ if [ -z "$END_DATE_RAW" ]; then fi # Parse dates -if [[ "$START_DATE_RAW" == *" "* ]]; then - START_DATE=$(date -d "$START_DATE_RAW" +"%s") +if [[ "$START_DATE_RAW" == *"-"* ]]; then + # 标准格式:2025-10-31 或 2025-10-31 00:00:00 + if [[ "$OSTYPE" == "darwin"* ]]; then + START_DATE=$(date -jf "%Y-%m-%d" "${START_DATE_RAW%% *}" +"%s" 2>/dev/null) + if [ -z "$START_DATE" ]; then + START_DATE=$(date -jf "%Y-%m-%d %H:%M:%S" "$START_DATE_RAW" +"%s" 2>/dev/null) + fi + else + START_DATE=$(date -d "$START_DATE_RAW" +"%s" 2>/dev/null) + fi else - # 兼容旧格式:20250616 -> 转换为 2025-06-16 00:00:00 再转为时间戳 - START_DATE=$(date -d "${START_DATE_RAW:0:4}-${START_DATE_RAW:4:2}-${START_DATE_RAW:6:2} 00:00:00" +"%s") + # 旧格式:20251031 + YEAR="${START_DATE_RAW:0:4}" + MONTH="${START_DATE_RAW:4:2}" + DAY="${START_DATE_RAW:6:2}" + if [[ "$OSTYPE" == "darwin"* ]]; then + START_DATE=$(date -jf "%Y-%m-%d" "${YEAR}-${MONTH}-${DAY}" +"%s" 2>/dev/null) + else + START_DATE=$(date -d "${YEAR}-${MONTH}-${DAY}" +"%s" 2>/dev/null) + fi fi -if [[ "$END_DATE_RAW" == *" "* ]]; then - END_DATE=$(date -d "$END_DATE_RAW" +"%s") +if [[ "$END_DATE_RAW" == *"-"* ]]; then + # 标准格式:2025-11-24 或 2025-11-24 00:00:00 + if [[ "$OSTYPE" == "darwin"* ]]; then + END_DATE=$(date -jf "%Y-%m-%d" "${END_DATE_RAW%% *}" +"%s" 2>/dev/null) + if [ -z "$END_DATE" ]; then + END_DATE=$(date -jf "%Y-%m-%d %H:%M:%S" "$END_DATE_RAW" +"%s" 2>/dev/null) + fi + else + END_DATE=$(date -d "$END_DATE_RAW" +"%s" 2>/dev/null) + fi else - END_DATE=$(date -d "${END_DATE_RAW:0:4}-${END_DATE_RAW:4:2}-${END_DATE_RAW:6:2} 00:00:00" +"%s") + # 旧格式:20251124 + YEAR="${END_DATE_RAW:0:4}" + MONTH="${END_DATE_RAW:4:2}" + DAY="${END_DATE_RAW:6:2}" + if [[ "$OSTYPE" == "darwin"* ]]; then + END_DATE=$(date -jf "%Y-%m-%d" "${YEAR}-${MONTH}-${DAY}" +"%s" 2>/dev/null) + else + END_DATE=$(date -d "${YEAR}-${MONTH}-${DAY}" +"%s" 2>/dev/null) + fi +fi + +# 检查 date 是否成功 +if [ -z "$START_DATE" ] || [ -z "$END_DATE" ]; then + echo "Error: Failed to parse dates." + echo "START_DATE_RAW=$START_DATE_RAW -> START_DATE=$START_DATE" + echo "END_DATE_RAW=$END_DATE_RAW -> END_DATE=$END_DATE" + exit 1 fi # 处理交易对参数:优先级为 --pairRemoteList > --pairs > 默认值 @@ -216,16 +255,16 @@ if [ -n "$STRATEGY_ARG" ] && [ "$STRATEGY_ARG" != "PARAM_WITHOUT_VALUE" ]; then # 自动匹配策略对应的配置文件(使用小写) STRATEGY_CONFIG_LOWER="$(echo "$STRATEGY_ARG" | tr '[:upper:]' '[:lower:]').json" - echo "Checking auto-matched config file: freqtrade/templates/$STRATEGY_CONFIG_LOWER" + echo "Checking auto-matched config file: config_examples/$STRATEGY_CONFIG_LOWER" - # 检查小写配置文件 - if [ -f "../freqtrade/templates/$STRATEGY_CONFIG_LOWER" ]; then + # 检查配置文件(在 config_examples 目录中查找) + if [ -f "../config_examples/$STRATEGY_CONFIG_LOWER" ]; then CONFIG_FILE="$STRATEGY_CONFIG_LOWER" echo "Auto-matched config file for strategy: $CONFIG_FILE" else - echo "Warning: Auto-matched config file '$STRATEGY_CONFIG_LOWER' not found in templates directory" - echo "Available config files in templates directory:" - ls ../freqtrade/templates/*.json 2>/dev/null | sed 's|.*/||' || echo "No JSON config files found" + echo "Warning: Auto-matched config file '$STRATEGY_CONFIG_LOWER' not found in config_examples directory" + echo "Available config files in config_examples directory:" + ls ../config_examples/*.json 2>/dev/null | sed 's|.*/||' || echo "No JSON config files found" echo "Using current config: $CONFIG_FILE" fi fi @@ -237,17 +276,12 @@ if [ -n "$CONFIG_ARG" ]; then fi # 检查指定的配置文件是否存在,如果不存在则使用默认配置 -echo "Checking config file: freqtrade/templates/$CONFIG_FILE" -if [ ! -f "../freqtrade/templates/$CONFIG_FILE" ]; then - # 如果在 templates 中找不到,尝试在 config_examples 中找 - if [ ! -f "../config_examples/$CONFIG_FILE" ]; then - echo "Warning: Config file freqtrade/templates/$CONFIG_FILE not found, using default configuration" - CONFIG_FILE="basic.json" - else - echo "Config file found: config_examples/$CONFIG_FILE" - fi +echo "Checking config file: config_examples/$CONFIG_FILE" +if [ ! -f "../config_examples/$CONFIG_FILE" ]; then + echo "Warning: Config file config_examples/$CONFIG_FILE not found, using default configuration" + CONFIG_FILE="basic.json" else - echo "Config file found: freqtrade/templates/$CONFIG_FILE" + echo "Config file found: config_examples/$CONFIG_FILE" fi # 最后确认STRATEGY_NAME有值 @@ -299,7 +333,7 @@ docker-compose run --rm freqtrade backtesting $PAIRS_FLAG \ --breakdown day \ --cache none >output.log 2>&1 -sed -i 's/\x1B\[[0-9;]*m//g' output.log +sed -i '' 's/\\x1B\\[[0-9;]*m//g' output.log rm ./result/*.json -fr rm ./result/*.py -fr @@ -320,7 +354,7 @@ else fi cd - -sed -i 's/\x1B\[[0-9;]*m//g' output.log +sed -i '' 's/\\x1B\\[[0-9;]*m//g' output.log cp output.log result/ -f cd tools/ python tradestocsv.py