From 2368905c4eae9a2c3ba444fd35e7bc5f8016a8eb Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 31 Jan 2026 13:21:20 +0000 Subject: [PATCH 1/3] Add CLI arguments and accessibility options for better UX Co-authored-by: EiJackGH <172181576+EiJackGH@users.noreply.github.com> --- .Jules/palette.md | 4 ++ .gitignore | 4 ++ __pycache__/test.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 995 bytes bitcoin_trading_simulation.py | 43 ++++++++++++++---- 4 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 __pycache__/test.cpython-312-pytest-9.0.2.pyc diff --git a/.Jules/palette.md b/.Jules/palette.md index 5de3a38..cc6254f 100644 --- a/.Jules/palette.md +++ b/.Jules/palette.md @@ -1,3 +1,7 @@ ## 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-10-24 - CLI Accessibility and Configuration +**Learning:** Hardcoded values and mandatory color codes limit CLI usability and accessibility. `--no-color` supports monochrome terminals/parsing, and `argparse` empowers users. +**Action:** Always wrap CLI entry points with argument parsing and provide flags to disable purely visual features like color. diff --git a/.gitignore b/.gitignore index d4fb281..907591b 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,7 @@ # debug information files *.dwo + +# Python +__pycache__/ +*.pyc diff --git a/__pycache__/test.cpython-312-pytest-9.0.2.pyc b/__pycache__/test.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7908ceb474b23dc98d623ed894aa7afa552d3c58 GIT binary patch literal 995 zcma)4F>ljA6u$G>Nodj{gbH*)9zcqPls2@X6g7wpOi29!5t3zM2N~?xxpUPxvZV@j zXt!)E`~lRT!h%2u3Vu2^$d*Ao&z3=Xx{9%244S_xXmAcO$e&?hx zB?pT;0Nx@S+1NvUETZC*fr62*_BD)b?W!b&IBirk-=R0^dczJUo(U`ntsECrUDk{B7a zqd9-XoX^C-OQqX2@bq@`ZZnMA2Gj599PJv+(7RoM_W_fPz&3Zg-0e>{EXEufiGl-z z@#KM_Wou8uIC5BIS~R<64lK_zsT0yc;D;702 zk?BlA&l*_~>=@Oo4uYmUYo|=^m&sn4JSdZnBvSfe*5GQAw09VvtuAfZ*tWuOn_s;Z z##uwW!I@Zo=sENj)bVMtm*7s(w|e8Fx_Lh4u6;hf=m41YIP1)M7mvQGoA7;+RFcoU zQo>IF$16DNN%)rstpyx~;Qh51$F3K-BPQ>@Vq2yhbW6?#hSj3Z33VeF@+y^8^Bk>% sns~>1M7KD;32s?C^aK0Ya~@M2DE}+iRd7EE#`p(9XJ~;iz9AZZ18bJ+cK`qY literal 0 HcmV?d00001 diff --git a/bitcoin_trading_simulation.py b/bitcoin_trading_simulation.py index 82df43f..b056e4f 100644 --- a/bitcoin_trading_simulation.py +++ b/bitcoin_trading_simulation.py @@ -1,3 +1,4 @@ +import argparse import numpy as np import pandas as pd @@ -49,7 +50,7 @@ def generate_trading_signals(signals): signals['positions'] = signals['signal'].diff().shift(1) return signals -def simulate_trading(signals, initial_cash=10000): +def simulate_trading(signals, initial_cash=10000, quiet=False): """ Simulates trading based on signals and prints a daily ledger. """ @@ -59,7 +60,9 @@ def simulate_trading(signals, initial_cash=10000): portfolio['btc'] = 0.0 portfolio['total_value'] = float(initial_cash) - print(f"{Colors.HEADER}{Colors.BOLD}------ Daily Trading Ledger ------{Colors.ENDC}") + if not quiet: + print(f"{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'] @@ -70,24 +73,48 @@ def simulate_trading(signals, initial_cash=10000): 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'] - print(f"{Colors.GREEN}Day {i}: 💰 Buy {btc_to_buy:.4f} BTC at ${row['price']:.2f}{Colors.ENDC}") + if not quiet: + 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 - print(f"{Colors.RED}Day {i}: 📉 Sell {portfolio.loc[i, 'btc']:.4f} BTC at ${row['price']:.2f}{Colors.ENDC}") + if not quiet: + print(f"{Colors.RED}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'] - print(f"Day {i}: Portfolio Value: ${portfolio.loc[i, 'total_value']:.2f}, Cash: ${portfolio.loc[i, 'cash']:.2f}, BTC: {portfolio.loc[i, 'btc']:.4f}") + + if not quiet: + print(f"Day {i}: Portfolio Value: ${portfolio.loc[i, 'total_value']:.2f}, Cash: ${portfolio.loc[i, 'cash']:.2f}, BTC: {portfolio.loc[i, 'btc']:.4f}") return portfolio +def parse_arguments(): + 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', '-q', action='store_true', help='Suppress daily ledger output') + parser.add_argument('--no-color', action='store_true', help='Disable colored output') + return parser.parse_args() + if __name__ == "__main__": + args = parse_arguments() + + if args.no_color: + Colors.HEADER = '' + Colors.BLUE = '' + Colors.GREEN = '' + Colors.RED = '' + Colors.ENDC = '' + Colors.BOLD = '' + # Simulate prices - prices = simulate_bitcoin_prices() + prices = simulate_bitcoin_prices(days=args.days, initial_price=args.initial_price, volatility=args.volatility) # Calculate moving averages signals = calculate_moving_averages(prices) @@ -96,11 +123,11 @@ def simulate_trading(signals, initial_cash=10000): signals = generate_trading_signals(signals) # Simulate trading - portfolio = simulate_trading(signals) + portfolio = simulate_trading(signals, initial_cash=args.initial_cash, quiet=args.quiet) # Final portfolio performance final_value = portfolio['total_value'].iloc[-1] - initial_cash = 10000 + initial_cash = args.initial_cash profit = final_value - initial_cash # Compare with buy and hold strategy From 230f73f8d3261fcfdd3746e02501b4df135fee92 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 31 Jan 2026 13:27:07 +0000 Subject: [PATCH 2/3] Add CLI arguments and accessibility options for better UX Co-authored-by: EiJackGH <172181576+EiJackGH@users.noreply.github.com> --- __pycache__/test.cpython-312-pytest-9.0.2.pyc | Bin 995 -> 0 bytes bitcoin_trading_simulation.py | 27 ++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) delete mode 100644 __pycache__/test.cpython-312-pytest-9.0.2.pyc diff --git a/__pycache__/test.cpython-312-pytest-9.0.2.pyc b/__pycache__/test.cpython-312-pytest-9.0.2.pyc deleted file mode 100644 index 7908ceb474b23dc98d623ed894aa7afa552d3c58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 995 zcma)4F>ljA6u$G>Nodj{gbH*)9zcqPls2@X6g7wpOi29!5t3zM2N~?xxpUPxvZV@j zXt!)E`~lRT!h%2u3Vu2^$d*Ao&z3=Xx{9%244S_xXmAcO$e&?hx zB?pT;0Nx@S+1NvUETZC*fr62*_BD)b?W!b&IBirk-=R0^dczJUo(U`ntsECrUDk{B7a zqd9-XoX^C-OQqX2@bq@`ZZnMA2Gj599PJv+(7RoM_W_fPz&3Zg-0e>{EXEufiGl-z z@#KM_Wou8uIC5BIS~R<64lK_zsT0yc;D;702 zk?BlA&l*_~>=@Oo4uYmUYo|=^m&sn4JSdZnBvSfe*5GQAw09VvtuAfZ*tWuOn_s;Z z##uwW!I@Zo=sENj)bVMtm*7s(w|e8Fx_Lh4u6;hf=m41YIP1)M7mvQGoA7;+RFcoU zQo>IF$16DNN%)rstpyx~;Qh51$F3K-BPQ>@Vq2yhbW6?#hSj3Z33VeF@+y^8^Bk>% sns~>1M7KD;32s?C^aK0Ya~@M2DE}+iRd7EE#`p(9XJ~;iz9AZZ18bJ+cK`qY diff --git a/bitcoin_trading_simulation.py b/bitcoin_trading_simulation.py index b056e4f..d6beb5e 100644 --- a/bitcoin_trading_simulation.py +++ b/bitcoin_trading_simulation.py @@ -2,6 +2,7 @@ import numpy as np import pandas as pd + class Colors: HEADER = '\033[95m' BLUE = '\033[94m' @@ -10,6 +11,7 @@ class Colors: ENDC = '\033[0m' BOLD = '\033[1m' + 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. @@ -24,6 +26,7 @@ def simulate_bitcoin_prices(days=60, initial_price=50000, volatility=0.02): prices.append(prices[-1] + price_change) return pd.Series(prices, name='Price') + def calculate_moving_averages(prices, short_window=7, long_window=30): """ Calculates short and long moving averages for a given price series. @@ -34,6 +37,7 @@ def calculate_moving_averages(prices, short_window=7, long_window=30): signals['long_mavg'] = prices.rolling(window=long_window, min_periods=1, center=False).mean() return signals + def generate_trading_signals(signals): """ Generates trading signals based on the Golden Cross strategy. @@ -45,11 +49,12 @@ def generate_trading_signals(signals): signals.loc[signals['short_mavg'] > signals['long_mavg'], 'signal'] = 1.0 # A Death Cross (sell signal) signals.loc[signals['short_mavg'] < signals['long_mavg'], 'signal'] = -1.0 - + # We create 'positions' to represent the trading action: 1 for buy, -1 for sell, 0 for hold signals['positions'] = signals['signal'].diff().shift(1) return signals + def simulate_trading(signals, initial_cash=10000, quiet=False): """ Simulates trading based on signals and prints a daily ledger. @@ -88,10 +93,13 @@ def simulate_trading(signals, initial_cash=10000, quiet=False): portfolio.loc[i, 'total_value'] = portfolio.loc[i, 'cash'] + portfolio.loc[i, 'btc'] * row['price'] if not quiet: - print(f"Day {i}: Portfolio Value: ${portfolio.loc[i, 'total_value']:.2f}, Cash: ${portfolio.loc[i, 'cash']:.2f}, BTC: {portfolio.loc[i, 'btc']:.4f}") - + msg = (f"Day {i}: Portfolio Value: ${portfolio.loc[i, 'total_value']:.2f}, " + f"Cash: ${portfolio.loc[i, 'cash']:.2f}, BTC: {portfolio.loc[i, 'btc']:.4f}") + print(msg) + return portfolio + def parse_arguments(): parser = argparse.ArgumentParser(description='Bitcoin Trading Simulation') parser.add_argument('--days', type=int, default=60, help='Number of days to simulate') @@ -102,6 +110,7 @@ def parse_arguments(): parser.add_argument('--no-color', action='store_true', help='Disable colored output') return parser.parse_args() + if __name__ == "__main__": args = parse_arguments() @@ -115,25 +124,25 @@ def parse_arguments(): # Simulate prices prices = simulate_bitcoin_prices(days=args.days, initial_price=args.initial_price, volatility=args.volatility) - + # Calculate moving averages signals = calculate_moving_averages(prices) - + # Generate trading signals signals = generate_trading_signals(signals) - + # Simulate trading portfolio = simulate_trading(signals, initial_cash=args.initial_cash, quiet=args.quiet) - + # Final portfolio performance final_value = portfolio['total_value'].iloc[-1] initial_cash = args.initial_cash profit = final_value - initial_cash - + # Compare with buy and hold strategy buy_and_hold_btc = 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: ${initial_cash:.2f}") print(f"Final Portfolio Value: ${final_value:.2f}") From 067244d1bd70935a121b032ede0c832207cddb38 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 31 Jan 2026 13:31:32 +0000 Subject: [PATCH 3/3] Add CLI arguments and accessibility options for better UX Co-authored-by: EiJackGH <172181576+EiJackGH@users.noreply.github.com> --- test.py => test_bitcoin_trading.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test.py => test_bitcoin_trading.py (100%) diff --git a/test.py b/test_bitcoin_trading.py similarity index 100% rename from test.py rename to test_bitcoin_trading.py