bitunix-automated-crypto-trading 3.2.5__py3-none-any.whl → 3.2.6__py3-none-any.whl

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.
@@ -9,6 +9,7 @@ from urllib.parse import urlencode
9
9
  from typing import Dict, Any
10
10
  import traceback
11
11
  from logger import Logger
12
+ #import ccxt
12
13
 
13
14
 
14
15
  class BitunixApi:
@@ -193,7 +194,7 @@ class BitunixApi:
193
194
  except Exception as e:
194
195
  stack = traceback.extract_stack()
195
196
  function_name = stack[-2].name
196
- logger.error(f"Function: {function_name}, {e}, {e.args}, {type(e).__name__}")
197
+ self.logger.error(f"Function: {function_name}, {e}, {e.args}, {type(e).__name__}")
197
198
 
198
199
  async def GetTickersPair(self, tickersStr):
199
200
  try:
@@ -204,7 +205,7 @@ class BitunixApi:
204
205
  except Exception as e:
205
206
  stack = traceback.extract_stack()
206
207
  function_name = stack[-2].name
207
- logger.error(f"Function: {function_name}, {e}, {e.args}, {type(e).__name__}")
208
+ self.logger.error(f"Function: {function_name}, {e}, {e.args}, {type(e).__name__}")
208
209
 
209
210
  async def GetTickerList(self, threshold, volume):
210
211
  symbols=[]
@@ -111,7 +111,10 @@ class BitunixSignal:
111
111
  olist = [entry['symbol'] for entry in self.pendingOrders['orderList']]
112
112
  newlist=olist+plist+list(set(symbols))
113
113
  self.tickerList=newlist[:300]
114
- self.tickerList.remove("STMXUSDT")
114
+ if "STMXUSDT" in self.tickerList:
115
+ self.tickerList.remove("STMXUSDT")
116
+ if "AMBUSDT" in self.tickerList:
117
+ self.tickerList.remove("AMBUSDT")
115
118
  #self.tickerList=['POLUSDT']
116
119
  else:
117
120
  self.tickerList = self.settings.TICKERS.split(",")
@@ -615,7 +618,6 @@ class BitunixSignal:
615
618
  self.signaldf['sell'] = self.signaldf.apply(self.add_sell_button, axis=1)
616
619
  else:
617
620
  self.signaldf = pd.DataFrame()
618
- self.signaldfStyle= self.signaldfrenderer.render_html(self.signaldf)
619
621
 
620
622
  #if not self.settings.USE_PUBLIC_WEBSOCKET:
621
623
  #get bid las ask using api for max_auto_trades rows
@@ -629,6 +631,9 @@ class BitunixSignal:
629
631
  for index, row in self.signaldf[:m].iterrows()
630
632
  ]
631
633
  )
634
+ else:
635
+ self.signaldf = pd.DataFrame()
636
+ self.signaldfStyle= self.signaldfrenderer.render_html(self.signaldf)
632
637
 
633
638
  except Exception as e:
634
639
  self.logger.info(f"Function: BuySellList, {e}, {e.args}, {type(e).__name__}")
@@ -636,6 +641,39 @@ class BitunixSignal:
636
641
  del inuse1, inuse2, inuseTickers
637
642
  gc.collect()
638
643
 
