diff --git a/.Jules/palette.md b/.Jules/palette.md index 018831f..037e54b 100644 --- a/.Jules/palette.md +++ b/.Jules/palette.md @@ -1,3 +1,7 @@ ## 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. + +## 2024-05-24 - CLI Arguments & Validation +**Learning:** CLI arguments without aliases and validation create friction and can lead to silent errors or confusing behavior. +**Action:** Always implement shorthand aliases and input validation for CLI tools to improve discoverability and robustness. diff --git a/__pycache__/bitcoin_trading_simulation.cpython-312.pyc b/__pycache__/bitcoin_trading_simulation.cpython-312.pyc index 52abfc2..cbb1baa 100644 Binary files a/__pycache__/bitcoin_trading_simulation.cpython-312.pyc and b/__pycache__/bitcoin_trading_simulation.cpython-312.pyc differ diff --git a/bitcoin_trading_simulation.py b/bitcoin_trading_simulation.py index c86be3e..55ce56f 100644 --- a/bitcoin_trading_simulation.py +++ b/bitcoin_trading_simulation.py @@ -1,37 +1,35 @@ import argparse +import sys import numpy as np import pandas as pd -import argparse class Colors: HEADER = '\033[95m' BLUE = '\033[94m' + CYAN = '\033[96m' GREEN = '\033[92m' + YELLOW = '\033[93m' RED = '\033[91m' + FAIL = '\033[91m' + WARNING = '\033[93m' ENDC = '\033[0m' BOLD = '\033[1m' + UNDERLINE = '\033[4m' @classmethod def disable(cls): cls.HEADER = '' cls.BLUE = '' + cls.CYAN = '' cls.GREEN = '' + cls.YELLOW = '' cls.RED = '' + cls.FAIL = '' + cls.WARNING = '' cls.ENDC = '' 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' + cls.UNDERLINE = '' def simulate_bitcoin_prices(days=60, initial_price=50000, volatility=0.02): """ @@ -89,7 +87,6 @@ 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'] @@ -121,11 +118,11 @@ def simulate_trading(signals, initial_cash=10000, quiet=False): 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="Price volatility") - parser.add_argument("--quiet", action="store_true", help="Suppress daily portfolio log") + parser.add_argument("--days", "-d", type=int, default=60, help="Number of days to simulate") + parser.add_argument("--initial-cash", "-c", type=float, default=10000, help="Initial cash amount") + parser.add_argument("--initial-price", "-p", type=float, default=50000, help="Initial Bitcoin price") + parser.add_argument("--volatility", "-v", type=float, default=0.02, help="Price volatility") + parser.add_argument("--quiet", "-q", action="store_true", help="Suppress daily portfolio log") parser.add_argument("--no-color", action="store_true", help="Disable colored output") args = parser.parse_args() @@ -133,6 +130,20 @@ def simulate_trading(signals, initial_cash=10000, quiet=False): if args.no_color: Colors.disable() + # Input validation + if args.days <= 0: + print(f"{Colors.FAIL}Error: --days must be a positive integer.{Colors.ENDC}") + sys.exit(1) + if args.initial_cash < 0: + print(f"{Colors.FAIL}Error: --initial-cash must be non-negative.{Colors.ENDC}") + sys.exit(1) + if args.initial_price <= 0: + print(f"{Colors.FAIL}Error: --initial-price must be positive.{Colors.ENDC}") + sys.exit(1) + if args.volatility < 0: + print(f"{Colors.FAIL}Error: --volatility must be non-negative.{Colors.ENDC}") + sys.exit(1) + # Simulate prices prices = simulate_bitcoin_prices(days=args.days, initial_price=args.initial_price, volatility=args.volatility)