From 24f4bca3512ce1286d52ad2ee7aa1e1bc62987f6 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 11 Jan 2026 13:04:55 +0000 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20Add=20colorful=20?= =?UTF-8?q?CLI=20output=20and=20fix=20warnings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 💡 What: - Added ANSI color codes and emojis to the simulation output. - Fixed a Pandas FutureWarning by explicitly casting initial cash values to float. - Added a `Colors` class for consistent styling. 🎯 Why: - The color-coded output (Green for Buy/Profit, Red for Sell/Loss) reduces cognitive load and makes it easier to scan the trading ledger. - The emojis add a small touch of delight and visual hierarchy. - Fixing the warning improves the developer experience and cleans up the output. 📸 Before/After: Before: Plain text output. After: Colored output with emojis (💰, 📉, 📈) and bold headers. ♿ Accessibility: - Visual indicators (colors and icons) help users quickly identify positive and negative events. --- .Jules/palette.md | 3 +++ bitcoin_trading_simulation.py | 29 +++++++++++++++++++++-------- 2 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 .Jules/palette.md diff --git a/.Jules/palette.md b/.Jules/palette.md new file mode 100644 index 0000000..5de3a38 --- /dev/null +++ b/.Jules/palette.md @@ -0,0 +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. diff --git a/bitcoin_trading_simulation.py b/bitcoin_trading_simulation.py index e619723..82df43f 100644 --- a/bitcoin_trading_simulation.py +++ b/bitcoin_trading_simulation.py @@ -1,6 +1,14 @@ import numpy as np import pandas as pd +class Colors: + HEADER = '\033[95m' + BLUE = '\033[94m' + GREEN = '\033[92m' + RED = '\033[91m' + 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. @@ -47,11 +55,11 @@ def simulate_trading(signals, initial_cash=10000): """ portfolio = pd.DataFrame(index=signals.index).fillna(0.0) portfolio['price'] = signals['price'] - portfolio['cash'] = initial_cash + portfolio['cash'] = float(initial_cash) portfolio['btc'] = 0.0 - portfolio['total_value'] = portfolio['cash'] + portfolio['total_value'] = float(initial_cash) - print("------ Daily Trading Ledger ------") + 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'] @@ -62,14 +70,14 @@ 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"Day {i}: Buy {btc_to_buy:.4f} BTC at ${row['price']:.2f}") + 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"Day {i}: Sell {portfolio.loc[i, 'btc']:.4f} BTC at ${row['price']:.2f}") + 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'] @@ -99,9 +107,14 @@ def simulate_trading(signals, initial_cash=10000): buy_and_hold_btc = initial_cash / prices.iloc[0] buy_and_hold_value = buy_and_hold_btc * prices.iloc[-1] - print("\n------ Final Portfolio Performance ------") + 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}") - print(f"Profit/Loss: ${profit:.2f}") + + if profit >= 0: + print(f"Profit/Loss: {Colors.GREEN}📈 ${profit:.2f}{Colors.ENDC}") + else: + print(f"Profit/Loss: {Colors.RED}📉 ${profit:.2f}{Colors.ENDC}") + print(f"Buy and Hold Strategy Value: ${buy_and_hold_value:.2f}") - print("-----------------------------------------") + print(f"{Colors.HEADER}-----------------------------------------{Colors.ENDC}") From c865f1c402655e5c3a12533ccf66e846a9ae7578 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 24 Jan 2026 13:09:01 +0000 Subject: [PATCH 2/5] feat: enhance CLI output with colors and emojis - Add ANSI color codes and emojis to trading simulation output for better readability. - Colorize Buy (Green) and Sell (Red) signals. - Improve formatting of the final portfolio performance summary. - Add `requirements.txt` and correct `README.md` for proper developer onboarding. - Create .Jules/palette.md for UX learnings. --- .Jules/palette.md | 3 +++ README.md | 37 +++++++++++++++++++++++++++++++++-- bitcoin_trading_simulation.py | 28 +++++++++++++++++++------- requirements.txt | 2 ++ 4 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 .Jules/palette.md create mode 100644 requirements.txt diff --git a/.Jules/palette.md b/.Jules/palette.md new file mode 100644 index 0000000..d2bea2d --- /dev/null +++ b/.Jules/palette.md @@ -0,0 +1,3 @@ +## 2026-01-24 - [CLI Visual Hierarchy] +**Learning:** UX principles like visual hierarchy and semantic coloring apply equally to CLI tools. Using ANSI codes and emojis transforms a wall of text into a scannable dashboard. +**Action:** For future CLI tools, prioritize a `Colors` class or library early to establish a visual language (Green=Success/Buy, Red=Failure/Sell). diff --git a/README.md b/README.md index a1d5a77..be561ef 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,35 @@ -# code -Programming with C++ code +# Bitcoin Trading Simulation + +A Python-based CLI tool that simulates Bitcoin trading using a 'Golden Cross' moving average strategy. It generates synthetic price data using Geometric Brownian Motion, executes trades based on technical indicators, and provides a daily ledger with a final performance summary. + +## Features + +- **Price Simulation:** Uses Geometric Brownian Motion to simulate 60 days of Bitcoin prices. +- **Trading Strategy:** Implements a Golden Cross strategy (Short MA > Long MA = Buy, Short MA < Long MA = Sell). +- **Rich CLI Output:** features color-coded logs (Green for Buy/Profit, Red for Sell/Loss) and emojis for better readability. +- **Performance metrics:** Compares the strategy's performance against a "Buy and Hold" approach. + +## Installation + +1. Clone the repository. +2. Install the required dependencies: + +```bash +pip install -r requirements.txt +``` + +## Usage + +Run the simulation script: + +```bash +python bitcoin_trading_simulation.py +``` + +## Tests + +Run the test suite: + +```bash +python test.py +``` diff --git a/bitcoin_trading_simulation.py b/bitcoin_trading_simulation.py index e619723..adfc288 100644 --- a/bitcoin_trading_simulation.py +++ b/bitcoin_trading_simulation.py @@ -1,6 +1,14 @@ import numpy as np import pandas as pd +# ANSI color codes for visual enhancement +class Colors: + GREEN = '\033[92m' + RED = '\033[91m' + PURPLE = '\033[95m' + BOLD = '\033[1m' + RESET = '\033[0m' + 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. @@ -47,11 +55,11 @@ def simulate_trading(signals, initial_cash=10000): """ portfolio = pd.DataFrame(index=signals.index).fillna(0.0) portfolio['price'] = signals['price'] - portfolio['cash'] = initial_cash + portfolio['cash'] = float(initial_cash) portfolio['btc'] = 0.0 portfolio['total_value'] = portfolio['cash'] - print("------ Daily Trading Ledger ------") + print(f"\n{Colors.PURPLE}{Colors.BOLD}------ Daily Trading Ledger ------{Colors.RESET}") for i, row in signals.iterrows(): if i > 0: portfolio.loc[i, 'cash'] = portfolio.loc[i-1, 'cash'] @@ -62,14 +70,14 @@ 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"Day {i}: Buy {btc_to_buy:.4f} BTC at ${row['price']:.2f}") + print(f"Day {i}: {Colors.GREEN}📈 [BUY]{Colors.RESET} {btc_to_buy:.4f} BTC at ${row['price']:.2f}") # 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"Day {i}: Sell {portfolio.loc[i, 'btc']:.4f} BTC at ${row['price']:.2f}") + print(f"Day {i}: {Colors.RED}📉 [SELL]{Colors.RESET} {portfolio.loc[i, 'btc']:.4f} BTC at ${row['price']:.2f}") portfolio.loc[i, 'btc'] = 0 portfolio.loc[i, 'total_value'] = portfolio.loc[i, 'cash'] + portfolio.loc[i, 'btc'] * row['price'] @@ -99,9 +107,15 @@ def simulate_trading(signals, initial_cash=10000): buy_and_hold_btc = initial_cash / prices.iloc[0] buy_and_hold_value = buy_and_hold_btc * prices.iloc[-1] - print("\n------ Final Portfolio Performance ------") + print(f"\n{Colors.PURPLE}{Colors.BOLD}------ Final Portfolio Performance ------{Colors.RESET}") print(f"Initial Cash: ${initial_cash:.2f}") print(f"Final Portfolio Value: ${final_value:.2f}") - print(f"Profit/Loss: ${profit:.2f}") + + if profit >= 0: + profit_str = f"{Colors.GREEN}💰 +${profit:.2f}{Colors.RESET}" + else: + profit_str = f"{Colors.RED}📉 -${abs(profit):.2f}{Colors.RESET}" + + print(f"Profit/Loss: {profit_str}") print(f"Buy and Hold Strategy Value: ${buy_and_hold_value:.2f}") - print("-----------------------------------------") + print(f"{Colors.PURPLE}-----------------------------------------{Colors.RESET}") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5da331c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +numpy +pandas 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 3/5] 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 4/5] 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 5/5] 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