myTestFreqAI/tools/calculate_dca.sh

142 lines
4.6 KiB
Bash
Executable File

#!/bin/bash
# freqai 加仓策略计算器 (DCA Calculator)
# 根据 FreqaiPrimer 策略的5个参数进行计算
# 设置默认值 (与您的 freqaiprimer.py 代码中一致)
MAX_ENTRY_ADJUSTMENTS=4
ADD_POSITION_CALLBACK=0.025
ADD_POSITION_GROWTH=2.97
ADD_POSITION_MULTIPLIER=1.78
STAKE_DIVISOR=4.6
INITIAL_STAKE=75
# 函数:显示使用帮助
usage() {
echo "Usage: $0 [OPTIONS]"
echo "计算FreqaiPrimer策略的加仓计划"
echo ""
echo "选项:"
echo " -h, --help 显示此帮助信息"
echo " -m, --max-adjustments N 最大加仓次数 (默认: $MAX_ENTRY_ADJUSTMENTS)"
echo " -c, --callback FLOAT 基础回调百分比 (默认: $ADD_POSITION_CALLBACK)"
echo " -g, --growth FLOAT 加仓金额增长因子 (默认: $ADD_POSITION_GROWTH)"
echo " -p, --multiplier FLOAT 加仓间隔系数 (默认: $ADD_POSITION_MULTIPLIER)"
echo " -d, --divisor FLOAT 加仓金额分母 (默认: $STAKE_DIVISOR)"
echo " -s, --stake FLOAT 首次入场金额 (默认: $INITIAL_STAKE USDT)"
exit 1
}
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
usage
;;
-m|--max-adjustments)
MAX_ENTRY_ADJUSTMENTS="$2"
shift 2
;;
-c|--callback)
ADD_POSITION_CALLBACK="$2"
shift 2
;;
-g|--growth)
ADD_POSITION_GROWTH="$2"
shift 2
;;
-p|--multiplier)
ADD_POSITION_MULTIPLIER="$2"
shift 2
;;
-d|--divisor)
STAKE_DIVISOR="$2"
shift 2
;;
-s|--stake)
INITIAL_STAKE="$2"
shift 2
;;
*)
echo "未知参数: $1"
usage
;;
esac
done
# 检查 bc 是否安装
if ! command -v bc &> /dev/null; then
echo "错误: 计算需要 'bc' 工具,请先安装。"
echo "在 Ubuntu/Debian 上: sudo apt-get install bc"
echo "在 CentOS/RHEL 上: sudo yum install bc"
exit 1
fi
# 计算并输出结果
echo "=================================================="
echo " FreqaiPrimer 加仓策略计算报告"
echo "=================================================="
echo "初始入场金额: ${INITIAL_STAKE} USDT"
echo "最大加仓次数: ${MAX_ENTRY_ADJUSTMENTS}"
echo "基础回调阈值: $(awk "BEGIN {printf \"%.3f\", ${ADD_POSITION_CALLBACK}*100}")%"
echo "增长因子 (G): ${ADD_POSITION_GROWTH}"
echo "间隔系数 (M): ${ADD_POSITION_MULTIPLIER}"
echo "金额分母 (D): ${STAKE_DIVISOR}"
echo "=================================================="
printf "%-8s %-12s %-12s %-12s %-12s\n" "阶段" "累计跌幅" "本次下滑" "加仓金额" "累计投入"
printf "%-8s %-12s %-12s %-12s %-12s\n" "--------" "------------" "------------" "------------" "------------"
# 初始化变量
total_investment=$INITIAL_STAKE
current_callback=$ADD_POSITION_CALLBACK
previous_callback=0
# 循环计算每次加仓
for ((i=0; i<=MAX_ENTRY_ADJUSTMENTS; i++)); do
# 计算当前阶段名称
if [ $i -eq 0 ]; then
stage="首次开仓"
else
stage="${i}次加仓"
fi
# 计算累计跌幅 (从初始价算起)
cumulative_drop=$(echo "$current_callback * 100" | bc -l)
# 计算本次加仓与上一次之间的实际价格下滑
if [ $i -eq 0 ]; then
price_slip="--"
else
actual_slip=$(echo "($current_callback - $previous_callback) * 100" | bc -l)
price_slip=$(printf "%.2f%%" $actual_slip)
fi
# 计算加仓金额
if [ $i -eq 0 ]; then
stake_amount=$INITIAL_STAKE
else
# additional_stake = (initial_stake / stake_divisor) * (add_position_growth) ^ (adjustment_count + 1)
exponent=$((i + 1))
stake_amount=$(echo "scale=2; ($INITIAL_STAKE / $STAKE_DIVISOR) * e(l($ADD_POSITION_GROWTH) * $exponent)" | bc -l)
fi
# 更新累计投入
total_investment=$(echo "scale=2; $total_investment + $stake_amount" | bc -l)
# 格式化输出
printf "%-8s %-12s %-12s %-12s %-12s\n" \
"$stage" \
"$(printf "%.2f%%" $cumulative_drop)" \
"$price_slip" \
"$(printf "%.2f" $stake_amount)" \
"$(printf "%.2f" $total_investment)"
# 为下一次迭代准备
previous_callback=$current_callback
current_callback=$(echo "$current_callback * $ADD_POSITION_MULTIPLIER" | bc -l)
done
echo "=================================================="
echo "总投入资金: ${total_investment} USDT"
echo "=================================================="