644
+ async def get_duration_minutes_unixtime(self, trade_time_unix):
645
+ """Calculates the duration in minutes from trade time to current time."""
646
+ current_time_unix = int(time.time()) # Get current Unix timestamp
647
+ duration_seconds = current_time_unix - trade_time_unix
648
+ duration_minutes = duration_seconds / 60 # Convert seconds to minutes
649
+ return round(duration_minutes)
650
+
651
+ async def get_duration(self,datetime_str):
652
+ """Calculates the duration in minutes from a given datetime string to the current time."""
653
+ # Convert input datetime string to a datetime object
654
+ trade_time = datetime.strptime(datetime_str, "%Y-%m-%d %H:%M:%S")
655
+
656
+ # Convert datetime object to Unix timestamp
657
+ trade_time_unix = int(trade_time.timestamp())
658
+
659
+ # Get current Unix timestamp
660
+ current_time_unix = int(time.time())
661
+
662
+ # Calculate duration in minutes
663
+ duration_minutes = (current_time_unix - trade_time_unix) / 60
664
+
665
+ return round(duration_minutes)
666
+
667
+
668
+
669
+ async def calculate_candles(self, timeframe, duration_minutes):
670
+
671
+ timeframe_dict = {"5m": 5, "15m": 15, "1h": 60, "1d": 1440} # 1 day = 1440 minutes
672
+ if timeframe in timeframe_dict:
673
+ return duration_minutes // timeframe_dict[timeframe]
674
+ else:
675
+ return np.nan
676
+
639
677
  async def AutoTradeProcess(self):
640
678
  if self.settings.VERBOSE_LOGGING:
641
679
  self.logger.info(f"AutoTradeProcess started")
@@ -665,26 +703,35 @@ class BitunixSignal:
665
703
  #open position upto a max of max_auto_trades from the signal list
666
704
  df=self.signaldf.copy(deep=False)
667
705
  for index, row in df.iterrows():
668
- side = "BUY" if row[f'{period}_barcolor'] == self.green and row[f'{period}_trend'] == "BUY" else "SELL" if row[f'{period}_barcolor'] == self.red and row[f'{period}_trend'] == "SELL" else ""
669
- if side != "":
670
- select = True
671
- self.pendingPositions = await self.bitunixApi.GetPendingPositionData({'symbol': row.symbol})
672
- if self.pendingPositions and len(self.pendingPositions) == 1:
673
- select = False
674
- self.pendingOrders = await self.bitunixApi.GetPendingOrderData({'symbol': row.symbol})
675
- if self.pendingOrders and len(self.pendingOrders['orderList']) == 1:
676
- select = False
677
- if select:
678
- last, bid, ask, mtv = await self.GetTickerBidLastAsk(row.symbol)
679
- price = (bid if side == "BUY" else ask if side == "SELL" else last) if bid<=last<=ask else last
680
- balance = float(self.portfoliodf["available"].iloc[0]) + float(self.portfoliodf["crossUnrealizedPNL"].iloc[0])
681
- qty= str(max(balance * (float(self.settings.ORDER_AMOUNT_PERCENTAGE) / 100) / price * int(self.settings.LEVERAGE),mtv))
706
+
707
+ # Calculate the duration in minutes since the position was opened
708
+ data = await self.bitunixApi.GetPositionHistoryData({'symbol': row['symbol']})
709
+ xtime = float(data['positionList'][0]['mtime'])
710
+ mtime = pd.to_datetime(xtime, unit='ms').tz_localize('UTC').tz_convert(cst).strftime('%Y-%m-%d %H:%M:%S')
711
+ duration_minutes = await self.get_duration(mtime)
712
+ if duration_minutes > self.settings.DELAY_IN_MINUTES_FOR_SAME_TICKER_TRADES:
713
+ side = "BUY" if row[f'{period}_barcolor'] == self.green and row[f'{period}_trend'] == "BUY" else "SELL" if row[f'{period}_barcolor'] == self.red and row[f'{period}_trend'] == "SELL" else ""
714
+ if side != "":
715
+ select = True
716
+ self.pendingPositions = await self.bitunixApi.GetPendingPositionData({'symbol': row.symbol})
717
+ if self.pendingPositions and len(self.pendingPositions) == 1:
718
+ select = False
719
+ self.pendingOrders = await self.bitunixApi.GetPendingOrderData({'symbol': row.symbol})
720
+ if self.pendingOrders and len(self.pendingOrders['orderList']) == 1:
721
+ select = False
722
+ if select:
723
+ last, bid, ask, mtv = await self.GetTickerBidLastAsk(row.symbol)
724
+ price = (bid if side == "BUY" else ask if side == "SELL" else last) if bid<=last<=ask else last
725
+ balance = float(self.portfoliodf["available"].iloc[0]) + float(self.portfoliodf["crossUnrealizedPNL"].iloc[0])
726
+ qty= str(max(balance * (float(self.settings.ORDER_AMOUNT_PERCENTAGE) / 100) / price * int(self.settings.LEVERAGE),mtv))
682
727
 
