myTestFreqAI/tools/calculate_additional_stake.py

157 lines
6.9 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()