# -*- coding: utf-8 -*-
"""FixDynAmount Simulation

Automatically generated by Colab.

Original file is located at
    https://colab.research.google.com/drive/1CRU5wewpAbkWYglUt7uXYZbFyPni0X2G
"""

import numpy as np
import matplotlib.pyplot as plt

# Parameters
win_rate = 0.83
rrr = 0.3
num_trades = 1000
initial_balance = 1000
risk_percent = 0.05  # %

# Generate trade outcomes: 1 for win, -1 for loss
np.random.seed(42)
outcomes = np.random.choice([1, -1], size=num_trades, p=[win_rate, 1 - win_rate])

# Equity curve: risk based on account balance
balance_dynamic = initial_balance
equity_dynamic = [balance_dynamic]

for outcome in outcomes:
    risk_amount = balance_dynamic * risk_percent
    if outcome == 1:
        balance_dynamic += risk_amount * rrr
    else:
        balance_dynamic -= risk_amount
    equity_dynamic.append(balance_dynamic)

# Equity curve: risk based on initial balance
balance_fixed = initial_balance
equity_fixed = [balance_fixed]
fixed_risk_amount = initial_balance * risk_percent

for outcome in outcomes:
    if outcome == 1:
        balance_fixed += fixed_risk_amount * rrr
    else:
        balance_fixed -= fixed_risk_amount
    equity_fixed.append(balance_fixed)

# Plotting
plt.figure(figsize=(8, 4))
plt.plot(equity_dynamic, label=f'Risk: {risk_percent*100}% of Account Balance', color='blue')
plt.plot(equity_fixed, label= f'Risk: {risk_percent*100} % of Initial Balance', color='green')
plt.title(f'Equity Curves for {num_trades} Trades (Win Rate={win_rate*100}%, RRR={rrr})')
plt.xlabel('Number of Trades')
plt.ylabel('Account Balance')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

# Generate random values for simulations

# Run multiple simulations and analyze stats
n_simulations = 500
dynamic_curves = []
fixed_curves = []
dynamic_max_dd = []
fixed_max_dd = []

# Run simulations
for _ in range(n_simulations):
    outcomes = np.random.choice([1, -1], size=num_trades, p=[win_rate, 1 - win_rate])

    # Dynamic risk
    balance_dynamic = initial_balance
    equity_dynamic = [balance_dynamic]
    peak = initial_balance
    max_dd = 0
    for outcome in outcomes:
        risk_amount = balance_dynamic * risk_percent
        if outcome == 1:
            balance_dynamic += risk_amount * rrr
        else:
            balance_dynamic -= risk_amount
        equity_dynamic.append(balance_dynamic)
        peak = max(peak, balance_dynamic)
        dd = (peak - balance_dynamic) / peak
        if dd > max_dd:
            max_dd = dd
    dynamic_max_dd.append(max_dd)
    dynamic_curves.append(equity_dynamic)


    # Fixed risk
    balance_fixed = initial_balance
    equity_fixed = [balance_fixed]
    peak = initial_balance
    max_dd = 0
    for outcome in outcomes:
        if outcome == 1:
            balance_fixed += fixed_risk_amount * rrr
        else:
            balance_fixed -= fixed_risk_amount
        equity_fixed.append(balance_fixed)
        peak = max(peak, balance_fixed)
        dd = (peak - balance_fixed) / peak
        if dd > max_dd:
            max_dd = dd
    fixed_max_dd.append(max_dd)
    fixed_curves.append(equity_fixed)

# Convert to NumPy arrays for stats
dynamic_array = np.array(dynamic_curves)
fixed_array = np.array(fixed_curves)

dyn_max_dd_array = np.array(dynamic_max_dd)
fix_max_dd_array = np.array(fixed_max_dd)

# Final balance statistics
def print_stats(arr, ddChange, label):
    final_balances = arr[:, -1]
    max_drawdowns_val = np.max(np.maximum.accumulate(arr, axis=1) - arr, axis=1)

    stats = {
        'Mean Final Balance': np.mean(final_balances),
        'Median Final Balance': np.median(final_balances),
        'Min Final Balance': np.min(final_balances),
        'Max Final Balance': np.max(final_balances),
        'Mean Drawdown': np.mean(max_drawdowns_val),
        'Median Drawdown': np.median(max_drawdowns_val),
        'Max Drawdown': np.max(max_drawdowns_val),
        'Mean Max Drawdown (%)': f"{np.mean(ddChange) * 100:.2f}%",
        'Median Max Drawdown (%)': f"{np.median(ddChange) * 100:.2f}%",
        'Max Drawdown (%)': f"{np.max(ddChange) * 100:.2f}%"
    }

    print(f"\n--- {label} ---")
    for stat_name, value in stats.items():
        if isinstance(value, (int, float)):
            print(f"{stat_name:<25}: ${value:,.2f}")
        else:
            print(f"{stat_name:<25}: {value}")

dynamic_label = f"Dynamic Risk ({risk_percent*100}% of Account Balance)"
fixed_label = f"Fixed Risk ({risk_percent*100}% of Initial Balance)"

print_stats(dynamic_array, dyn_max_dd_array, dynamic_label)
print_stats(fixed_array, fix_max_dd_array, fixed_label)