683
- self.notifications.add_notification(
684
- f'{colors.YELLOW} Opening {"long" if side=="BUY" else "short"} position for {row.symbol} with {qty} qty @ {price})'
685
- )
686
- datajs = await self.bitunixApi.PlaceOrder(row.symbol, qty, price, side)
687
- count=count+1
728
+ self.notifications.add_notification(
729
+ f'{colors.YELLOW} Opening {"long" if side=="BUY" else "short"} position for {row.symbol} with {qty} qty @ {price})'
730
+ )
731
+ datajs = await self.bitunixApi.PlaceOrder(row.symbol, qty, price, side)
732
+ count=count+1
733
+ else:
734
+ self.logger.info(f"Skipping {row.symbol} as it has been opened for less than {self.settings.DELAY_IN_MINUTES_FOR_SAME_TICKER_TRADES} minutes")
688
735
  if count >= int(self.settings.MAX_AUTO_TRADES):
689
736
  break
690
737
  await asyncio.sleep(0)
@@ -714,6 +761,11 @@ class BitunixSignal:
714
761
  total_pnl = unrealized_pnl + realized_pnl
715
762
  side=row['side']
716
763
 
764
+ # Calculate the duration in minutes since the position was opened
765
+ ctime = row['ctime']
766
+ duration_minutes = await self.get_duration(ctime)
767
+ no_of_candles_since_current_open = await self.calculate_candles(period, duration_minutes)
768
+
717
769
  requiredCols=[f'{period}_open', f'{period}_close', f'{period}_high', f'{period}_low', f'{period}_ema_open', f"{period}_ema_close", f'{period}_macd', f'{period}_bbm', f'{period}_rsi', f'{period}_trendline', f'{period}_candle_trend', f'{period}_trend', f'{period}_cb', f'{period}_barcolor']
718
770
  required_cols = set(requiredCols)
719
771
 
@@ -268,16 +268,16 @@ class Interval:
268
268
 
269
269
  if df is not None and len(df) >= 2:
270
270
  if self.settings.TRENDLINE_BREAKOUT:
271
- if df['close'].iloc[-1] > df['trend_resistance_line'].iloc[-1]:
271
+ if df['close'].iloc[-1] > df['trend_resistance_line'].iloc[-1] and df['trend_resistance_line'].iloc[-1] > df['trend_support_line'].iloc[-1]:
272
272
  self.trendline_signal = "BUY"
273
- elif df['close'].iloc[-1] < df['trend_support_line'].iloc[-1]:
273
+ elif df['close'].iloc[-1] < df['trend_support_line'].iloc[-1] and df['trend_resistance_line'].iloc[-1] > df['trend_support_line'].iloc[-1]:
274
274
  self.trendline_signal = "SELL"
275
275
  else:
276
276
  self.trendline_signal = "HOLD"
277
277
  else:
278
- if df['close'].iloc[-1] < df['trend_resistance_line'].iloc[-1] and df['close'].iloc[-2] < df['open'].iloc[-2] and df['close'].iloc[-1] < df['open'].iloc[-1]:
278
+ if df['close'].iloc[-1] < df['trend_resistance_line'].iloc[-1] and df['close'].iloc[-2] < df['open'].iloc[-2] and df['close'].iloc[-1] < df['open'].iloc[-1] and df['trend_resistance_line'].iloc[-1] > df['trend_support_line'].iloc[-1]:
279
279
  self.trendline_signal = "SELL"
