xync-client 0.0.57.dev20__tar.gz → 0.0.57.dev22__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. {xync_client-0.0.57.dev20/xync_client.egg-info → xync_client-0.0.57.dev22}/PKG-INFO +1 -1
  2. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Abc/Ex.py +4 -4
  3. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Bybit/agent.py +53 -65
  4. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22/xync_client.egg-info}/PKG-INFO +1 -1
  5. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/.env.sample +0 -0
  6. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/.gitignore +0 -0
  7. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/.pre-commit-config.yaml +0 -0
  8. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/README.md +0 -0
  9. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/makefile +0 -0
  10. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/pyproject.toml +0 -0
  11. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/setup.cfg +0 -0
  12. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/TestAgent.py +0 -0
  13. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/TestAsset.py +0 -0
  14. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/TestEx.py +0 -0
  15. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/TestOrder.py +0 -0
  16. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/_todo_refact/Binance/test_binance.py +0 -0
  17. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  18. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  19. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/_todo_refact/Gate/test_gate.py +0 -0
  20. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/_todo_refact/Htx/test_htx_p2p.py +0 -0
  21. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  22. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  23. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/_todo_refact/__init__.py +0 -0
  24. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/tests/_todo_refact/_test_ex.py +0 -0
  25. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Abc/Agent.py +0 -0
  26. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Abc/Asset.py +0 -0
  27. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Abc/Auth.py +0 -0
  28. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Abc/BaseTest.py +0 -0
  29. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Abc/InAgent.py +0 -0
  30. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Abc/Order.py +0 -0
  31. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Abc/xtype.py +0 -0
  32. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Binance/__init__.py +0 -0
  33. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Binance/binance_async.py +0 -0
  34. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Binance/earn_api.py +0 -0
  35. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Binance/etype/ad.py +0 -0
  36. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Binance/etype/pm.py +0 -0
  37. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Binance/ex.py +0 -0
  38. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Binance/exceptions.py +0 -0
  39. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Binance/sapi.py +0 -0
  40. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Binance/web_c2c.py +0 -0
  41. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BingX/__init__.py +0 -0
  42. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BingX/agent.py +0 -0
  43. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BingX/base.py +0 -0
  44. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BingX/etype/ad.py +0 -0
  45. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BingX/etype/pm.py +0 -0
  46. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BingX/ex.py +0 -0
  47. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BingX/req.mjs +0 -0
  48. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BingX/sign.js +0 -0
  49. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BitGet/__init__.py +0 -0
  50. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BitGet/agent.py +0 -0
  51. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BitGet/etype/ad.py +0 -0
  52. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BitGet/ex.py +0 -0
  53. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/BitPapa/ex.py +0 -0
  54. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Bybit/InAgent.py +0 -0
  55. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Bybit/etype/ad.py +0 -0
  56. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Bybit/etype/cred.py +0 -0
  57. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Bybit/etype/order.py +0 -0
  58. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Bybit/ex.py +0 -0
  59. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Bybit/order.py +0 -0
  60. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Bybit/web_earn.py +0 -0
  61. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Bybit/web_p2p.py +0 -0
  62. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Bybit/ws.py +0 -0
  63. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Gate/etype/ad.py +0 -0
  64. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Gate/ex.py +0 -0
  65. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Gate/premarket.py +0 -0
  66. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Gmail/__init__.py +0 -0
  67. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Htx/agent.py +0 -0
  68. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Htx/earn.py +0 -0
  69. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Htx/etype/__init__.py +0 -0
  70. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Htx/etype/ad.py +0 -0
  71. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Htx/etype/cred.py +0 -0
  72. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Htx/etype/pm.py +0 -0
  73. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Htx/etype/test.py +0 -0
  74. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Htx/ex.py +0 -0
  75. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/KuCoin/etype/ad.py +0 -0
  76. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/KuCoin/etype/pm.py +0 -0
  77. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/KuCoin/ex.py +0 -0
  78. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/KuCoin/web.py +0 -0
  79. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Mexc/etype/ad.py +0 -0
  80. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Mexc/etype/pm.py +0 -0
  81. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Mexc/ex.py +0 -0
  82. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Okx/etype/ad.py +0 -0
  83. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Okx/etype/pm.py +0 -0
  84. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Okx/ex.py +0 -0
  85. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Pms/.gitignore +0 -0
  86. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Pms/Alfa/__init__.py +0 -0
  87. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Pms/Alfa/state.json +0 -0
  88. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Pms/Ozon/__init__.py +0 -0
  89. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Pms/Sber/__init__.py +0 -0
  90. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Pms/Tinkoff/__init__.py +0 -0
  91. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Pms/Tinkoff/state.json +0 -0
  92. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Pms/Volet/__init__.py +0 -0
  93. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
  94. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
  95. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Pms/Volet/api.py +0 -0
  96. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/Pms/Volet/pl.py +0 -0
  97. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/TgWallet/agent.py +0 -0
  98. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/TgWallet/asset.py +0 -0
  99. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/TgWallet/auth.py +0 -0
  100. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/TgWallet/ex.py +0 -0
  101. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/TgWallet/inAgent.py +0 -0
  102. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/TgWallet/order.py +0 -0
  103. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/TgWallet/pyd.py +0 -0
  104. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/TgWallet/pyro.py +0 -0
  105. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/TgWallet/web.py +0 -0
  106. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/__init__.py +0 -0
  107. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/loader.py +0 -0
  108. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client/pm_unifier.py +0 -0
  109. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client.egg-info/SOURCES.txt +0 -0
  110. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client.egg-info/dependency_links.txt +0 -0
  111. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client.egg-info/requires.txt +0 -0
  112. {xync_client-0.0.57.dev20 → xync_client-0.0.57.dev22}/xync_client.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.57.dev20
