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 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,
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user