Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions .Jules/palette.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
## 2024-05-22 - Visual Hierarchy in CLI Output
**Learning:** Adding color-coded indicators (Green/Red) and emojis (πŸ’°, πŸ“‰) in CLI tools significantly reduces cognitive load when parsing financial data streams. It transforms a wall of text into a scannable narrative.
**Action:** For data-heavy CLI applications, always implement a semantic color system and visual anchors (icons/emojis) for key events.

## 2024-05-23 - CLI Accessibility and Control
**Learning:** While color and emojis enhance UX, they can be inaccessible (color blindness) or intrusive (automation logs). Providing `--no-color` and `--quiet` flags is essential for a robust CLI tool that respects user context and accessibility needs.
**Action:** Always include flags to disable visual enhancements and suppress verbose output in CLI tools.
## 2024-05-23 - CLI UX Enhancement
**Learning:** Even in CLI apps, visual distinction (colors, emojis) significantly reduces cognitive load when scanning logs.
**Action:** Use ANSI colors and consistent emojis for key events (success/failure) in future CLI tools.
48 changes: 18 additions & 30 deletions bitcoin_trading_simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,17 @@ def disable(cls):
cls.BOLD = ''


class Colors:
HEADER = '\033[95m'
BLUE = '\033[94m'
CYAN = '\033[96m'
GREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'

def simulate_bitcoin_prices(days=60, initial_price=50000, volatility=0.02):
"""
Simulates Bitcoin prices for a given number of days using Geometric Brownian Motion.
Expand Down Expand Up @@ -78,6 +89,7 @@ def simulate_trading(signals, initial_cash=10000, quiet=False):
if not quiet:
print(f"{Colors.HEADER}{Colors.BOLD}------ Daily Trading Ledger ------{Colors.ENDC}")

print(f"\n{Colors.HEADER}{Colors.BOLD}------ Daily Trading Ledger ------{Colors.ENDC}")
for i, row in signals.iterrows():
if i > 0:
portfolio.loc[i, 'cash'] = portfolio.loc[i-1, 'cash']
Expand All @@ -88,16 +100,14 @@ def simulate_trading(signals, initial_cash=10000, quiet=False):
btc_to_buy = portfolio.loc[i, 'cash'] / row['price']
portfolio.loc[i, 'btc'] += btc_to_buy
portfolio.loc[i, 'cash'] -= btc_to_buy * row['price']
if not quiet:
print(f"{Colors.GREEN}Day {i}: πŸ’° Buy {btc_to_buy:.4f} BTC at ${row['price']:.2f}{Colors.ENDC}")
print(f"{Colors.GREEN}🟒 Day {i}: Buy {btc_to_buy:.4f} BTC at ${row['price']:.2f}{Colors.ENDC}")

# Sell signal
elif row['positions'] == -2.0:
if portfolio.loc[i, 'btc'] > 0:
cash_received = portfolio.loc[i, 'btc'] * row['price']
portfolio.loc[i, 'cash'] += cash_received
if not quiet:
print(f"{Colors.RED}Day {i}: πŸ“‰ Sell {portfolio.loc[i, 'btc']:.4f} BTC at ${row['price']:.2f}{Colors.ENDC}")
print(f"{Colors.FAIL}πŸ”΄ Day {i}: Sell {portfolio.loc[i, 'btc']:.4f} BTC at ${row['price']:.2f}{Colors.ENDC}")
portfolio.loc[i, 'btc'] = 0

portfolio.loc[i, 'total_value'] = portfolio.loc[i, 'cash'] + portfolio.loc[i, 'btc'] * row['price']
Expand Down Expand Up @@ -143,35 +153,13 @@ def simulate_trading(signals, initial_cash=10000, quiet=False):
# Compare with buy and hold strategy
buy_and_hold_btc = args.initial_cash / prices.iloc[0]
buy_and_hold_value = buy_and_hold_btc * prices.iloc[-1]

print(f"\n{Colors.HEADER}{Colors.BOLD}------ Final Portfolio Performance ------{Colors.ENDC}")
print(f"Initial Cash: ${args.initial_cash:.2f}")
print(f"Initial Cash: ${initial_cash:.2f}")
print(f"Final Portfolio Value: ${final_value:.2f}")

if profit >= 0:
print(f"Profit/Loss: {Colors.GREEN}πŸ“ˆ ${profit:.2f}{Colors.ENDC}")
print(f"{Colors.GREEN}πŸ’° Profit/Loss: ${profit:.2f}{Colors.ENDC}")
else:
print(f"Profit/Loss: {Colors.RED}πŸ“‰ ${profit:.2f}{Colors.ENDC}")

print(f"{Colors.FAIL}πŸ“‰ Profit/Loss: ${profit:.2f}{Colors.ENDC}")
print(f"Buy and Hold Strategy Value: ${buy_and_hold_value:.2f}")
print(f"{Colors.HEADER}-----------------------------------------{Colors.ENDC}")

if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Bitcoin Trading Simulation')
parser.add_argument('--days', type=int, default=60, help='Number of days to simulate')
parser.add_argument('--initial-cash', type=float, default=10000, help='Initial cash amount')
parser.add_argument('--initial-price', type=float, default=50000, help='Initial Bitcoin price')
parser.add_argument('--volatility', type=float, default=0.02, help='Volatility factor')
parser.add_argument('--quiet', action='store_true', help='Suppress daily output')
parser.add_argument('--no-color', action='store_true', help='Disable colored output')

args = parser.parse_args()

main(
days=args.days,
initial_price=args.initial_price,
volatility=args.volatility,
initial_cash=args.initial_cash,
quiet=args.quiet,
no_color=args.no_color
)
Loading