3
+ Version: 0.0.57.dev22
4
4
  Author-email: Mike Artemiev <mixartemev@gmail.com>
5
5
  Project-URL: Homepage, https://gitlab.com/XyncNet/client
6
6
  Project-URL: Repository, https://gitlab.com/XyncNet/client
@@ -261,13 +261,13 @@ class BaseExClient(HttpClient):
261
261
  }
262
262
  prs: tuple[dict, dict] = await self.pairs()
263
263
  for is_sell in (0, 1):
264
- dirs: list[models.Direction] = []
264
+ pss: list[models.PairSide] = []
265
265
  for cur, coinz in prs[is_sell].items():
266
266
  for coin in coinz:
267
267
  pair, _ = await models.Pair.get_or_create(coin=coins[coin], cur=curs[cur])
268
- pairex, _ = await models.PairEx.get_or_create(pair=pair, ex=self.ex)
269
- dirs += [models.Direction(sell=is_sell, pairex=pairex)]
270
- await models.Direction.bulk_create(dirs, ignore_conflicts=True)
268
+ # pairex, _ = await models.PairEx.get_or_create(pair=pair, ex=self.ex) # todo: разные ли комишки на покупку и продажу?
269
+ pss += [models.PairSide(is_sell=is_sell, pair=pair)]
270
+ await models.PairSide.bulk_create(pss, ignore_conflicts=True)
271
271
 
272
272
  # Сохранение чужого объявления (с Pm-ами) в бд
273
273
  async def ad_pydin2db(self, ad_pydin: BaseAdIn) -> models.Ad:
@@ -19,7 +19,7 @@ from x_model import init_db
19
19
  from xync_schema import models
20
20
  from xync_schema.enums import OrderStatus
21
21
 
22
- from xync_schema.models import Actor, Cond, Direction, CondSim, Pmcur
22
+ from xync_schema.models import Actor, Cond, CondSim, Pmcur, PairSide
23
23
 
24
24
  from xync_client.Abc.Agent import BaseAgentClient
25
25
  from xync_client.Abc.xtype import BaseOrderReq, FlatDict
@@ -395,8 +395,8 @@ class AgentClient(BaseAgentClient): # Bybit client
395
395
  size=30,
396
396
  # status=status, # 50 - завершено
397
397
  # tokenId=token_id,
398
- # beginTime=begin_time,
399
- # endTime=end_time,
398
+ beginTime=begin_time,
399
+ endTime=end_time,
400
400
  # side=side, # 1 - продажа, 0 - покупка
401
401
  )
402
402
  except FailedRequestError as e:
@@ -443,12 +443,14 @@ class AgentClient(BaseAgentClient): # Bybit client
443
443
  pmcur=pmcur, person=seller_person, detail=ecredex.accountNo
