refactor: Update position calculator with dynamic account size and automatic stop loss

This commit is contained in:
Bobby Abellana (aider) 2025-02-06 21:16:07 -08:00
parent b7d3b8bc6d
commit 8740ccf9eb
No known key found for this signature in database
GPG Key ID: 647714CC45F3647B
2 changed files with 26 additions and 12 deletions

View File

@ -2,10 +2,20 @@ from datetime import datetime
from position_calculator import PositionCalculator from position_calculator import PositionCalculator
from portfolio import Portfolio, Position from portfolio import Portfolio, Position
def get_float_input(prompt: str) -> float:
while True:
try:
return float(input(prompt))
except ValueError:
print("Please enter a valid number")
def main(): def main():
# Get initial portfolio value from user
portfolio_value = get_float_input("Enter your portfolio value: $")
# Initialize portfolio and position calculator # Initialize portfolio and position calculator
portfolio = Portfolio() portfolio = Portfolio()
calculator = PositionCalculator(account_size=100000) # $100k account calculator = PositionCalculator(account_size=portfolio_value) # Use user's portfolio value
while True: while True:
print("\nTrading Management System") print("\nTrading Management System")
@ -19,16 +29,15 @@ def main():
if choice == "1": if choice == "1":
try: try:
entry_price = float(input("Enter entry price: ")) entry_price = get_float_input("Enter entry price: $")
stop_loss = float(input("Enter stop loss price: "))
position = calculator.calculate_position_size(entry_price, stop_loss) position = calculator.calculate_position_size(entry_price)
print("\nPosition Details:") print("\nPosition Details:")
print(f"Shares: {position['shares']}") print(f"Shares: {position['shares']}")
print(f"Position Value: ${position['position_value']:.2f}") print(f"Position Value: ${position['position_value']:.2f}")
print(f"Risk Amount: ${position['risk_amount']:.2f}") print(f"Risk Amount: ${position['risk_amount']:.2f}")
print(f"Risk Per Share: ${position['risk_per_share']:.2f}") print(f"Stop Loss Price: ${position['stop_loss']:.2f}")
except ValueError as e: except ValueError as e:
print(f"Error: {e}") print(f"Error: {e}")
@ -36,10 +45,10 @@ def main():
elif choice == "2": elif choice == "2":
try: try:
symbol = input("Enter symbol: ") symbol = input("Enter symbol: ")
entry_price = float(input("Enter entry price: ")) entry_price = float(input("Enter entry price: $"))
shares = int(input("Enter number of shares: ")) shares = int(input("Enter number of shares: "))
stop_loss = float(input("Enter stop loss: ")) stop_loss = entry_price * 0.94 # Automatic 6% stop loss
target_price = float(input("Enter target price: ")) target_price = float(input("Enter target price: $"))
position = Position( position = Position(
symbol=symbol, symbol=symbol,

View File

@ -1,26 +1,30 @@
class PositionCalculator: class PositionCalculator:
def __init__(self, account_size: float, risk_percentage: float = 1.0): def __init__(self, account_size: float, risk_percentage: float = 1.0, stop_loss_percentage: float = 6.0):
""" """
Initialize position calculator with account size and risk percentage Initialize position calculator with account size and risk percentage
Args: Args:
account_size (float): Total trading account value account_size (float): Total trading account value
risk_percentage (float): Maximum risk per trade as percentage (default 1%) risk_percentage (float): Maximum risk per trade as percentage (default 1%)
stop_loss_percentage (float): Stop loss percentage (default 6%)
""" """
self.account_size = account_size self.account_size = account_size
self.risk_percentage = risk_percentage / 100.0 # Convert to decimal self.risk_percentage = risk_percentage / 100.0 # Convert to decimal
self.stop_loss_percentage = stop_loss_percentage / 100.0 # Convert to decimal
def calculate_position_size(self, entry_price: float, stop_loss: float) -> dict: def calculate_position_size(self, entry_price: float) -> dict:
""" """
Calculate position size based on risk parameters Calculate position size based on risk parameters
Args: Args:
entry_price (float): Planned entry price entry_price (float): Planned entry price
stop_loss (float): Stop loss price
Returns: Returns:
dict: Position details including shares and dollar amounts dict: Position details including shares and dollar amounts
""" """
# Calculate stop loss price (6% below entry)
stop_loss = entry_price * (1 - self.stop_loss_percentage)
# Calculate risk amount in dollars # Calculate risk amount in dollars
risk_amount = self.account_size * self.risk_percentage risk_amount = self.account_size * self.risk_percentage
@ -40,5 +44,6 @@ class PositionCalculator:
"shares": shares, "shares": shares,
"position_value": position_value, "position_value": position_value,
"risk_amount": risk_amount, "risk_amount": risk_amount,
"risk_per_share": risk_per_share "risk_per_share": risk_per_share,
"stop_loss": stop_loss
} }