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.
- bitunix_automated_crypto_trading/BitunixApi.py +3 -2
- bitunix_automated_crypto_trading/BitunixSignal.py +73 -21
- bitunix_automated_crypto_trading/TickerManager.py +7 -6
- bitunix_automated_crypto_trading/bitunix.py +1 -1
- bitunix_automated_crypto_trading/config.py +28 -27
- bitunix_automated_crypto_trading/version.py +1 -1
- {bitunix_automated_crypto_trading-3.2.5.dist-info → bitunix_automated_crypto_trading-3.2.6.dist-info}/METADATA +1 -1
- {bitunix_automated_crypto_trading-3.2.5.dist-info → bitunix_automated_crypto_trading-3.2.6.dist-info}/RECORD +11 -11
- {bitunix_automated_crypto_trading-3.2.5.dist-info → bitunix_automated_crypto_trading-3.2.6.dist-info}/WHEEL +0 -0
- {bitunix_automated_crypto_trading-3.2.5.dist-info → bitunix_automated_crypto_trading-3.2.6.dist-info}/entry_points.txt +0 -0
- {bitunix_automated_crypto_trading-3.2.5.dist-info → bitunix_automated_crypto_trading-3.2.6.dist-info}/top_level.txt +0 -0
@@ -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
|
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
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
if self.
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
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
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
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")
|
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")
|
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
|
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=
|
14
|
-
MIN_VOLUME: int = Field(default=
|
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=
|
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=
|
21
|
-
LOSS_PERCENTAGE: float = Field(default=
|
22
|
-
PROFIT_AMOUNT: float = Field(default=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=
|
49
|
+
EMA_CLOSE_ON_FAST_MEDIUM: bool = Field(default=False)
|
55
50
|
|
56
|
-
MACD_CHART: bool = Field(default=
|
51
|
+
MACD_CHART: bool = Field(default=True)
|
57
52
|
MACD_STUDY: bool = Field(default=True)
|
58
|
-
MACD_CROSSING: bool = Field(default=
|
59
|
-
MACD_CHECK_ON_OPEN: bool = Field(default=
|
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=
|
57
|
+
BBM_CHART: bool = Field(default=True)
|
63
58
|
BBM_STUDY: bool = Field(default=True)
|
64
|
-
BBM_CROSSING: bool = Field(default=
|
65
|
-
BBM_CHECK_ON_OPEN: bool = Field(default=
|
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=
|
63
|
+
RSI_CHART: bool = Field(default=True)
|
69
64
|
RSI_STUDY: bool = Field(default=True)
|
70
|
-
RSI_CROSSING: bool = Field(default=
|
71
|
-
RSI_CHECK_ON_OPEN: bool = Field(default=
|
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
|
-
|
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=
|
78
|
-
TRENDLINE_CHECK_ON_OPEN: bool = Field(default=
|
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=
|
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=
|
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.
|
1
|
+
__version__ = "3.2.6"
|
@@ -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=
|
3
|
-
bitunix_automated_crypto_trading/BitunixSignal.py,sha256=
|
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=
|
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=
|
12
|
-
bitunix_automated_crypto_trading/config.py,sha256=
|
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=
|
15
|
-
bitunix_automated_crypto_trading-3.2.
|
16
|
-
bitunix_automated_crypto_trading-3.2.
|
17
|
-
bitunix_automated_crypto_trading-3.2.
|
18
|
-
bitunix_automated_crypto_trading-3.2.
|
19
|
-
bitunix_automated_crypto_trading-3.2.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|