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 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():
# Get initial portfolio value from user
portfolio_value = get_float_input("Enter your portfolio value: $")
# Initialize portfolio and position calculator
portfolio = Portfolio()
calculator = PositionCalculator(account_size=100000) # $100k account
calculator = PositionCalculator(account_size=portfolio_value) # Use user's portfolio value
while True:
print("\nTrading Management System")
@ -19,16 +29,15 @@ def main():
if choice == "1":
try:
entry_price = float(input("Enter entry price: "))
stop_loss = float(input("Enter stop loss price: "))
entry_price = get_float_input("Enter entry price: $")
position = calculator.calculate_position_size(entry_price, stop_loss)
position = calculator.calculate_position_size(entry_price)
print("\nPosition Details:")
print(f"Shares: {position['shares']}")
print(f"Position Value: ${position['position_value']:.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:
print(f"Error: {e}")
@ -36,10 +45,10 @@ def main():
elif choice == "2":
try:
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: "))
stop_loss = float(input("Enter stop loss: "))
target_price = float(input("Enter target price: "))
stop_loss = entry_price * 0.94 # Automatic 6% stop loss
target_price = float(input("Enter target price: $"))
position = Position(
symbol=symbol,

View File

@ -1,26 +1,30 @@
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
Args:
account_size (float): Total trading account value
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.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
Args:
entry_price (float): Planned entry price
stop_loss (float): Stop loss price
Returns:
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
risk_amount = self.account_size * self.risk_percentage
@ -40,5 +44,6 @@ class PositionCalculator:
"shares": shares,
"position_value": position_value,
"risk_amount": risk_amount,
"risk_per_share": risk_per_share
"risk_per_share": risk_per_share,
"stop_loss": stop_loss
}