#!/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"