dev progress

This commit is contained in:
Oleg Sheynin 2026-01-01 22:12:04 +00:00
parent 4bf1d46208
commit 002f797751
2 changed files with 75 additions and 70 deletions

View File

@ -34,6 +34,7 @@ class PairsTrader(NamedObject):
live_strategy_: PtLiveStrategy live_strategy_: PtLiveStrategy
pricer_client_: CvttRestMktDataClient pricer_client_: CvttRestMktDataClient
ti_sender_: TradingInstructionsSender
rest_service_: RestService rest_service_: RestService
def __init__(self) -> None: def __init__(self) -> None:
@ -100,8 +101,7 @@ class PairsTrader(NamedObject):
# ------- CREATE TRADER CLIENT ------- # ------- CREATE TRADER CLIENT -------
self.ti_sender_ = TradingInstructionsSender(config=self.config_, pairs_trader=self) self.ti_sender_ = TradingInstructionsSender(config=self.config_, pairs_trader=self)
Log.info(f"{self.fname()} TI client created: {self.ti_sender_}") Log.info(f"{self.fname()} TI sebder created: {self.ti_sender_}")
# # ------- CREATE REST SERVER ------- # # ------- CREATE REST SERVER -------
self.rest_service_ = RestService( self.rest_service_ = RestService(

View File

@ -17,28 +17,29 @@ from cvttpy_tools.logger import Log
# --- # ---
from cvttpy_trading.trading.instrument import ExchangeInstrument from cvttpy_trading.trading.instrument import ExchangeInstrument
from cvttpy_trading.trading.mkt_data.md_summary import MdTradesAggregate from cvttpy_trading.trading.mkt_data.md_summary import MdTradesAggregate
from cvttpy_trading.trading.trading_instructions import TradingInstructions
# --- # ---
from pairs_trading.lib.pt_strategy.model_data_policy import ModelDataPolicy from pairs_trading.lib.pt_strategy.model_data_policy import ModelDataPolicy
from pairs_trading.lib.pt_strategy.pt_model import Prediction from pairs_trading.lib.pt_strategy.pt_model import Prediction
from pairs_trading.lib.pt_strategy.trading_pair import PairState, TradingPair from pairs_trading.lib.pt_strategy.trading_pair import PairState, TradingPair
from pairs_trading.apps.pairs_trader import PairsTrader from pairs_trading.apps.pairs_trader import PairsTrader
""" """
--config=pair.cfg --config=pair.cfg
--pair=PAIR-BTC-USDT:COINBASE_AT,PAIR-ETH-USDT:COINBASE_AT --pair=PAIR-BTC-USDT:COINBASE_AT,PAIR-ETH-USDT:COINBASE_AT
""" """
class TradingInstructionType(Enum): # class TradingInstructionType(Enum):
TARGET_POSITION = "TARGET_POSITION" # TARGET_POSITION = "TARGET_POSITION"
@dataclass # @dataclass
class TradingInstruction(NamedObject): # class TradingInstruction(NamedObject):
type_: TradingInstructionType # type_: TradingInstructionType
exch_instr_: ExchangeInstrument # exch_instr_: ExchangeInstrument
specifics_: Dict[str, Any] # specifics_: Dict[str, Any]
class PtLiveStrategy(NamedObject): class PtLiveStrategy(NamedObject):
@ -135,12 +136,12 @@ class PtLiveStrategy(NamedObject):
[self.predictions_df_, prediction.to_df()], ignore_index=True [self.predictions_df_, prediction.to_df()], ignore_index=True
) )
trading_instructions: List[TradingInstruction] = ( trading_instructions: Optional[TradingInstructions] = (
self._create_trading_instructions( self._create_trading_instructions(
prediction=prediction, last_row=market_data_df.iloc[-1] prediction=prediction, last_row=market_data_df.iloc[-1]
) )
) )
if len(trading_instructions) > 0: if trading_instructions is not None:
await self._send_trading_instructions(trading_instructions) await self._send_trading_instructions(trading_instructions)
def _is_md_actual(self, hist_aggr: List[MdTradesAggregate]) -> bool: def _is_md_actual(self, hist_aggr: List[MdTradesAggregate]) -> bool:
@ -156,15 +157,16 @@ class PtLiveStrategy(NamedObject):
return self.history_depth_sec_ return self.history_depth_sec_
async def _send_trading_instructions( async def _send_trading_instructions(
self, trading_instructions: List[TradingInstruction] self, trading_instructions: TradingInstructions
) -> None: ) -> None:
await self.pairs_trader_.ti_sender_.send_trading_instructions(trading_instructions)
pass # URGENT implement _send_trading_instructions pass # URGENT implement _send_trading_instructions
def _create_trading_instructions( def _create_trading_instructions(
self, prediction: Prediction, last_row: pd.Series self, prediction: Prediction, last_row: pd.Series
) -> List[TradingInstruction]: ) -> Optional[TradingInstructions]:
pair = self.trading_pair_ pair = self.trading_pair_
trd_instructions: List[TradingInstruction] = [] res: Optional[TradingInstructions]
scaled_disequilibrium = prediction.scaled_disequilibrium_ scaled_disequilibrium = prediction.scaled_disequilibrium_
abs_scaled_disequilibrium = abs(scaled_disequilibrium) abs_scaled_disequilibrium = abs(scaled_disequilibrium)
@ -188,73 +190,76 @@ class PtLiveStrategy(NamedObject):
def _create_open_trade_instructions( def _create_open_trade_instructions(
self, pair: TradingPair, row: pd.Series, prediction: Prediction self, pair: TradingPair, row: pd.Series, prediction: Prediction
) -> List[TradingInstruction]: ) -> Optional[TradingInstructions]:
ti: Optional[TradingInstructions] = None
scaled_disequilibrium = prediction.scaled_disequilibrium_ scaled_disequilibrium = prediction.scaled_disequilibrium_
if scaled_disequilibrium > 0: # if scaled_disequilibrium > 0:
side_a = "SELL" # side_a = "SELL"
trd_inst_a = TradingInstruction( # trd_inst_a = TradingInstruction(
type_=TradingInstructionType.TARGET_POSITION, # type_=TradingInstructionType.TARGET_POSITION,
exch_instr_=pair.get_instrument_a(), # exch_instr_=pair.get_instrument_a(),
specifics_={"side": "SELL", "strength": -1}, # specifics_={"side": "SELL", "strength": -1},
) # )
side_b = "BUY" # side_b = "BUY"
else: # else:
side_a = "BUY" # side_a = "BUY"
side_b = "SELL" # side_b = "SELL"
colname_a, colname_b = pair.exec_prices_colnames() # colname_a, colname_b = pair.exec_prices_colnames()
px_a = row[f"{colname_a}"] # px_a = row[f"{colname_a}"]
px_b = row[f"{colname_b}"] # px_b = row[f"{colname_b}"]
tstamp = row["tstamp"] # tstamp = row["tstamp"]
diseqlbrm = prediction.disequilibrium_ # diseqlbrm = prediction.disequilibrium_
scaled_disequilibrium = prediction.scaled_disequilibrium_ # scaled_disequilibrium = prediction.scaled_disequilibrium_
df = self._trades_df() # df = self._trades_df()
# save closing sides # # save closing sides
pair.user_data_["open_side_a"] = side_a # used in oustanding positions # pair.user_data_["open_side_a"] = side_a # used in oustanding positions
pair.user_data_["open_side_b"] = side_b # pair.user_data_["open_side_b"] = side_b
pair.user_data_["open_px_a"] = px_a # pair.user_data_["open_px_a"] = px_a
pair.user_data_["open_px_b"] = px_b # pair.user_data_["open_px_b"] = px_b
pair.user_data_["open_tstamp"] = tstamp # pair.user_data_["open_tstamp"] = tstamp
pair.user_data_["close_side_a"] = side_b # used for closing trades # pair.user_data_["close_side_a"] = side_b # used for closing trades
pair.user_data_["close_side_b"] = side_a # pair.user_data_["close_side_b"] = side_a
# create opening trades # # create opening trades
df.loc[len(df)] = { # df.loc[len(df)] = {
"time": tstamp, # "time": tstamp,
"symbol": pair.symbol_a_, # "symbol": pair.symbol_a_,
"side": side_a, # "side": side_a,
"action": "OPEN", # "action": "OPEN",
"price": px_a, # "price": px_a,
"disequilibrium": diseqlbrm, # "disequilibrium": diseqlbrm,
"signed_scaled_disequilibrium": scaled_disequilibrium, # "signed_scaled_disequilibrium": scaled_disequilibrium,
"scaled_disequilibrium": abs(scaled_disequilibrium), # "scaled_disequilibrium": abs(scaled_disequilibrium),
# "pair": pair, # # "pair": pair,
} # }
df.loc[len(df)] = { # df.loc[len(df)] = {
"time": tstamp, # "time": tstamp,
"symbol": pair.symbol_b_, # "symbol": pair.symbol_b_,
"side": side_b, # "side": side_b,
"action": "OPEN", # "action": "OPEN",
"price": px_b, # "price": px_b,
"disequilibrium": diseqlbrm, # "disequilibrium": diseqlbrm,
"scaled_disequilibrium": abs(scaled_disequilibrium), # "scaled_disequilibrium": abs(scaled_disequilibrium),
"signed_scaled_disequilibrium": scaled_disequilibrium, # "signed_scaled_disequilibrium": scaled_disequilibrium,
# "pair": pair, # # "pair": pair,
} # }
ti: List[TradingInstruction] = self._create_trading_instructions( # ti: List[TradingInstruction] = self._create_trading_instructions(
prediction=prediction, last_row=row # prediction=prediction, last_row=row
) # )
return ti return ti
def _create_close_trade_instructions( def _create_close_trade_instructions(
self, pair: TradingPair, row: pd.Series # , prediction: Prediction self, pair: TradingPair, row: pd.Series # , prediction: Prediction
) -> List[TradingInstruction]: ) -> Optional[TradingInstructions]:
return [] # URGENT implement _create_close_trade_instructions ti: Optional[TradingInstructions] = None
# URGENT implement _create_close_trade_instructions
return ti
def _handle_outstanding_positions(self) -> Optional[pd.DataFrame]: def _handle_outstanding_positions(self) -> Optional[pd.DataFrame]:
trades = None trades = None