157 lines
6.9 KiB
Python
Executable File
157 lines
6.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""
|
||
加仓金额计算脚本
|
||
根据freqaiprimer.py中的加仓逻辑计算不同参数下的加仓金额
|
||
"""
|
||
|
||
import sys
|
||
import numpy as np
|
||
|
||
def calculate_additional_stake(initial_stake, step_coefficient, stake_divisor, entry_count, max_stake=None, current_stake=None, disable_max_stake_limit=False):
|
||
"""
|
||
计算加仓金额
|
||
|
||
参数:
|
||
- initial_stake: 初始开仓金额
|
||
- step_coefficient: 加仓金额分母系数
|
||
- stake_divisor: 加仓金额分母
|
||
- entry_count: 当前开仓次数(包括初始开仓)
|
||
- max_stake: 最大持仓金额(可选)
|
||
- current_stake: 当前持仓金额(可选)
|
||
- disable_max_stake_limit: 是否禁用最大持仓金额限制(可选,默认False)
|
||
|
||
返回:
|
||
- additional_stake: 加仓金额
|
||
"""
|
||
# 在原始代码中,entry_count是当前已经开仓的次数
|
||
# 第一次加仓时,entry_count=1(初始开仓),第二次加仓时,entry_count=2(初始+第一次加仓)
|
||
additional_stake = (step_coefficient * initial_stake / stake_divisor) ** entry_count
|
||
|
||
# 如果没有禁用最大持仓金额限制,且提供了最大持仓金额和当前持仓金额,应用限制条件
|
||
if not disable_max_stake_limit and max_stake is not None and current_stake is not None:
|
||
remaining_stake = max_stake - current_stake
|
||
# 如果剩余金额不足,则返回0表示无法加仓
|
||
if remaining_stake <= 0:
|
||
return 0
|
||
# 限制加仓金额不超过剩余可用金额
|
||
additional_stake = min(additional_stake, remaining_stake)
|
||
|
||
return additional_stake
|
||
|
||
def main():
|
||
# 检查命令行参数
|
||
if len(sys.argv) < 4 or len(sys.argv) > 7:
|
||
print("用法: python calculate_additional_stake.py <initial_stake> <step_coefficient> <stake_divisor> [max_entry_adjustments] [max_stake_multiplier] [disable_max_stake_limit]")
|
||
print("示例: python calculate_additional_stake.py 1000 0.92 2.867 2 3 false")
|
||
print(" python calculate_additional_stake.py 1000 0.92 2.867 5 0 true # 禁用最大持仓金额限制")
|
||
print("")
|
||
print("参数说明:")
|
||
print(" initial_stake - 初始开仓金额 (例如: 1000)")
|
||
print(" step_coefficient - 加仓金额分母系数 (范围: 0.5-1.5, 默认: 0.92)")
|
||
print(" stake_divisor - 加仓金额分母 (范围: 2-4, 默认: 2.867)")
|
||
print(" max_entry_adjustments - 最大加仓次数 (可选, 默认: 2)")
|
||
print(" max_stake_multiplier - 最大持仓金额倍数 (可选, 默认: 3, 即最大持仓为初始金额的3倍)")
|
||
print(" 设置为0表示不限制最大持仓金额")
|
||
print(" disable_max_stake_limit - 是否禁用最大持仓金额限制 (可选, 默认: false)")
|
||
print(" 设置为true时忽略max_stake_multiplier参数")
|
||
sys.exit(1)
|
||
|
||
# 解析参数
|
||
try:
|
||
initial_stake = float(sys.argv[1])
|
||
step_coefficient = float(sys.argv[2])
|
||
stake_divisor = float(sys.argv[3])
|
||
max_entry_adjustments = int(sys.argv[4]) if len(sys.argv) > 4 else 2
|
||
max_stake_multiplier = float(sys.argv[5]) if len(sys.argv) > 5 else 3.0
|
||
disable_max_stake_limit = sys.argv[6].lower() == 'true' if len(sys.argv) > 6 else False
|
||
except ValueError:
|
||
print("错误: 所有参数必须是数字(除了最后一个参数可以是true/false)")
|
||
sys.exit(1)
|
||
|
||
# 验证参数范围
|
||
if initial_stake <= 0:
|
||
print("错误: 初始开仓金额必须大于0")
|
||
sys.exit(1)
|
||
|
||
if not (0.5 <= step_coefficient <= 1.5):
|
||
print("警告: step_coefficient建议在0.5-1.5范围内")
|
||
|
||
if not (2 <= stake_divisor <= 4):
|
||
print("警告: stake_divisor建议在2-4范围内")
|
||
|
||
if max_entry_adjustments < 1 or max_entry_adjustments > 5:
|
||
print("警告: max_entry_adjustments建议在1-5范围内")
|
||
|
||
# 计算最大持仓金额
|
||
max_stake = None if disable_max_stake_limit or max_stake_multiplier <= 0 else initial_stake * max_stake_multiplier
|
||
|
||
# 计算从第1次到最大加仓次数的金额
|
||
print(f"\n加仓金额计算结果:")
|
||
print(f"初始开仓金额: {initial_stake}")
|
||
print(f"step_coefficient: {step_coefficient}")
|
||
print(f"stake_divisor: {stake_divisor}")
|
||
print(f"最大加仓次数: {max_entry_adjustments}")
|
||
|
||
if disable_max_stake_limit:
|
||
print(f"最大持仓金额限制: 已禁用")
|
||
elif max_stake is not None:
|
||
print(f"最大持仓金额倍数: {max_stake_multiplier} (最大持仓: {max_stake})")
|
||
else:
|
||
print(f"最大持仓金额限制: 无限制")
|
||
|
||
print("-" * 70)
|
||
|
||
results = []
|
||
current_stake = initial_stake # 当前持仓金额,初始为初始开仓金额
|
||
reached_limit = False # 标记是否达到最大持仓金额限制
|
||
|
||
for entry_count in range(1, max_entry_adjustments + 1): # 从第1次到最大加仓次数
|
||
if not reached_limit:
|
||
additional_stake = calculate_additional_stake(initial_stake, step_coefficient, stake_divisor, entry_count, max_stake, current_stake, disable_max_stake_limit)
|
||
|
||
# 如果加仓金额为0或负数,说明已达到最大持仓金额
|
||
if additional_stake <= 0 and not disable_max_stake_limit:
|
||
results.append(0)
|
||
print(f"第{entry_count}次加仓: 已达到最大持仓金额,无法加仓")
|
||
reached_limit = True
|
||
else:
|
||
results.append(additional_stake)
|
||
current_stake += additional_stake # 更新当前持仓金额
|
||
print(f"第{entry_count}次加仓金额: {additional_stake:.2f} (当前持仓: {current_stake:.2f})")
|
||
else:
|
||
results.append(0)
|
||
print(f"第{entry_count}次加仓: 已达到最大持仓金额,无法加仓")
|
||
|
||
# 输出矩阵形式
|
||
print("\n矩阵形式结果:")
|
||
print("-" * 70)
|
||
print("加仓次数 | 加仓金额 | 累计持仓")
|
||
print("-" * 70)
|
||
|
||
current_stake = initial_stake # 重置为初始金额
|
||
for i, stake in enumerate(results, 1):
|
||
if stake > 0:
|
||
current_stake += stake # 只累加有效的加仓金额
|
||
print(f" {i} | {stake:.2f} | {current_stake:.2f}")
|
||
|
||
# 计算总加仓金额
|
||
total_additional = sum(results)
|
||
print("-" * 70)
|
||
print(f"总加仓金额: {total_additional:.2f}")
|
||
print(f"总投入金额: {initial_stake + total_additional:.2f}")
|
||
|
||
# 计算每次加仓相对于初始金额的比例
|
||
print("\n每次加仓相对于初始金额的比例:")
|
||
print("-" * 70)
|
||
for i, stake in enumerate(results, 1):
|
||
ratio = stake / initial_stake * 100
|
||
print(f"第{i}次加仓: {ratio:.2f}%")
|
||
|
||
# 计算最终持仓相对于初始金额的比例
|
||
final_ratio = (initial_stake + total_additional) / initial_stake * 100
|
||
print("-" * 70)
|
||
print(f"最终持仓相对于初始金额的比例: {final_ratio:.2f}%")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|