444
444
  )
445
445
  ):
446
- extr = (
447
- ecredex.bankName
448
- or ecredex.branchName
449
- or ecredex.qrcode
450
- or ecredex.payMessage
451
- or ecredex.paymentExt1
446
+ extr = ", ".join(
447
+ [
448
+ ecredex.bankName,
449
+ ecredex.branchName,
450
+ ecredex.qrcode,
451
+ ecredex.payMessage,
452
+ ecredex.paymentExt1,
453
+ ]
452
454
  )
453
455
  crd = await models.Cred.create(
454
456
  detail=ecredex.accountNo,
@@ -542,17 +544,17 @@ class AgentClient(BaseAgentClient): # Bybit client
542
544
  self,
543
545
  coinex: models.Coinex,
544
546
  curex: models.Curex,
545
- is_sell: bool,
547
+ taker_side: bool,
546
548
  pms: list[str],
547
549
  ceil: float,
548
550
  volume: float = None,
549
551
  place: int = 0,
550
552
  ):
551
- k = (-1) ** int(is_sell) # on_buy=1, on_sell=-1
553
+ k = (-1) ** int(taker_side) # on_buy=1, on_sell=-1
552
554
 
553
555
  creds: dict[models.Pmex, models.CredEx] = await self.get_credexs_by_norms(pms, curex.cur_id)
554
556
  if not volume:
555
- if is_sell: # гонка в стакане продажи - мы покупаем монету за ФИАТ
557
+ if taker_side: # гонка в стакане продажи - мы покупаем монету за ФИАТ
556
558
  # todo: we using the only one fiat exactly from THE FIRST cred
557
559
  fiat = await models.Fiat.get(cred_id=list(creds.values())[0].cred_id)
558
560
  volume = fiat.amount / ceil
@@ -565,14 +567,14 @@ class AgentClient(BaseAgentClient): # Bybit client
565
567
  credex_ids = [str(p.exid) for p in creds.values()]
566
568
 
567
569
  while self.actor.person.user.status > 0:
568
- ads: list[Ad] = await self.ads(coinex, curex, is_sell, list(creds.keys()))
570
+ ads: list[Ad] = await self.ads(coinex, curex, taker_side, list(creds.keys()))
569
571
  self.overprice_filter(ads, ceil, k)
570
572
  if not ads:
571
- print(coinex.exid, curex.exid, is_sell, "no ads!")
573
+ print(coinex.exid, curex.exid, taker_side, "no ads!")
572
574
  await sleep(15)
573
575
  continue
574
576
  if not (cur_plc := [i for i, ad in enumerate(ads) if int(ad.userId) == self.actor.exid]):
575
- logging.warning(f"No racing in {'-' if is_sell else '+'}{coinex.exid}/{curex.exid}")
577
+ logging.warning(f"No racing in {'-' if taker_side else '+'}{coinex.exid}/{curex.exid}")
576
578
  await sleep(15)
577
579
  continue
578
580
  (cur_plc,) = cur_plc
@@ -583,13 +585,13 @@ class AgentClient(BaseAgentClient): # Bybit client
583
585
  cad = self.get_cad(ads, ceil, k, place, cur_plc)
584
586
  new_price = f"%.{curex.cur.scale}f" % round(float(cad.price) - k * step(mad, cad), curex.cur.scale)
585
587
  if mad.price == new_price: # Если нужная цена и так уже стоит
586
- print(end="v" if is_sell else "^", flush=True)
588
+ print(end="v" if taker_side else "^", flush=True)
587
589
  await sleep(3)
588
590
  continue
589
591
  if cad.priceType: # Если цена конкурента плавающая, то повышаем себе не цену, а %
590
592
  new_premium = str(round(float(cad.premium) - k * step(mad, cad), 2))
591
593
  if mad.premium == new_premium: # Если нужный % и так уже стоит
592
- print(end="v" if is_sell else "^", flush=True)
594
+ print(end="v" if taker_side else "^", flush=True)
593
595
  await sleep(3)
594
596
  continue
595
597
  mad.premium = new_premium
@@ -599,14 +601,14 @@ class AgentClient(BaseAgentClient): # Bybit client
599
601
  req = AdUpdateRequest.model_validate({**mad.model_dump(), "price": new_price, "paymentIds": credex_ids})
600
602
  try:
601
603
  _res = self.ad_upd(req)
602
- print("-" if is_sell else "+", end=req.price, flush=True)
604
+ print("-" if taker_side else "+", end=req.price, flush=True)
603
605
  except FailedRequestError as e:
604
606
  if ExcCode(e.status_code) == ExcCode.FixPriceLimit:
605
607
  if limits := re.search(
606
608
  r"The fixed price set is lower than ([0-9]+\.?[0-9]{0,2}) or higher than ([0-9]+\.?[0-9]{0,2})",
607
609
  e.message,
608
610
  ):
609
- req.price = limits.group(1 if is_sell else 2)
611
+ req.price = limits.group(1 if taker_side else 2)
610
612
  if req.price != mad.price:
611
613
  _res = self.ad_upd(req)
612
614
  else:
@@ -629,20 +631,20 @@ class AgentClient(BaseAgentClient): # Bybit client
629
631
  self,
630
632
  coinex: models.Coinex,
631
633
  curex: models.Curex,
632
- is_sell: bool,
634
+ taker_side: bool,
633
635
  pms: list[str] = None,
634
636
  ceil: float = None,
635
637
  volume: float = 9000,
636
638
  min_fiat: int = None,
637
639
  max_fiat: int = None,
638
640
  ):
