den4ik2003

Untitled

Feb 9th, 2026
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.81 KB | None | 0 0
  1. from pydmm_connectors import BaseConnector, BaseFetcher, make_client_formed, make_fetcher_formed
  2. from pydmm_connectors.core.logger import MarketLogger
  3. from pydmm_connectors.models import Client, Fetcher, Symbol
  4. from pydmm_strategy.market_making.config import MarketMakingInstanceConfig
  5. from pydmm_strategy.price_targeting.config import PriceTargetingInstanceConfig
  6. from pydmm_strategy.price_targeting.engine.context import PriceContext
  7. from pydmm_strategy.price_targeting.sources import *
  8. from pydmm_strategy.price_targeting.price_writer import PriceWriter
  9. from pydmm_strategy.utility.price_oracle import BinanceWebSocketOracle
  10. from pydmm_strategy.utility.kline_manager import BinanceKLineManager
  11. import time
  12.  
  13. class PriceTargeting:
  14.  
  15.     def _target_client(self) -> float:
  16.         if not isinstance(self._target_market, BaseConnector):
  17.             raise RuntimeError
  18.         book = self._target_market.get_best_book()
  19.         return (book.ask_price + book.bid_price) / 2
  20.  
  21.     def _target_fetcher(self) -> float:
  22.         if not isinstance(self._target_market, BaseFetcher):
  23.             raise RuntimeError
  24.         return self._target_market.get_price()
  25.  
  26.     def __init__(self, config: PriceTargetingInstanceConfig):
  27.         self._logger = MarketLogger(config.path_to_log)
  28.  
  29.         # Try to determine the type based on structure
  30.         target_market = config.target_market
  31.         if hasattr(target_market, 'ticker'):  # It's a Client
  32.             self._target_market = make_client_formed(target_market)
  33.             self._target_base = self._target_client
  34.         elif hasattr(target_market, 'exchange'):  # It's a Fetcher
  35.             self._target_market = make_fetcher_formed(target_market)
  36.             self._target_base = self._target_fetcher
  37.         else:
  38.             # Try to create Fetcher from dict
  39.             try:
  40.                 if isinstance(target_market, dict) and 'exchange' in target_market:
  41.                     fetcher = Fetcher(**target_market)
  42.                     self._target_market = make_fetcher_formed(fetcher)
  43.                     self._target_base = self._target_fetcher
  44.                 else:
  45.                     self._logger.error(f"ERROR: Cannot determine target_market type: {target_market}")
  46.                     self._target_base = lambda: 0.0
  47.             except Exception as e:
  48.                 self._logger.error(f"ERROR: Failed to create Fetcher from target_market: {e}")
  49.                 self._target_base = lambda: 0.0
  50.  
  51.         if config.target_price > 0.0:
  52.             self._price_source = ConstPriceSource(config.target_price, self._logger)
  53.         elif config.followed_asset in ['BTC', 'ETH', 'SOL']:
  54.             followed_symbol = Symbol(base=config.followed_asset, quote='USDT')
  55.             oracle = BinanceWebSocketOracle([followed_symbol])
  56.             self._price_source = OracleSource(followed_symbol, oracle, config.following_rate, self._logger)
  57.         else:
  58.             mid_source = MarketMidSource(config.is_internal, config.offset_from_target, self._logger)
  59.             if config.use_trades:
  60.                 mock_mm_cfg = MarketMakingInstanceConfig(group = config.group, clients = [])
  61.                 trades_source = TradesSource(config.fill_percent_amt, config.group_clients, mock_mm_cfg.path_to_config, self._logger)
  62.                 if config.is_internal:
  63.                     self._price_source = trades_source
  64.                 elif config.half_detach:
  65.                     self._price_source = MinMultiSource([trades_source, mid_source])
  66.                 else:
  67.                     self._price_source = mid_source
  68.             else:
  69.                 self._price_source = mid_source
  70.  
  71.         self._cooldown = config.cooldown
  72.         self._price_writer = PriceWriter(config.group, self._logger)
  73.         self._target_volatility = config.target_volatility
  74.         self._vol_manager = BinanceKLineManager(False, self._logger)
  75.  
  76.     def graceful_stop(self):
  77.         return
  78.  
  79.     def run_event_loop(self):
  80.         prev_price = self._target_base()
  81.         self._price_source.initialize(prev_price)
  82.         while True:
  83.             cur_t = int(time.time() * 1000)
  84.             self._logger.info('iter time:', cur_t)
  85.             try:
  86.                 base_price = self._target_base()
  87.                 ctx = PriceContext(base_price, prev_price, cur_t)
  88.                 price = self._price_source.next(ctx)
  89.                 prev_price = price
  90.                 vol_norm_price = self._vol_manager.fetch().norm_price
  91.                 self._logger.info(f'price={price}, with vol: {price * (1 + vol_norm_price * self._target_volatility / 100)}')
  92.                 self._price_writer.log('price', {'price': price * (1 + vol_norm_price * self._target_volatility / 100)})
  93.             except Exception as e:
  94.                 self._logger.error(f'pt exception: {e}')
  95.             finally:
  96.                 time.sleep(self._cooldown)
  97.  
Advertisement
Add Comment
Please, Sign In to add comment