280
- elif df['close'].iloc[-1] > df['trend_support_line'].iloc[-1] and df['close'].iloc[-2] > df['open'].iloc[-2] and df['close'].iloc[-1] > df['open'].iloc[-1]:
280
+ elif df['close'].iloc[-1] > df['trend_support_line'].iloc[-1] and df['close'].iloc[-2] > df['open'].iloc[-2] and df['close'].iloc[-1] > df['open'].iloc[-1] and df['trend_resistance_line'].iloc[-1] > df['trend_support_line'].iloc[-1]:
281
281
  self.trendline_signal = "BUY"
282
282
  else:
283
283
  self.trendline_signal = "HOLD"
@@ -334,10 +334,11 @@ class Interval:
334
334
  (self.settings.TRENDLINE_STUDY and self.settings.TRENDLINE_CHECK_ON_OPEN and self.trendline_signal == "BUY")
335
335
  )
336
336
  additional_buy_conditions = (
337
- (not self.settings.ADX_STUDY or not self.settings.ADX_CHECK_ON_OPEN or self.adx_signal == "STRONG") or
337
+ (not self.settings.ADX_STUDY or not self.settings.ADX_CHECK_ON_OPEN or self.adx_signal == "STRONG") and
338
338
  (not self.settings.CANDLE_TREND_STUDY or not self.settings.CANDLE_TREND_CHECK_ON_OPEN or self.candle_trend == "BULLISH")
339
339
  )
340
340
 
341
+
341
342
  # Check for SELL signal
342
343
  sell_conditions = (
343
344
  (self.settings.BOS_STUDY and self.settings.BOS_CHECK_ON_OPEN and self.bos_signal == "SELL") or
@@ -348,7 +349,7 @@ class Interval:
348
349
  (self.settings.TRENDLINE_STUDY and self.settings.TRENDLINE_CHECK_ON_OPEN and self.trendline_signal == "SELL")
349
350
  )
350
351
  additional_sell_conditions = (
351
- (self.settings.ADX_STUDY and self.settings.ADX_CHECK_ON_OPEN and self.adx_signal == "STRONG") or
352
+ (self.settings.ADX_STUDY and self.settings.ADX_CHECK_ON_OPEN and self.adx_signal == "STRONG") and
352
353
  (self.settings.CANDLE_TREND_STUDY and self.settings.CANDLE_TREND_CHECK_ON_OPEN or self.candle_trend == "BEARISH")
353
354
  )
354
355
 
@@ -616,7 +616,7 @@ async def stream_log_file(websocket: WebSocket):
616
616
  lines = log_file.readlines()
617
617
  # Determine starting point: offset_from_end
618
618
  start_index = max(len(lines) - 100, 0)
619
- for line in lines[start_index:]: # Yield existing lines from offset
619
+ for line in reversed(lines[start_index:]): # Yield existing lines from offset
620
620
  await websocket.send_text(line)
621
621
  # Stream new lines added to the file
622
622
  log_file.seek(0, 2) # Go to the end of the file
@@ -10,18 +10,19 @@ class Settings(BaseSettings):
10
10
 
11
11
  #Ticker list
12
12
  TICKERS:str = Field(default="")
13
- THRESHOLD: float = Field(default=5.0, ge=0.0)
14
- MIN_VOLUME: int = Field(default=10_000_000, ge=0)
13
+ THRESHOLD: float = Field(default=100.0, ge=0.0)
14
+ MIN_VOLUME: int = Field(default=500000000, ge=0)
15
15
 
16
16
  # Trading Parameters
17
17
  LEVERAGE: int = Field(default=20, ge=1, le=100)
18
- ORDER_AMOUNT_PERCENTAGE: float = Field(default=0.01, ge=0.0, le=100)
18
+ ORDER_AMOUNT_PERCENTAGE: float = Field(default=10, ge=0.0, le=100)
19
19
  MAX_AUTO_TRADES: int = Field(default=10, ge=0)
