refactor: Update position calculator with dynamic account size and automatic stop loss
This commit is contained in:
parent
b7d3b8bc6d
commit
8740ccf9eb
@ -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,
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user