Complete standardization of remaining core management classes. DecisionManager method renames (camelCase → snake_case): - getOnlineAns → get_online_answer - getSignalsAns → get_signals_answer - getRightAns → get_right_answer - getRetroTrendAns → get_retro_trend_answer - generateMatrixProbabilityFromDict → generate_matrix_probability_from_dict - createDump → create_dump - loadDump → load_dump DecisionManager variable renames: - sigDict → sig_dict - signalsAns → signals_ans - signalsDataDict → signals_data_dict - retroTemplateDict → retro_template_dict - reqSig → req_sig - sigAns → sig_ans - rightAns → right_ans - dictSignals → dict_signals - dataDict → data_dict - fileName → file_name RiskManager improvements: - getDecision → get_decision - probabilityDecision → probability_decision - Added comprehensive docstrings - Improved spacing and formatting DealManager method renames: - findDealByPriceAndFig → find_deal_by_price_and_figi - openDeal → open_deal - closeDeal → close_deal DealManager variable renames: - startPrice → start_price - desiredDeal → desired_deal - newDealDict → new_deal_dict - newDeal → new_deal Documentation: - Added comprehensive Google-style docstrings to all classes - Documented all public methods with Args, Returns, and Notes - Added usage examples where applicable - Removed wildcard imports, using explicit imports Follows: PEP 8, Google Python Style Guide 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
78 lines
2.6 KiB
Python
78 lines
2.6 KiB
Python
import pandas as pd
|
|
import datetime
|
|
import numpy as np
|
|
import uuid
|
|
|
|
|
|
class DealManager():
|
|
"""Manages open trading positions and deal lifecycle.
|
|
|
|
Tracks active positions with their entry prices and quantities,
|
|
supporting both opening new positions and closing existing ones.
|
|
"""
|
|
|
|
def __init__(self):
|
|
"""Initialize DealManager with empty deals DataFrame."""
|
|
self.columns = ['uuid', 'figi', 'amount', 'startPrice']
|
|
self.deals = pd.DataFrame(columns=self.columns)
|
|
self.deals = self.deals.set_index('uuid')
|
|
|
|
def find_deal_by_price_and_figi(self, price: float, figi: str):
|
|
"""Find existing deal by price and instrument identifier.
|
|
|
|
Args:
|
|
price: Entry price to search for.
|
|
figi: Financial Instrument Global Identifier.
|
|
|
|
Returns:
|
|
Deal UUID if found, None otherwise.
|
|
"""
|
|
ans = None
|
|
for i in range(self.deals.shape[0]):
|
|
if self.deals.iloc[i].startPrice == price and self.deals.iloc[i].figi == figi:
|
|
ans = self.deals.iloc[i].name
|
|
break
|
|
return ans
|
|
|
|
def open_deal(self, figi: str, start_price: float, amount: int = 1) -> None:
|
|
"""Open new deal or add to existing position.
|
|
|
|
If a deal with the same FIGI and price exists, adds to the amount.
|
|
Otherwise creates a new deal entry.
|
|
|
|
Args:
|
|
figi: Financial Instrument Global Identifier.
|
|
start_price: Entry price for the position.
|
|
amount: Number of units to trade (default 1).
|
|
"""
|
|
desired_deal = self.find_deal_by_price_and_figi(start_price, figi)
|
|
if desired_deal is None:
|
|
new_deal_dict = {
|
|
'uuid': [str(uuid.uuid4())],
|
|
'figi': [figi],
|
|
'startPrice': [start_price],
|
|
'amount': [amount]
|
|
}
|
|
|
|
new_deal = pd.DataFrame.from_dict(new_deal_dict).set_index('uuid')
|
|
self.deals = pd.concat([self.deals, new_deal])
|
|
else:
|
|
self.deals.at[desired_deal, 'amount'] += amount
|
|
|
|
def close_deal(self, uuid_str: str, amount: int) -> None:
|
|
"""Close deal partially or completely.
|
|
|
|
Args:
|
|
uuid_str: Deal UUID to close.
|
|
amount: Number of units to close.
|
|
|
|
Note:
|
|
If amount equals deal amount, removes deal entirely.
|
|
Otherwise decreases deal amount.
|
|
"""
|
|
desired_deal = self.deals.loc[uuid_str]
|
|
if desired_deal.amount - amount == 0:
|
|
self.deals = self.deals.drop(labels=[uuid_str], axis=0)
|
|
else:
|
|
self.deals.at[uuid_str, 'amount'] -= amount
|