20
- PROFIT_PERCENTAGE: float = Field(default=25, ge=0.0)
21
- LOSS_PERCENTAGE: float = Field(default=50, ge=0.0)
22
- PROFIT_AMOUNT: float = Field(default=0.25, ge=0.0)
20
+ PROFIT_PERCENTAGE: float = Field(default=10, ge=0.0)
21
+ LOSS_PERCENTAGE: float = Field(default=10, ge=0.0)
22
+ PROFIT_AMOUNT: float = Field(default=0, ge=0.0)
23
23
  LOSS_AMOUNT: float = Field(default=5.0, ge=0.0)
24
24
  OPTION_MOVING_AVERAGE: str = Field(default="1h")
25
+ DELAY_IN_MINUTES_FOR_SAME_TICKER_TRADES: int = Field(default=15, ge=0)
25
26
  BARS: int = Field(default=100, ge=1)
26
27
 
27
28
  # Technical Indicators Parameters
@@ -40,50 +41,50 @@ class Settings(BaseSettings):
40
41
  # Technical Indicators
41
42
  OPEN_ON_ANY_SIGNAL: bool = Field(default=True)
42
43
 
43
- BOS_PERIOD: int = Field(default=20, ge=1)
44
- BOS_STUDY: bool = Field(default=True)
45
- BOS_CHART: bool = Field(default=True)
46
- BOS_CHECK_ON_OPEN: bool = Field(default=False)
47
- BOS_CHECK_ON_CLOSE: bool = Field(default=False)
48
-
49
44
  EMA_CHART: bool = Field(default=True)
50
45
  EMA_STUDY: bool = Field(default=True)
51
46
  EMA_CROSSING: bool = Field(default=False)
52
47
  EMA_CHECK_ON_OPEN: bool = Field(default=True)
53
48
  EMA_CHECK_ON_CLOSE: bool = Field(default=True)
54
- EMA_CLOSE_ON_FAST_MEDIUM: bool = Field(default=True)
49
+ EMA_CLOSE_ON_FAST_MEDIUM: bool = Field(default=False)
55
50
 
56
- MACD_CHART: bool = Field(default=False)
51
+ MACD_CHART: bool = Field(default=True)
57
52
  MACD_STUDY: bool = Field(default=True)
58
- MACD_CROSSING: bool = Field(default=False)
59
- MACD_CHECK_ON_OPEN: bool = Field(default=False)
53
+ MACD_CROSSING: bool = Field(default=True)
54
+ MACD_CHECK_ON_OPEN: bool = Field(default=True)
60
55
  MACD_CHECK_ON_CLOSE: bool = Field(default=False)
61
56
 
62
- BBM_CHART: bool = Field(default=False)
57
+ BBM_CHART: bool = Field(default=True)
63
58
  BBM_STUDY: bool = Field(default=True)
64
- BBM_CROSSING: bool = Field(default=False)
65
- BBM_CHECK_ON_OPEN: bool = Field(default=False)
59
+ BBM_CROSSING: bool = Field(default=True)
60
+ BBM_CHECK_ON_OPEN: bool = Field(default=True)
66
61
  BBM_CHECK_ON_CLOSE: bool = Field(default=False)
67
62
 
68
- RSI_CHART: bool = Field(default=False)
63
+ RSI_CHART: bool = Field(default=True)
69
64
  RSI_STUDY: bool = Field(default=True)
70
- RSI_CROSSING: bool = Field(default=False)
71
- RSI_CHECK_ON_OPEN: bool = Field(default=False)
65
+ RSI_CROSSING: bool = Field(default=True)
66
+ RSI_CHECK_ON_OPEN: bool = Field(default=True)
72
67
  RSI_CHECK_ON_CLOSE: bool = Field(default=False)
