den4ik2003

Untitled

Jan 13th, 2026
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.27 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, 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 _target_none(self) -> float:
  27. # When target_market is None, return a default price
  28. # This shouldn't normally happen in real usage
  29. return 1.0
  30.  
  31. def __init__(self, config: PriceTargetingInstanceConfig):
  32. self._logger = MarketLogger(config.path_to_log)
  33.  
  34. if config.target_market is None:
  35. self._target_market = None
  36. self._target_base = self._target_none
  37. elif isinstance(config.target_market, Client):
  38. self._target_market = make_client_formed(config.target_market)
  39. self._target_base = self._target_client
  40. else:
  41. self._target_market = make_fetcher_formed(config.target_market)
  42. self._target_base = self._target_fetcher
  43.  
  44. if config.target_price > 0.0:
  45. self._price_source = ConstPriceSource(config.target_price, self._logger)
  46. elif config.followed_asset in ['BTC', 'ETH', 'SOL']:
  47. followed_symbol = Symbol.from_full_name(config.followed_asset)
  48. oracle = BinanceWebSocketOracle([followed_symbol])
  49. self._price_source = OracleSource(followed_symbol, oracle, config.following_rate, self._logger)
  50. else:
  51. mid_source = MarketMidSource(config.is_internal, config.offset_from_target, self._logger)
  52. if config.use_trades:
  53. mock_mm_cfg = MarketMakingInstanceConfig(group = config.group, clients = [])
  54. trades_source = TradesSource(config.fill_percent_amt, config.group_clients, mock_mm_cfg.path_to_config, self._logger)
  55. if config.is_internal:
  56. self._price_source = trades_source
  57. elif config.half_detach:
  58. self._price_source = MinMultiSource([trades_source, mid_source])
  59. else:
  60. self._price_source = mid_source
  61. else:
  62. self._price_source = mid_source
  63.  
  64. self._cooldown = config.cooldown
  65. self._price_writer = PriceWriter(config.group, self._logger)
  66. self._target_volatility = config.target_volatility
  67. self._vol_manager = BinanceKLineManager(False, self._logger)
  68.  
  69. def graceful_stop(self):
  70. return
  71.  
  72. def run_event_loop(self):
  73. prev_price = self._target_base()
  74. self._price_source.initialize(prev_price)
  75. while True:
  76. cur_t = int(time.time() * 1000)
  77. self._logger.info('iter time:', cur_t)
  78. try:
  79. base_price = self._target_base()
  80. ctx = PriceContext(base_price, prev_price, cur_t)
  81. price = self._price_source.next(ctx)
  82. prev_price = price
  83. vol_norm_price = self._vol_manager.fetch().norm_price
  84. self._logger.info(f'price={price}, with vol: {price * (1 + vol_norm_price * self._target_volatility / 100)}')
  85. self._price_writer.log('price', {'price': price * (1 + vol_norm_price * self._target_volatility / 100)})
  86. except Exception as e:
  87. self._logger.error(f'pt exception: {e}')
  88. finally:
  89. time.sleep(self._cooldown)
  90.  
Advertisement
Add Comment
Please, Sign In to add comment