Continue implementing live risk checks

This commit is contained in:
2023-01-11 19:46:47 +00:00
parent 93be9e6ffe
commit e55f903f42
12 changed files with 527 additions and 244 deletions

View File

@@ -1,19 +1,41 @@
from decimal import Decimal as D
from core.exchanges import convert
from core.models import Trade
from core.trading import market
def check_max_loss(risk_model, initial_balance, account_balance):
"""
Check that the account balance is within the max loss limit.
"""
# print("Max loss percent", risk_model.max_loss_percent)
# print("Initial balance", initial_balance)
# print("Account balance", account_balance)
# max_loss_percent = risk_model.max_loss_percent
# print("Max loss ratio", (max_loss_percent / 100))
# max_loss = initial_balance * (max_loss_percent / 100)
# print("Max loss", max_loss)
# return account_balance > max_loss
max_loss_percent = risk_model.max_loss_percent
max_loss = initial_balance * (max_loss_percent / 100)
return account_balance > max_loss
# calculate the inverse of the max loss percent as a ratio
inverse_loss_multiplier = 1 - max_loss_percent / 100
minimum_balance = initial_balance * inverse_loss_multiplier
return account_balance > minimum_balance
def check_max_risk(risk_model, account_balance_usd, account_trades):
"""
Check that all of the trades in the account are within the max risk limit.
"""
max_risk_percent = risk_model.max_risk_percent
max_risk_percent = D(risk_model.max_risk_percent)
print("Max risk percent", max_risk_percent)
# Calculate the max risk of the account in USD
max_risk_usd = account_balance_usd * (max_risk_percent / 100)
max_risk_usd = account_balance_usd * (max_risk_percent / D(100))
print("Max risk USD", max_risk_usd)
total_risk = 0
for trade in account_trades:
max_tmp = []
@@ -24,8 +46,13 @@ def check_max_risk(risk_model, account_balance_usd, account_trades):
max_tmp.append(trade["stop_loss_usd"])
if "trailing_stop_loss_usd" in trade:
max_tmp.append(trade["trailing_stop_loss_usd"])
total_risk += max(max_tmp)
if max_tmp:
print("MAX TMP", max_tmp)
total_risk += max(max_tmp)
print("total risk", total_risk)
allowed = total_risk < max_risk_usd
print("check amx risk allowed", allowed)
return allowed
@@ -33,6 +60,7 @@ def check_max_open_trades(risk_model, account_trades):
"""
Check that the number of trades in the account is within the max open trades limit.
"""
print("LEN ACCOUNT TRADES", len(account_trades))
return len(account_trades) < risk_model.max_open_trades
@@ -60,14 +88,25 @@ def check_risk(risk_model, account, proposed_trade):
max_loss_check = check_max_loss(
risk_model, account.initial_balance, account.client.get_balance()
)
print("Max loss check", max_loss_check)
if not max_loss_check:
return {"allowed": False, "reason": "Maximum loss exceeded."}
# Check that the account max trades is not exceeded
account_trades = account.client.get_all_open_trades() # TODO
account_trades.append(proposed_trade) # TODO
account_trades = account.client.get_all_open_trades()
print("Account trades: ", account_trades)
if isinstance(proposed_trade, Trade):
proposed_trade = proposed_trade.__dict__
account_trades.append(proposed_trade)
print("After append", account_trades)
account_trades = convert.convert_trades(account_trades)
print("After convert", account_trades)
account_trades = market.convert_trades_to_usd(account, account_trades)
print("After convert to USD", account_trades)
max_open_trades_check = check_max_open_trades(risk_model, account_trades)
print("Max open trades check: ", max_open_trades_check)
if not max_open_trades_check:
return {"allowed": False, "reason": "Maximum open trades exceeded."}
@@ -75,10 +114,16 @@ def check_risk(risk_model, account, proposed_trade):
max_open_trades_per_symbol_check = check_max_open_trades_per_symbol(
risk_model, account_trades
)
print("Max open trades per symbol check: ", max_open_trades_per_symbol_check)
if not max_open_trades_per_symbol_check:
return {"allowed": False, "reason": "Maximum open trades per symbol exceeded."}
# Check that the max risk is not exceeded
max_risk_check = check_max_risk(risk_model, account_trades)
account_balance_usd = account.client.get_balance(return_usd=True)
print("Account balance USD (not)", account_balance_usd)
max_risk_check = check_max_risk(risk_model, account_balance_usd, account_trades)
print("Max risk check: ", max_risk_check)
if not max_risk_check:
return {"allowed": False, "reason": "Maximum risk exceeded."}
return {"allowed": True}