73
68
 
74
- TRENDLINE_PEAK_DISTANCE: int = Field(default=1, ge=0, le=30)
69
+ BOS_PERIOD: int = Field(default=24, ge=1)
70
+ BOS_STUDY: bool = Field(default=True)
71
+ BOS_CHART: bool = Field(default=True)
72
+ BOS_CHECK_ON_OPEN: bool = Field(default=True)
73
+ BOS_CHECK_ON_CLOSE: bool = Field(default=False)
74
+
75
+ TRENDLINE_PEAK_DISTANCE: int = Field(default=3, ge=0, le=30)
75
76
  TRENDLINE_CHART: bool = Field(default=True)
76
77
  TRENDLINE_STUDY: bool = Field(default=True)
77
- TRENDLINE_BREAKOUT: bool = Field(default=False)
78
- TRENDLINE_CHECK_ON_OPEN: bool = Field(default=False)
78
+ TRENDLINE_BREAKOUT: bool = Field(default=True)
79
+ TRENDLINE_CHECK_ON_OPEN: bool = Field(default=True)
79
80
  TRENDLINE_CHECK_ON_CLOSE: bool = Field(default=False)
80
81
 
81
82
  ADX_STUDY: bool = Field(default=True)
82
- ADX_CHECK_ON_OPEN: bool = Field(default=False)
83
+ ADX_CHECK_ON_OPEN: bool = Field(default=True)
83
84
  ADX_CHECK_ON_CLOSE: bool = Field(default=False)
84
85
 
85
86
  CANDLE_TREND_STUDY: bool = Field(default=True)
86
- CANDLE_TREND_CHECK_ON_OPEN: bool = Field(default=False)
87
+ CANDLE_TREND_CHECK_ON_OPEN: bool = Field(default=True)
87
88
  CANDLE_TREND_REVERSAL_CHECK_ON_CLOSE: bool = Field(default=False)
88
89
 
89
90
  # Time Intervals
@@ -1 +1 @@
1
- __version__ = "3.2.5"
1
+ __version__ = "3.2.6"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bitunix_automated_crypto_trading
3
- Version: 3.2.5
3
+ Version: 3.2.6
4
4
  Summary: Bitunix Futures Auto Trading Platform
5
5
  Home-page: https://github.com/tcj2001/bitunix-automated-crypto-trading
6
6
  Author: tcj2001
@@ -1,19 +1,19 @@
1
1
  bitunix_automated_crypto_trading/AsyncThreadRunner.py,sha256=bNIM_1xRYQOFEsIn74EX6qVpC59-GMhhr2CeiPr_GWg,3253
2
- bitunix_automated_crypto_trading/BitunixApi.py,sha256=udgBwbWowf7v46jVVyfs-VjeNh9ajnghTiJf70lvn5w,11269
3
- bitunix_automated_crypto_trading/BitunixSignal.py,sha256=h55dbrRDyKA0N8XX8WRpZC9w3a7Rv8uA6lC_3oxojJ4,74460
2
+ bitunix_automated_crypto_trading/BitunixApi.py,sha256=2mX5_ilayORr-AqyjRV388gYCE71yTQgFB3v6eOSK7o,11292
3
+ bitunix_automated_crypto_trading/BitunixSignal.py,sha256=BZ1NBDCghHHtOvWgT6AxSbKg009SFUAziAeS8EYh0N4,77261
4
4
  bitunix_automated_crypto_trading/BitunixWebSocket.py,sha256=uiqAcis3u-ct07tjaTiC87ujzvcAtVRZ31CMiTBDW_M,11309
5
5
  bitunix_automated_crypto_trading/DataFrameHtmlRenderer.py,sha256=Pqdzhh_nfIxFEZH9L_R5QXB8moDPbgeTGT_hmBkHWMg,2899
6
6
  bitunix_automated_crypto_trading/NotificationManager.py,sha256=exs6REABBA1omTeTGuUuECzxs5dGqdyL7oI8WyxS6Xc,798
