Skip to content
Open
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
4 changes: 4 additions & 0 deletions .Jules/palette.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,7 @@
## 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-24 - CLI Error Handling
**Learning:** Crashing with a stack trace is the worst possible UX for a CLI tool. Users expect friendly error messages when they provide invalid input.
**Action:** Always validate CLI arguments and use `sys.exit(1)` with a clear, color-coded error message instead of letting exceptions bubble up.
Binary file not shown.
Binary file removed __pycache__/test_bitcoin_trading.cpython-312.pyc
Binary file not shown.
41 changes: 21 additions & 20 deletions bitcoin_trading_simulation.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import argparse
import sys
import numpy as np
import pandas as pd
import argparse


class Colors:
Expand Down Expand Up @@ -109,7 +109,7 @@ def simulate_trading(signals, initial_cash=10000, quiet=False):
return portfolio


if __name__ == "__main__":
def 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")
Expand All @@ -120,6 +120,23 @@ def simulate_trading(signals, initial_cash=10000, quiet=False):

args = parser.parse_args()

# Input Validation
if args.days <= 0:
print(f"{Colors.RED}Error: Simulation days must be a positive integer.{Colors.ENDC}")
sys.exit(1)

if args.initial_cash < 0:
print(f"{Colors.RED}Error: Initial cash cannot be negative.{Colors.ENDC}")
sys.exit(1)

if args.initial_price <= 0:
print(f"{Colors.RED}Error: Initial Bitcoin price must be positive.{Colors.ENDC}")
sys.exit(1)

if args.volatility < 0:
print(f"{Colors.RED}Error: Volatility cannot be negative.{Colors.ENDC}")
sys.exit(1)

if args.no_color:
Colors.disable()

Expand Down Expand Up @@ -156,22 +173,6 @@ def simulate_trading(signals, initial_cash=10000, quiet=False):
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
)
if __name__ == "__main__":
main()
35 changes: 0 additions & 35 deletions test_bitcoin.py

This file was deleted.