639
- k = (-1) ** int(is_sell) # on_buy=1, on_sell=-1
641
+ k = (-1) ** int(taker_side) # on_buy=1, on_sell=-1
640
642
 
641
643
  if pms:
642
644
  creds: dict[models.Pmex, models.CredEx] = await self.get_credexs_by_norms(pms, curex.cur_id)
643
645
  [str(p.exid) for p in creds.values()]
644
646
 
645
- if is_sell: # гонка в стакане продажи - мы покупаем монету за ФИАТ
647
+ if taker_side: # гонка в стакане продажи - мы покупаем монету за ФИАТ
646
648
  fiats = await models.Fiat.filter(
647
649
  cred_id__in=[cx.cred_id for cx in creds.values()], amount__not=F("target")
648
650
  )
@@ -651,17 +653,16 @@ class AgentClient(BaseAgentClient): # Bybit client
651
653
  asset = await models.Asset.get(addr__actor=self.actor, addr__coin_id=coinex.coin_id)
652
654
  volume = min(volume, asset.free - (asset.freeze or 0) - (asset.lock or 0))
653
655
  volume = str(round(volume, coinex.coin.scale))
654
- dr = await Direction.get(
655
- pairex__ex=self.ex_client.ex,
656
- pairex__pair__coin_id=coinex.coin_id,
657
- pairex__pair__cur_id=curex.cur_id,
658
- sell=is_sell,
656
+ ps = await PairSide.get(
657
+ is_sell=taker_side,
658
+ pair__coin_id=coinex.coin_id,
659
+ pair__cur_id=curex.cur_id,
659
660
  )
660
661
  while self.actor.person.user.status > 0: # todo: depends on rest asset/fiat
661
- ads: list[Ad] = await self.ads(coinex, curex, is_sell, pms and list(creds.keys()))
662
+ ads: list[Ad] = await self.ads(coinex, curex, taker_side, pms and list(creds.keys()))
662
663
 
663
664
  if not ads:
664
- print(coinex.exid, curex.exid, is_sell, "no ads!")
665
+ print(coinex.exid, curex.exid, taker_side, "no ads!")
665
666
  await sleep(300)
666
667
  continue
667
668
 
@@ -669,11 +670,11 @@ class AgentClient(BaseAgentClient): # Bybit client
669
670
  if (ceil - float(ad.price)) * k < 0:
670
671
  break
671
672
  if int(ad.userId) == self.actor.exid:
672
- logging.info(f"My ad {'-' if is_sell else '+'}{coinex.exid}/{curex.exid} on place#{i}")
673
+ logging.info(f"My ad {'-' if taker_side else '+'}{coinex.exid}/{curex.exid} on place#{i}")
673
674
  continue
674
- ad_db, isnew = await self.cond_upsert(ad, dr=dr)
675
+ ad_db, isnew = await self.cond_upsert(ad, ps=ps)
675
676
  if isnew:
676
- s = f"{'-' if is_sell else '+'}{ad.price}[{ad.minAmount}-{ad.maxAmount}]{coinex.exid}/{curex.exid}"
677
+ s = f"{'-' if taker_side else '+'}{ad.price}[{ad.minAmount}-{ad.maxAmount}]{coinex.exid}/{curex.exid}"
677
678
  print(s, end=" | ", flush=True)
678
679
  elif not isnew and ad_db and ad_db.cond.raw_txt != clean(ad.remark):
679
680
  # ad_db.cond.parsed = False
@@ -694,20 +695,16 @@ class AgentClient(BaseAgentClient): # Bybit client
694
695
  await sleep(6)
695
696
 
696
697
  async def cond_upsert(
697
- self, ad: Ad, rname: str = None, dr: Direction = None, force: bool = False
698
+ self, ad: Ad, rname: str = None, ps: PairSide = None, force: bool = False
698
699
  ) -> tuple[models.Ad, bool]:
699
700
  sim, cid = None, None
701
+ ad_db = await models.Ad.get_or_none(exid=ad.id, ex=self.ex_client.ex).prefetch_related("cond")
700
702
  # если точно такое условие уже есть в бд, ниче делать не надо
701
703
  if not (cleaned := clean(ad.remark)) or (cid := {oc[0]: ci for ci, oc in self.all_conds.items()}.get(cleaned)):
702
- if force:
703
- return (
704
- await models.Ad.get_or_none(exid=ad.id).prefetch_related("maker__person")
705
- or await self.ad_create(ad, cid, rname, dr),
706
- False,
707
- )
708
- return None, False
704
+ return (ad_db or force and await self.ad_create(ad, cid, rname, ps)), False
709
705
  # если эта объява уже есть в бд
710
- if ad_db := await models.Ad.get_or_none(exid=ad.id).prefetch_related("cond__ads__maker", "maker__person"):
706
+ if ad_db:
707
+ await ad_db.fetch_related("cond__ads", "maker")
711
708
  # у измененного условия этой объявы есть другие объявы?
712
709
  if rest_ads := set(ad_db.cond.ads) - {ad_db}:
713
710
  # другие объявы этого условия принадлежат другим юзерам
@@ -768,7 +765,7 @@ class AgentClient(BaseAgentClient): # Bybit client
768
765
  return actor.person
769
766
  return await models.Person.create(name=name)
770
767
 
771
- async def ad_create(self, ad: Ad, cid: int, rname: str = None, dr: Direction = None) -> models.Ad:
768
+ async def ad_create(self, ad: Ad, cid: int, rname: str = None, ps: PairSide = None) -> models.Ad:
772
769
  act_df = {}
773
770
  if int(ad.userId) != self.actor.exid:
774
771
  act_df |= {"name": ad.nickName}
@@ -782,16 +779,16 @@ class AgentClient(BaseAgentClient): # Bybit client
782
779
  max_fiat=ad.maxAmount,
783
780
  cond_id=cid,
784
781
  exid=int(ad.id),
785
- direction=dr
786
- or await Direction.get(
787
- sell=ad.side,
788
- pairex__ex=self.ex_client.ex,
789
- pairex__pair__coin__ticker=ad.tokenId,
790
- pairex__pair__cur__ticker=ad.currencyId,
782
+ pair_side=ps
783
+ or await PairSide.get(
784
+ is_sell=ad.side,
785
+ pair__coin__ticker=ad.tokenId,
786
+ pair__cur__ticker=ad.currencyId,
791
787
  ),
788
+ ex=self.ex_client.ex,
792
789
  maker=actor,
793
790
  )
794
- await ad_db.fetch_related("cond", "maker__person")
791
+ await ad_db.pms.add(*(await models.Pm.filter(pmexs__ex=self.ex_client.ex, pmexs__exid__in=ad.payments)))
795
792
  return ad_db
796
793
 
797
794
  async def sim_new(self, new_cid: int, sim: int, old_cid: int):
@@ -814,15 +811,9 @@ class AgentClient(BaseAgentClient): # Bybit client
814
811
  self.cond_sims = {cs.cond_id: (cs.cond_rel_id, cs.similarity) for cs in await CondSim.all()}
815
812
  for c, (o, s) in self.cond_sims.items():
816
813
  self.sim_conds[o].add(c)
817
- dr = await Direction.get(
818
- sell=1,
819
- pairex__ex=self.ex_client.ex,
820
- pairex__pair__coin__ticker="USDT",
821
- pairex__pair__cur__ticker="RUB",
822
- )
823
814
  for ad_db in await models.Ad.filter(direction__pairex__ex=self.ex_client.ex).prefetch_related("cond", "maker"):
824
815
  ad = Ad(id=str(ad_db.exid), userId=str(ad_db.maker.exid), remark=ad_db.cond.raw_txt)
825
- await self.cond_upsert(ad, dr=dr, cid=ad_db.cond_id)
816
+ await self.cond_upsert(ad, force=True)
826
817
 
827
818
  async def get_credexs_by_norms(self, norms: list[str], cur_id: int) -> dict[models.Pmex, models.CredEx] | None:
828
819
  try:
@@ -901,32 +892,29 @@ async def main():
901
892
  cl: AgentClient = actor.client(b)
902
893
  # await cl.ex_client.set_pmcurexs(cookies=actor.agent.auth["cookies"]) # 617 -> 639
903
894
  # await cl.set_creds()
895
+ # await cl.ex_client.set_pairs()
904
896
  usdt = await models.Coinex.get(coin__ticker="USDT", ex=cl.actor.ex).prefetch_related("coin")
905
897
  btc = await models.Coinex.get(coin__ticker="BTC", ex=cl.actor.ex).prefetch_related("coin")
906
898
  eth = await models.Coinex.get(coin__ticker="ETH", ex=cl.actor.ex).prefetch_related("coin")
907
899
  usdc = await models.Coinex.get(coin__ticker="USDC", ex=cl.actor.ex).prefetch_related("coin")
908
900
  rub = await models.Curex.get(cur__ticker="RUB", ex=cl.actor.ex).prefetch_related("cur")
909
- # await models.Direction.get(
910
- # pairex__ex=cl.actor.ex, pairex__pair__coin__ticker="USDT", pairex__pair__cur__ticker="RUB", sell=True
911
- # )
912
901
  cl.all_conds = {
913
902
  c.id: (c.raw_txt, {str(a.maker.exid) for a in c.ads})
914
903
  for c in await Cond.all().prefetch_related("ads__maker")
915
904
  }
916
- # await cl.set_creds()
917
905
  # await cl.actual_cond()
918
906
  await gather(
919
- cl.battle(usdt, rub, False, ["volet"], 79.97), # гонка в стакане покупки - мы продаем
920
- cl.battle(usdt, rub, True, ["volet"], 79.9), # гонка в стакане продажи - мы покупаем
907
+ cl.battle(usdt, rub, False, ["volet"], 79.8), # гонка в стакане покупки - мы продаем
908
+ cl.battle(usdt, rub, True, ["volet"], 79.8), # гонка в стакане продажи - мы покупаем
921
909
  cl.battle(eth, rub, False, ["volet"], 206_000),
922
910
  cl.battle(eth, rub, True, ["volet"], 200_000),
923
911
  cl.battle(btc, rub, False, ["volet"], 8_500_000),
924
912
  cl.battle(btc, rub, True, ["volet"], 8_400_000),
925
913
  cl.battle(usdc, rub, False, ["volet"], 80.5),
926
914
  cl.battle(usdc, rub, True, ["volet"], 79),
927
- cl.take(usdt, rub, False, ceil=80.5, volume=360),
928
- cl.take(usdt, rub, True, ceil=80.5, volume=360),
929
- cl.get_api_orders(67),
915
+ cl.take(usdt, rub, False, ceil=80, volume=360),
916
+ cl.take(usdt, rub, True, ceil=80, volume=360),
917
+ # cl.get_api_orders(), # 10, 1738357200000, 1742504399999
930
918
  )
931
919
 
932
920
  bor = BaseOrderReq(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.57.dev20
3
+ Version: 0.0.57.dev22
4
4
  Author-email: Mike Artemiev <mixartemev@gmail.com>
5
5
  Project-URL: Homepage, https://gitlab.com/XyncNet/client
6
6
  Project-URL: Repository, https://gitlab.com/XyncNet/client