Advertisement
namile

Untitled

Feb 26th, 2020
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.81 KB | None | 0 0
  1. import time
  2. from datetime import datetime
  3. from trades import BaseTrade
  4.  
  5. # Ф-ция, которая приводит любое число к числу, кратному шагу, указанному биржей
  6. # Если передать параметр increase=True то округление произойдет к следующему шагу
  7. def adjust_to_step(value, step, increase=False):
  8. return ((int(value * 100000000) - int(value * 100000000) % int(
  9. float(step) * 100000000)) / 100000000)+(float(step) if increase else 0)
  10.  
  11.  
  12. # синхронизирует локальное время и время биржи
  13. def sync_time(bot, log, pause):
  14. while True:
  15. try:
  16. # Получаем ограничения торгов по всем парам с биржи
  17. limits = bot.exchangeInfo()
  18.  
  19. local_time = int(time.time())
  20. server_time = int(limits['serverTime']) // 1000
  21.  
  22. # Бесконечный цикл программы
  23. shift_seconds = server_time - local_time
  24.  
  25. if local_time + shift_seconds != server_time:
  26. bot.set_shift_seconds(shift_seconds)
  27.  
  28. log.debug("""
  29. Текущее время: {local_time_d} {local_time_u}
  30. Время сервера: {server_time_d} {server_time_u}
  31. Разница: {diff:0.8f} {warn}
  32. Бот будет работать, как будто сейчас: {fake_time_d} {fake_time_u}
  33. """.format(
  34. local_time_d=datetime.fromtimestamp(local_time), local_time_u=local_time,
  35. server_time_d=datetime.fromtimestamp(server_time), server_time_u=server_time,
  36. diff=abs(local_time - server_time),
  37. warn="ТЕКУЩЕЕ ВРЕМЯ ВЫШЕ" if local_time > server_time else '',
  38. fake_time_d=datetime.fromtimestamp(local_time + shift_seconds), fake_time_u=local_time + shift_seconds
  39. ))
  40.  
  41. except:
  42. log.exception('sync_time error')
  43.  
  44. if pause:
  45. time.sleep(10000)
  46. else:
  47. break
  48.  
  49. def calc_buy_avg_rate(order_trades, log):
  50. bought = 0
  51. spent = 0
  52. fee = 0
  53. avg_rate = 0
  54. for trade in order_trades:
  55. bought += trade.trade_amount
  56. spent += trade.trade_amount * trade.trade_rate
  57. fee += trade.trade_fee
  58.  
  59. log.debug(
  60. 'По ордеру была сделка {id} на покупку {am:0.8f} по курсу {r:0.8f}, комиссия {fee:0.8f} {f_a}'.format(
  61. id=trade.trade_id,
  62. am=trade.trade_amount,
  63. r=trade.trade_rate,
  64. fee=trade.trade_fee,
  65. f_a=trade.fee_type
  66. ))
  67. try:
  68. avg_rate = spent / bought
  69. except ZeroDivisionError:
  70. log.debug(
  71. 'Не удалось посчитать средневзвешенную цену, деление на 0')
  72. avg_rate = 0
  73.  
  74. log.debug(
  75. 'Средневзвешенная цена {ar:0.8f}'.format(ar=avg_rate))
  76.  
  77. return avg_rate
  78.  
  79. def calc_sell_avg_rate(order_trades, log):
  80. sold = 0
  81. got = 0
  82. fee = 0
  83.  
  84. for trade in order_trades:
  85.  
  86. sold += trade.trade_amount
  87. got += trade.trade_amount * trade.trade_rate
  88. fee += trade.trade_fee
  89.  
  90. log.debug(
  91. 'По ордеру была сделка {id} на продажу {am:0.8f} по курсу {r:0.8f}, комиссия {fee:0.8f} {f_a}'.format(
  92. id=trade.trade_id,
  93. am=trade.trade_amount,
  94. r=trade.trade_rate,
  95. fee=trade.trade_fee,
  96. f_a=trade.fee_type
  97. ))
  98.  
  99. try:
  100. avg_rate = got / sold
  101. except ZeroDivisionError:
  102. log.debug(
  103. 'Не удалось посчитать средневзвешенную цену, деление на 0')
  104. avg_rate = 0
  105.  
  106. log.debug(
  107. 'Средневзвешенная цена {ar:0.8f}'.format(ar=avg_rate))
  108.  
  109. return avg_rate
  110.  
  111.  
  112. def get_order_trades(order_id, pair, bot):
  113. trades = bot.myTrades(symbol=pair)
  114. trades.reverse()
  115.  
  116. ret_trades = []
  117. for trade in trades:
  118. if str(trade['orderId']) == str(order_id):
  119. ret_trades.append(
  120. BaseTrade(
  121. trade_id=trade['id'],
  122. trade_rate=float(trade['price']),
  123. trade_amount=float(trade['qty']),
  124. trade_type='buy' if trade['isBuyer'] else 'sell',
  125. trade_fee=float(trade['commission']),
  126. fee_type=trade['commissionAsset']
  127. )
  128. )
  129. return ret_trades
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement