myTestFreqAI/calculate_position_adjustments.sh

126 lines
4.2 KiB
Bash
Executable File

#!/bin/bash
# 设置默认值
MAX_ENTRY_ADJUSTMENTS=3
ADD_POSITION_CALLBACK=0.047
STAKE_DIVISOR=2.0
ADD_POSITION_MULTIPLIER=1.6
ADD_POSITION_GROWTH=2.0
INITIAL_STAKE=1000
# 显示帮助信息
show_help() {
echo "用法: $0 [选项...]"
echo ""
echo "计算FreqAI策略中的加仓相对降幅间隔和加仓金额"
echo ""
echo "选项:"
echo " -h, --help 显示此帮助信息并退出"
echo " -m, --max-entry-adjustments 最大加仓次数 (默认: 3)"
echo " -c, --callback 基础加仓回调百分比 (默认: 0.047)"
echo " -d, --divisor 加仓金额分母 (默认: 2.0)"
echo " -p, --multiplier 加仓间隔系数 (默认: 1.6)"
echo " -g, --growth 加仓金额增长因子 (默认: 2.0)"
echo " -s, --initial-stake 初始入场金额 (默认: 1000)"
echo ""
echo "示例:"
echo " $0 使用所有默认参数运行"
echo " $0 -m 3 -c 0.047 -d 2.0 -p 1.6 -g 2.0 -s 1000 使用指定参数运行"
echo " $0 --max-entry-adjustments 3 --callback 0.03 --multiplier 1 使用等距间隔策略"
echo ""
echo "计算公式:"
echo " 相对降幅间隔 = callback * (multiplier ^ (加仓次数-1))"
echo " 加仓金额 = (initial_stake / divisor) * (growth ^ 加仓次数)"
exit 0
}
# 处理命令行参数
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help)
show_help
;;
-m|--max-entry-adjustments)
MAX_ENTRY_ADJUSTMENTS="$2"
shift 2
;;
-c|--callback)
ADD_POSITION_CALLBACK="$2"
shift 2
;;
-d|--divisor)
STAKE_DIVISOR="$2"
shift 2
;;
-p|--multiplier)
ADD_POSITION_MULTIPLIER="$2"
shift 2
;;
-g|--growth)
ADD_POSITION_GROWTH="$2"
shift 2
;;
-s|--initial-stake)
INITIAL_STAKE="$2"
shift 2
;;
-*|--*)
echo "错误: 未知选项 $1"
echo "使用 -h 或 --help 查看帮助信息"
exit 1
;;
*)
# 忽略任何非选项参数
shift
;;
esac
done
# 打印当前设置
printf "当前参数设置:\n"
printf "最大加仓次数: %d\n" "$MAX_ENTRY_ADJUSTMENTS"
printf "基础回调百分比: %.6f\n" "$ADD_POSITION_CALLBACK"
printf "加仓金额分母: %.2f\n" "$STAKE_DIVISOR"
printf "加仓间隔系数: %.2f\n" "$ADD_POSITION_MULTIPLIER"
printf "加仓金额增长因子: %.2f\n" "$ADD_POSITION_GROWTH"
printf "初始入场金额: %.2f\n\n" "$INITIAL_STAKE"
# 打印表头
printf "%-10s %-20s %-20s\n" "加仓次数" "相对降幅间隔" "加仓金额"
printf "%-10s %-20s %-20s\n" "-------" "------------" "--------"
# 计算加仓(包括初始入场)
for i in $(seq 0 $MAX_ENTRY_ADJUSTMENTS); do
# 计算当前所需的加仓间隔百分比
if [ $i -eq 0 ]; then
# 第一次是初始入场,没有回调要求
callback="N/A"
else
# 计算当前回调百分比 = 基础间隔 * (系数 ^ (i-1))
callback=$(echo "$ADD_POSITION_CALLBACK * ($ADD_POSITION_MULTIPLIER ^ ($i-1))" | bc -l)
callback=$(printf "%.6f" $callback)
fi
# 计算加仓金额
if [ $i -eq 0 ]; then
# 第一次是初始入场
stake_amount=$INITIAL_STAKE
else
# 计算加仓金额: (initial_stake / stake_divisor) * (growth ^ i)
stake_amount=$(echo "($INITIAL_STAKE / $STAKE_DIVISOR) * ($ADD_POSITION_GROWTH ^ $i)" | bc -l)
stake_amount=$(printf "%.2f" $stake_amount)
fi
# 打印结果
printf "%-10d %-20s %-20s\n" "$i" "$callback" "$stake_amount"
done
# 计算累计投入
cumulative_stake=$(echo "$INITIAL_STAKE" | bc -l)
for i in $(seq 1 $MAX_ENTRY_ADJUSTMENTS); do
stake_amount=$(echo "($INITIAL_STAKE / $STAKE_DIVISOR) * ($ADD_POSITION_GROWTH ^ $i)" | bc -l)
cumulative_stake=$(echo "$cumulative_stake + $stake_amount" | bc -l)
done
cumulative_stake=$(printf "%.2f" $cumulative_stake)
printf "\n%s\n" "累计投入金额: $cumulative_stake"