142 lines
4.6 KiB
Bash
Executable File
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 "=================================================="
|