7
7
  bitunix_automated_crypto_trading/SupportResistance.py,sha256=x_to4M4OHg0h8o40DXDBa4E_5io-y2Lb5qo2VzFnu_8,5765
8
8
  bitunix_automated_crypto_trading/ThreadManager.py,sha256=Lw5_1EIT0m3AFSv5CIMpnjtA0DnNw2qQ6JtSpT34LyM,2349
9
- bitunix_automated_crypto_trading/TickerManager.py,sha256=xzFzH1qDxCGi2bNji1fO8t7WM971RtN-HsUTWxTn7Ic,42717
9
+ bitunix_automated_crypto_trading/TickerManager.py,sha256=E6U08wO1LKY4XctB6frtoAmlactMng3xwRrqG59qDt8,43030
10
10
  bitunix_automated_crypto_trading/__init__.py,sha256=1hzk6nX8NnUCr1tsq8oFq1qGCNhNwnwldWE75641Eew,78
11
- bitunix_automated_crypto_trading/bitunix.py,sha256=dNCrQfUNj8jn0jxnP47p9G7QGGuta4nC6GanXPeV9yw,27132
12
- bitunix_automated_crypto_trading/config.py,sha256=H9iMKzibh295kQrf4RG66hv7_zF_x8Dvp7uCnFU7Voo,5478
11
+ bitunix_automated_crypto_trading/bitunix.py,sha256=lxwnYARxldA2oU6GdjupilXIlnUh4RX8rQLCOn7x13I,27143
12
+ bitunix_automated_crypto_trading/config.py,sha256=tt3ccEllSAaRW6Iz3UQ93uKJPoCMN0CR9bstybgvAsE,5536
13
13
  bitunix_automated_crypto_trading/logger.py,sha256=NHnA5JZdUFkTAhB7i-1iCAwrdf1fxhDuRvJUkbKPi9Y,2923
14
- bitunix_automated_crypto_trading/version.py,sha256=ufPRYI3RSwxsCvCYdJ7jV_Dl1zssfPz7Ye9vyr2dUt0,21
15
- bitunix_automated_crypto_trading-3.2.5.dist-info/METADATA,sha256=Xg7_0EYIGDSL6u6LgqN8w66W7Tp1oozohgDT4p0SjWc,996
16
- bitunix_automated_crypto_trading-3.2.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
- bitunix_automated_crypto_trading-3.2.5.dist-info/entry_points.txt,sha256=UXREYHuSl2XYd_tOtLIq0zg3d1kX3lixX5SpN8yGBw4,82
18
- bitunix_automated_crypto_trading-3.2.5.dist-info/top_level.txt,sha256=uyFzHUCOsp8elnG2Ovor6xXcf7dxRxY-C-Txiwix64Q,33
19
- bitunix_automated_crypto_trading-3.2.5.dist-info/RECORD,,
14
+ bitunix_automated_crypto_trading/version.py,sha256=1HjPiFBzp_U6RzL9z5kdjdDM-BdteyLYu6nyaSant0w,21
15
+ bitunix_automated_crypto_trading-3.2.6.dist-info/METADATA,sha256=aoZ7hyI1cwL436Crz2acDMvJ-aP4WEfdoN2G6f0pNkQ,996
16
+ bitunix_automated_crypto_trading-3.2.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
+ bitunix_automated_crypto_trading-3.2.6.dist-info/entry_points.txt,sha256=UXREYHuSl2XYd_tOtLIq0zg3d1kX3lixX5SpN8yGBw4,82
18
+ bitunix_automated_crypto_trading-3.2.6.dist-info/top_level.txt,sha256=uyFzHUCOsp8elnG2Ovor6xXcf7dxRxY-C-Txiwix64Q,33
19
+ bitunix_automated_crypto_trading-3.2.6.dist-info/RECORD,,