bitunix-automated-crypto-trading 3.1.5__py3-none-any.whl → 3.1.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.
@@ -99,19 +99,23 @@ class BitunixSignal:
99
99
  self.tickerObjects.update_settings(settings)
100
100
 
101
101
  async def load_tickers(self):
102
- symbols = await self.bitunixApi.GetTickerList(float(self.settings.THRESHOLD), float(self.settings.MIN_VOLUME))
103
- self.pendingPositions= await self.bitunixApi.GetPendingPositionData()
104
- self.pendingOrders= await self.bitunixApi.GetPendingOrderData()
105
- olist=[]
106
- plist=[]
107
- if self.pendingPositions:
108
- plist = [entry['symbol'] for entry in self.pendingPositions]
109
- if self.pendingOrders['orderList']:
110
- olist = [entry['symbol'] for entry in self.pendingOrders['orderList']]
111
- newlist=olist+plist+list(set(symbols))
112
- self.tickerList=newlist[:300]
113
- self.tickerList.remove("STMXUSDT")
114
- #self.tickerList=['POLUSDT']
102
+ if self.settings.TICKERS=="":
103
+ symbols = await self.bitunixApi.GetTickerList(float(self.settings.THRESHOLD), float(self.settings.MIN_VOLUME))
104
+ self.pendingPositions= await self.bitunixApi.GetPendingPositionData()
105
+ self.pendingOrders= await self.bitunixApi.GetPendingOrderData()
106
+ olist=[]
107
+ plist=[]
108
+ if self.pendingPositions:
109
+ plist = [entry['symbol'] for entry in self.pendingPositions]
110
+ if self.pendingOrders['orderList']:
111
+ olist = [entry['symbol'] for entry in self.pendingOrders['orderList']]
112
+ newlist=olist+plist+list(set(symbols))
113
+ self.tickerList=newlist[:300]
114
+ self.tickerList.remove("STMXUSDT")
115
+ #self.tickerList=['POLUSDT']
116
+ else:
117
+ self.tickerList = self.settings.TICKERS.split(",")
118
+ self.tickerList = [sym.strip().upper() for sym in self.tickerList if sym.strip()]
115
119
 
116
120
  [await self.add_ticker_to_tickerObjects(sym) for sym in self.tickerList]
117
121
  self.notifications.add_notification(f"{len(self.tickerList)} ticker list loaded")
@@ -559,11 +563,16 @@ class BitunixSignal:
559
563
  self.signaldf_filtered = self.tickerObjects.signaldf_filtered
560
564
 
561
565
  if not self.positiondf.empty and not self.signaldf_full.empty:
562
- columns=['symbol', f"{period}_trend", f"{period}_cb", f"{period}_barcolor", 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}_open", f"{period}_close", f"{period}_high", f"{period}_low"]
566
+ columns=['symbol', f"{period}_trend", f"{period}_cb", f"{period}_barcolor",
567
+ f"{period}_bos",
568
+ 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}_open", f"{period}_close", f"{period}_high", f"{period}_low"]
563
569
  columns2=["qty", "side", "unrealizedPNL", "realizedPNL", "ctime", "avgOpenPrice", "bid", "bidcolor", "last", "lastcolor", "ask", "askcolor", "charts", "bitunix", "action", "add", "reduce"]
564
570
  if set(columns).issubset(self.signaldf_full.columns) and set(columns2).issubset(self.positiondf.columns):
565
- columnOrder= ['symbol', "side", "unrealizedPNL", "realizedPNL", f"{period}_trend", f"{period}_cb", f"{period}_barcolor", f"{period}_ema_open", f"{period}_ema_close", f"{period}_macd", f"{period}_bbm", f"{period}_rsi", f"{period}_trendline", f"{period}_adx", f"{period}_candle_trend", f"{period}_open", f"{period}_close", f"{period}_high", f"{period}_low", "qty", "ctime", "avgOpenPrice", "bid", "bidcolor", "last", "lastcolor", "ask", "askcolor", "charts", "bitunix", "action", "add", "reduce"]
571
+ columnOrder= ['symbol', "side", "unrealizedPNL", "realizedPNL", f"{period}_trend", f"{period}_cb", f"{period}_barcolor",
572
+ f"{period}_bos",
573
+ f"{period}_ema_open", f"{period}_ema_close", f"{period}_macd", f"{period}_bbm", f"{period}_rsi", f"{period}_trendline", f"{period}_adx", f"{period}_candle_trend", f"{period}_open", f"{period}_close", f"{period}_high", f"{period}_low", "qty", "ctime", "avgOpenPrice", "bid", "bidcolor", "last", "lastcolor", "ask", "askcolor", "charts", "bitunix", "action", "add", "reduce"]
566
574
  self.positiondf2 = pd.merge(self.positiondf, self.signaldf_full[["symbol", f"{period}_open", f"{period}_close", f"{period}_high", f"{period}_low",
575
+ f"{period}_bos",
567
576
  f"{period}_ema_open", f"{period}_ema_close", f"{period}_macd", f"{period}_bbm", f"{period}_rsi", f"{period}_trendline", f"{period}_adx", f"{period}_candle_trend",
568
577
  f"{period}_trend",f"{period}_cb", f"{period}_barcolor"]], left_on="symbol", right_index=True, how="left")[columnOrder]
569
578
  self.positiondfStyle= self.positiondfrenderer.render_html(self.positiondf2)
@@ -578,6 +587,7 @@ class BitunixSignal:
578
587
  # Assign to self.signaldf for HTML rendering
579
588
  self.signaldf = self.signaldf_filtered[[
580
589
  "symbol", f"{period}_trend",f"{period}_cb", f"{period}_barcolor",
590
+ f"{period}_bos",
581
591
  f"{period}_ema_open", f"{period}_ema_close", f"{period}_macd", f"{period}_bbm", f"{period}_rsi", f"{period}_trendline",f"{period}_adx",f"{period}_candle_trend",
582
592
  'lastcolor', 'bidcolor', 'askcolor', 'bid', 'last', 'ask',
583
593
  f"{period}_open", f"{period}_close", f"{period}_high", f"{period}_low",
@@ -640,7 +650,7 @@ class BitunixSignal:
640
650
  #open position upto a max of max_auto_trades from the signal list
641
651
  df=self.signaldf.copy(deep=False)
642
652
  for index, row in df.iterrows():
643
- side = "BUY" if row[f'{period}_barcolor'] == self.green else "SELL" if row[f'{period}_barcolor'] == self.red else ""
653
+ 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 ""
644
654
  if side != "":
645
655
  select = True
646
656
  self.pendingPositions = await self.bitunixApi.GetPendingPositionData({'symbol': row.symbol})
@@ -945,8 +955,8 @@ class BitunixSignal:
945
955
  continue
946
956
 
947
957
  # candle reversed
948
- if self.settings.CANDLE_TREND_STUDY and self.settings.CANDLE_TREND_CHECK_ON_CLOSE:
949
- if row.side == 'BUY' and self.signaldf_full.at[row.symbol, f'{period}_barcolor'] == self.red and self.signaldf_full.at[row.symbol, f'{period}_candle_trend'] == "BEARISH":
958
+ if self.settings.CANDLE_TREND_STUDY and self.settings.CANDLE_TREND_REVERSAL_CHECK_ON_CLOSE:
959
+ if row.side == 'BUY' and self.signaldf_full.at[row.symbol, f'{period}_barcolor'] == self.red and self.signaldf_full.at[row.symbol, f'{period}_cb'] > 1 and self.signaldf_full.at[row.symbol, f'{period}_candle_trend'] == "BULLISH":
950
960
  last, bid, ask, mtv = await self.GetTickerBidLastAsk(row.symbol)
951
961
  price = (ask if row['side'] == "BUY" else bid if row['side'] == "SELL" else last) if bid<=last<=ask else last
952
962
 
@@ -963,7 +973,7 @@ class BitunixSignal:
963
973
  )
964
974
  continue
965
975
 
966
- if row.side == 'SELL' and self.signaldf_full.at[row.symbol, f'{period}_barcolor'] == self.green and self.signaldf_full.at[row.symbol, f'{period}_candle_trend'] == "BULLISH":
976
+ if row.side == 'SELL' and self.signaldf_full.at[row.symbol, f'{period}_barcolor'] == self.green and self.signaldf_full.at[row.symbol, f'{period}_cb'] > 1 and self.signaldf_full.at[row.symbol, f'{period}_candle_trend'] == "BULLISH":
967
977
  last, bid, ask, mtv = await self.GetTickerBidLastAsk(row.symbol)
968
978
  price = (ask if row['side'] == "BUY" else bid if row['side'] == "SELL" else last) if bid<=last<=ask else last
969
979
 
@@ -982,7 +992,7 @@ class BitunixSignal:
982
992
 
983
993
  await asyncio.sleep(0)
984
994
 
985
- self.lastAutoTradeTime = time.time()
995
+ self.lastAutoTradeTime = time.time()
986
996
  except Exception as e:
987
997
  stack = traceback.extract_stack()
988
998
  function_name = stack[-1].name
@@ -63,6 +63,20 @@ class Interval:
63
63
  # Get the last color and its consecutive count
64
64
  self.signal_strength = df['Consecutive'].iloc[-1]
65
65
 
66
+ # Break of Strcuture
67
+ if self.settings.BOS_STUDY:
68
+ high = df.iloc[:-1]['high'].max()
69
+ low = df.iloc[:-1]['low'].min()
70
+ close = df['close'].iloc[-1]
71
+ if close > high:
72
+ self.bos_signal = "BUY"
73
+ elif close < low:
74
+ self.bos_signal = "SELL"
75
+ else:
76
+ self.bos_signal = "HOLD"
77
+ else:
78
+ self.bos_signal = "HOLD"
79
+
66
80
  # Calculate the Moving Averages
67
81
  if self.settings.EMA_STUDY:
68
82
  df['ma_fast'] = talib.EMA(df['close'], timeperiod=self.settings.MA_FAST)
@@ -116,6 +130,14 @@ class Interval:
116
130
  else:
117
131
  self.ema_open_signal = "HOLD"
118
132
  self.ema_close_signal = "HOLD"
133
+
134
+ if self.settings.EMA_CLOSE_ON_FAST_MEDIUM:
135
+ if df['close'].iloc[-1] > df['ma_fast'].iloc[-1] and df['ma_fast'].iloc[-1] > df['ma_medium'].iloc[-1]:
136
+ self.ema_close_signal = "BUY"
137
+ elif df['close'].iloc[-1] < df['ma_fast'].iloc[-1] and df['ma_fast'].iloc[-1] < df['ma_medium'].iloc[-1]:
138
+ self.ema_close_signal = "SELL"
139
+ else:
140
+ self.ema_close_signal = "HOLD"
119
141
  else:
120
142
  # Drop EMA columns if not used
121
143
  df.drop(['ma_fast', 'ma_medium', 'ma_slow', 'ma_slope', 'ma_angle'], axis=1, inplace=True, errors='ignore')
@@ -233,16 +255,20 @@ class Interval:
233
255
  df.fillna({'support_line':0}, inplace=True)
234
256
  df.fillna({'resistance_line':0}, inplace=True)
235
257
  if df is not None and len(df) >= 2:
236
- if df['high'].iloc[-3] >= df['support_line'].iloc[-3] and df['close'].iloc[-2] < df['support_line'].iloc[-2] and df['close'].iloc[-1] < df['open'].iloc[-1]:
237
- self.trendline_signal = "SELL"
238
- elif df['low'].iloc[-3] <= df['resistance_line'].iloc[-3] and df['close'].iloc[-2] > df['resistance_line'].iloc[-2] and df['close'].iloc[-1] > df['open'].iloc[-1]:
239
- self.trendline_signal = "BUY"
240
- elif df['close'].iloc[-3] > df['support_line'].iloc[-3] and df['close'].iloc[-2] > df['support_line'].iloc[-2] and df['close'].iloc[-1] > df['open'].iloc[-1]:
241
- self.trendline_signal = "BUY"
242
- elif df['close'].iloc[-3] < df['resistance_line'].iloc[-3] and df['close'].iloc[-2] < df['resistance_line'].iloc[-2] and df['close'].iloc[-1] < df['open'].iloc[-1]:
243
- self.trendline_signal = "SELL"
258
+ if self.settings.TRENDLINE_BREAKOUT:
259
+ if df['close'].iloc[-2] > df['support_line'].iloc[-2] and df['open'].iloc[-1] > df['support_line'].iloc[-1] and df['close'].iloc[-1] > df['open'].iloc[-1]:
260
+ self.trendline_signal = "BUY"
261
+ elif df['close'].iloc[-2] < df['resistance_line'].iloc[-2] and df['open'].iloc[-1] < df['resistance_line'].iloc[-1] and df['close'].iloc[-1] < df['open'].iloc[-1]:
262
+ self.trendline_signal = "SELL"
263
+ else:
264
+ self.trendline_signal = "HOLD"
244
265
  else:
245
- self.trendline_signal = "HOLD"
266
+ if df['high'].iloc[-3] >= df['support_line'].iloc[-3] and df['close'].iloc[-2] < df['support_line'].iloc[-2] and df['close'].iloc[-1] < df['open'].iloc[-1]:
267
+ self.trendline_signal = "SELL"
268
+ elif df['low'].iloc[-3] <= df['resistance_line'].iloc[-3] and df['close'].iloc[-2] > df['resistance_line'].iloc[-2] and df['close'].iloc[-1] > df['open'].iloc[-1]:
269
+ self.trendline_signal = "BUY"
270
+ else:
271
+ self.trendline_signal = "HOLD"
246
272
 
247
273
  # Calculate the ADX
248
274
  if self.settings.ADX_STUDY:
@@ -288,6 +314,7 @@ class Interval:
288
314
 
289
315
  # Check for BUY signal
290
316
  buy_conditions = (
317
+ (self.settings.BOS_STUDY and self.bos_signal == "BUY") or
291
318
  (self.settings.EMA_STUDY and self.settings.EMA_CHECK_ON_OPEN and self.ema_open_signal == "BUY") or
292
319
  (self.settings.MACD_STUDY and self.settings.MACD_CHECK_ON_OPEN and self.macd_signal == "BUY") or
293
320
  (self.settings.BBM_STUDY and self.settings.BBM_CHECK_ON_OPEN and self.bbm_signal == "BUY") or
@@ -301,6 +328,7 @@ class Interval:
301
328
 
302
329
  # Check for SELL signal
303
330
  sell_conditions = (
331
+ (self.settings.BOS_STUDY and self.bos_signal == "SELL") or
304
332
  (self.settings.EMA_STUDY and self.settings.EMA_CHECK_ON_OPEN and self.ema_open_signal == "SELL") or
305
333
  (self.settings.MACD_STUDY and self.settings.MACD_CHECK_ON_OPEN and self.macd_signal == "SELL") or
306
334
  (self.settings.BBM_STUDY and self.settings.BBM_CHECK_ON_OPEN and self.bbm_signal == "SELL") or
@@ -320,17 +348,34 @@ class Interval:
320
348
  else:
321
349
  self.current_signal = "HOLD"
322
350
  else:
323
- # If EMA is enabled and crossing and MACD is enabled and crossing and BBM is enabled and crossing and RSI is enbabled and crossing
324
- # and
325
- # ADX is enabled and strong and candle trend is enabled and bullish
326
- # then BUY or SELL
327
351
  buy_conditions = (
328
- (not self.settings.EMA_STUDY or not self.settings.EMA_CHECK_ON_OPEN or self.ema_open_signal == "BUY") and
329
- (not self.settings.MACD_STUDY or not self.settings.MACD_CHECK_ON_OPEN or self.macd_signal == "BUY") and
330
- (not self.settings.BBM_STUDY or not self.settings.BBM_CHECK_ON_OPEN or self.bbm_signal == "BUY") and
331
- (not self.settings.RSI_STUDY or not self.settings.RSI_CHECK_ON_OPEN or self.rsi_signal == "BUY") and
332
- (not self.settings.TRENDLINE_STUDY or not self.settings.TRENDLINE_CHECK_ON_OPEN or self.trendline_signal == "BUY")
352
+ (self.settings.BOS_STUDY and self.bos_signal == "BUY")
353
+ or not self.settings.BOS_STUDY
354
+ ) and (
355
+ (self.settings.EMA_STUDY and self.settings.EMA_CHECK_ON_OPEN and self.ema_open_signal == "BUY")
356
+ or not self.settings.EMA_STUDY or not self.settings.EMA_CHECK_ON_OPEN
357
+ ) and (
358
+ (self.settings.MACD_STUDY and self.settings.MACD_CHECK_ON_OPEN and self.macd_signal == "BUY")
359
+ or not self.settings.MACD_STUDY or not self.settings.MACD_CHECK_ON_OPEN
360
+ ) and (
361
+ (self.settings.BBM_STUDY and self.settings.BBM_CHECK_ON_OPEN and self.bbm_signal == "BUY")
362
+ or not self.settings.BBM_STUDY or not self.settings.BBM_CHECK_ON_OPEN
363
+ ) and (
364
+ (self.settings.RSI_STUDY and self.settings.RSI_CHECK_ON_OPEN and self.rsi_signal == "BUY")
365
+ or not self.settings.RSI_STUDY or not self.settings.RSI_CHECK_ON_OPEN
366
+ ) and (
367
+ (self.settings.TRENDLINE_STUDY and self.settings.TRENDLINE_CHECK_ON_OPEN and self.trendline_signal == "BUY")
368
+ or not self.settings.TRENDLINE_STUDY or not self.settings.TRENDLINE_CHECK_ON_OPEN
333
369
  )
370
+ if not any([
371
+ self.settings.EMA_STUDY, self.settings.MACD_STUDY, self.settings.BBM_STUDY,
372
+ self.settings.RSI_STUDY, self.settings.TRENDLINE_STUDY
373
+ ]) and not any([
374
+ self.settings.EMA_CHECK_ON_OPEN, self.settings.MACD_CHECK_ON_OPEN, self.settings.BBM_CHECK_ON_OPEN,
375
+ self.settings.RSI_CHECK_ON_OPEN, self.settings.TRENDLINE_CHECK_ON_OPEN
376
+ ]):
377
+ buy_conditions = False
378
+
334
379
  additional_buy_conditions = (
335
380
  (not self.settings.ADX_STUDY or not self.settings.ADX_CHECK_ON_OPEN or self.adx_signal == "STRONG") and
336
381
  (not self.settings.CANDLE_TREND_STUDY or not self.settings.CANDLE_TREND_CHECK_ON_OPEN or self.candle_trend == "BULLISH")
@@ -338,15 +383,36 @@ class Interval:
338
383
 
339
384
  # Check for SELL signal
340
385
  sell_conditions = (
341
- (not self.settings.EMA_STUDY or not self.settings.EMA_CHECK_ON_OPEN or self.ema_open_signal == "SELL") and
342
- (not self.settings.MACD_STUDY or not self.settings.MACD_CHECK_ON_OPEN or self.macd_signal == "SELL") and
343
- (not self.settings.BBM_STUDY or not self.settings.BBM_CHECK_ON_OPEN or self.bbm_signal == "SELL") and
344
- (not self.settings.RSI_STUDY or not self.settings.RSI_CHECK_ON_OPEN or self.rsi_signal == "SELL") and
345
- (not self.settings.TRENDLINE_STUDY or not self.settings.TRENDLINE_CHECK_ON_OPEN or self.trendline_signal == "SELL")
386
+ (self.settings.BOS_STUDY and self.bos_signal == "SELL")
387
+ or not self.settings.BOS_STUDY
388
+ ) and (
389
+ (self.settings.EMA_STUDY and self.settings.EMA_CHECK_ON_OPEN and self.ema_open_signal == "SELL")
390
+ or not self.settings.EMA_STUDY or not self.settings.EMA_CHECK_ON_OPEN
391
+ ) and (
392
+ (self.settings.MACD_STUDY and self.settings.MACD_CHECK_ON_OPEN and self.macd_signal == "SELL")
393
+ or not self.settings.MACD_STUDY or not self.settings.MACD_CHECK_ON_OPEN
394
+ ) and (
395
+ (self.settings.BBM_STUDY and self.settings.BBM_CHECK_ON_OPEN and self.bbm_signal == "SELL")
396
+ or not self.settings.BBM_STUDY or not self.settings.BBM_CHECK_ON_OPEN
397
+ ) and (
398
+ (self.settings.RSI_STUDY and self.settings.RSI_CHECK_ON_OPEN and self.rsi_signal == "SELL")
399
+ or not self.settings.RSI_STUDY or not self.settings.RSI_CHECK_ON_OPEN
400
+ ) and (
401
+ (self.settings.TRENDLINE_STUDY and self.settings.TRENDLINE_CHECK_ON_OPEN and self.trendline_signal == "SELL")
402
+ or not self.settings.TRENDLINE_STUDY or not self.settings.TRENDLINE_CHECK_ON_OPEN
346
403
  )
404
+ if not any([
405
+ self.settings.EMA_STUDY, self.settings.MACD_STUDY, self.settings.BBM_STUDY,
406
+ self.settings.RSI_STUDY, self.settings.TRENDLINE_STUDY
407
+ ]) and not any([
408
+ self.settings.EMA_CHECK_ON_OPEN, self.settings.MACD_CHECK_ON_OPEN, self.settings.BBM_CHECK_ON_OPEN,
409
+ self.settings.RSI_CHECK_ON_OPEN, self.settings.TRENDLINE_CHECK_ON_OPEN
410
+ ]):
411
+ sell_conditions = False
412
+
347
413
  additional_sell_conditions = (
348
- (not self.settings.ADX_STUDY or not self.settings.ADX_CHECK_ON_OPEN or self.adx_signal == "STRONG") and
349
- (not self.settings.CANDLE_TREND_STUDY or not self.settings.CANDLE_TREND_CHECK_ON_OPEN or self.candle_trend == "BEARISH")
414
+ (self.settings.ADX_STUDY and self.settings.ADX_CHECK_ON_OPEN and self.adx_signal == "STRONG") or
415
+ (self.settings.CANDLE_TREND_STUDY and self.settings.CANDLE_TREND_CHECK_ON_OPEN or self.candle_trend == "BEARISH")
350
416
  )
351
417
 
352
418
  # Determine current signal
@@ -623,6 +689,7 @@ class Tickers:
623
689
  if not interval._data is None and len(interval._data) >= self.settings.BARS:
624
690
  args[0].get_interval_ticks(intervalId)._data = interval._data
625
691
  args[0].get_interval_ticks(intervalId).current_signal = interval.current_signal
692
+ args[0].get_interval_ticks(intervalId).bos_signal = interval.bos_signal
626
693
  args[0].get_interval_ticks(intervalId).ema_open_signal = interval.ema_open_signal
627
694
  args[0].get_interval_ticks(intervalId).ema_close_signal = interval.ema_close_signal
628
695
  args[0].get_interval_ticks(intervalId).macd_signal = interval.macd_signal
@@ -660,6 +727,8 @@ class Tickers:
660
727
  f"{period}_trend": intervalObj.current_signal,
661
728
  f"{period}_cb": intervalObj.signal_strength,
662
729
  f"{period}_barcolor": lastcandle['barcolor'],
730
+ f"{period}_bos": intervalObj.bos_signal,
731
+ f"{period}_ema_open": intervalObj.ema_open_signal,
663
732
  f"{period}_ema_open": intervalObj.ema_open_signal,
664
733
  f"{period}_ema_close": intervalObj.ema_close_signal,
665
734
  f"{period}_macd":intervalObj.macd_signal,
@@ -687,6 +756,7 @@ class Tickers:
687
756
  'lastcolor': "", 'bidcolor': "", 'askcolor': "", 'bid': 0.0, 'ask': 0.0, 'last': 0.0,
688
757
  f"{period}_cb":0, f"{period}_barcolor": "", f"{period}_trend": "",
689
758
  f"{period}_open": 0.0, f"{period}_close": 0.0, f"{period}_high": 0.0, f"{period}_low": 0.0,
759
+ f"{period}_bos": "",
690
760
  f"{period}_ema": "", f"{period}_macd": "", f"{period}_bbm": "", f"{period}_rsi": "", f"{period}_trendline": "", f"{period}_candle_trend": "", f"{period}_adx": ""
691
761
  }
692
762
  df.fillna(fill_values, inplace=True)
@@ -6,11 +6,14 @@ import sqlite3
6
6
  class Settings(BaseSettings):
7
7
  # Start autotrading on start
8
8
  AUTOTRADE: bool = Field(default=False)
9
+
10
+ #Ticker list
11
+ TICKERS:str = Field(default="")
12
+ THRESHOLD: float = Field(default=5.0, ge=0.0)
13
+ MIN_VOLUME: int = Field(default=10_000_000, ge=0)
9
14
 
10
15
  # Trading Parameters
11
16
  LEVERAGE: int = Field(default=20, ge=1, le=100)
12
- THRESHOLD: float = Field(default=5.0, ge=0.0)
13
- MIN_VOLUME: int = Field(default=10_000_000, ge=0)
14
17
  ORDER_AMOUNT_PERCENTAGE: float = Field(default=0.01, ge=0.0, le=100)
15
18
  MAX_AUTO_TRADES: int = Field(default=10, ge=0)
16
19
  PROFIT_AMOUNT: float = Field(default=0.25, ge=0.0)
@@ -34,6 +37,7 @@ class Settings(BaseSettings):
34
37
  # Technical Indicators
35
38
  OPEN_ON_ANY_SIGNAL: bool = Field(default=True)
36
39
 
40
+ BOS_STUDY: bool = Field(default=True)
37
41
  EMA_CHART: bool = Field(default=True)
38
42
  EMA_STUDY: bool = Field(default=True)
39
43
  EMA_CROSSING: bool = Field(default=False)
@@ -59,10 +63,10 @@ class Settings(BaseSettings):
59
63
  RSI_CHECK_ON_OPEN: bool = Field(default=False)
60
64
  RSI_CHECK_ON_CLOSE: bool = Field(default=False)
61
65
 
66
+ TRENDLINE_PEAK_DISTANCE: int = Field(default=1, ge=0, le=30)
62
67
  TRENDLINE_CHART: bool = Field(default=True)
63
68
  TRENDLINE_STUDY: bool = Field(default=True)
64
- TRENDLINE_PEAK_DISTANCE: int = Field(default=1, ge=0, le=30)
65
- TRENDLINE_LOOKBACK: int = Field(default=20, ge=10, le=200)
69
+ TRENDLINE_BREAKOUT: bool = Field(default=False)
66
70
  TRENDLINE_CHECK_ON_OPEN: bool = Field(default=False)
67
71
  TRENDLINE_CHECK_ON_CLOSE: bool = Field(default=False)
68
72
 
@@ -72,7 +76,7 @@ class Settings(BaseSettings):
72
76
 
73
77
  CANDLE_TREND_STUDY: bool = Field(default=True)
74
78
  CANDLE_TREND_CHECK_ON_OPEN: bool = Field(default=False)
75
- CANDLE_TREND_CHECK_ON_CLOSE: bool = Field(default=False)
79
+ CANDLE_TREND_REVERSAL_CHECK_ON_CLOSE: bool = Field(default=False)
76
80
 
77
81
  # Time Intervals
78
82
  SCREEN_REFRESH_INTERVAL: int = Field(default=1, ge=1)
@@ -101,6 +105,7 @@ class Settings(BaseSettings):
101
105
  # Specify the file name for loading environment variables
102
106
  env_file = os.path.dirname(os.path.abspath(__file__))+"/config.txt"
103
107
 
108
+
104
109
  @classmethod
105
110
  def load_from_db(cls, db_path: str, table_name: str = "settings"):
106
111
  # Connect to SQLite database
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bitunix_automated_crypto_trading
3
- Version: 3.1.5
3
+ Version: 3.1.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,18 +1,18 @@
1
1
  bitunix_automated_crypto_trading/AsyncThreadRunner.py,sha256=LJ6ny1KSCVoIbfeNypsY4aHYcbkGME9M3epQ9e8B1O8,3224
2
2
  bitunix_automated_crypto_trading/BitunixApi.py,sha256=W0uem1wIs1uM-jaGtXXzL_JQfnCDb7imyTZ2Tqjk8e8,11230
3
- bitunix_automated_crypto_trading/BitunixSignal.py,sha256=TOseCeTNpCwVcReXRvHoq1sQybhoiIkFvATbu05wQ8c,67215
3
+ bitunix_automated_crypto_trading/BitunixSignal.py,sha256=JIJumU3nYcO_NRS5xMqrPeisMIiy_TM0EOEA5nr44cQ,67993
4
4
  bitunix_automated_crypto_trading/BitunixWebSocket.py,sha256=mbuvk8UFWKgv4KLV07TgLgxLVTRJnOKuf02mLB-VoCY,11143
5
5
  bitunix_automated_crypto_trading/DataFrameHtmlRenderer.py,sha256=Pqdzhh_nfIxFEZH9L_R5QXB8moDPbgeTGT_hmBkHWMg,2899
6
6
  bitunix_automated_crypto_trading/NotificationManager.py,sha256=pqDquEe-oujD2v8B543524vo62aRMjfB4YW-3DMhVGQ,795
7
7
  bitunix_automated_crypto_trading/SupportResistance.py,sha256=Dx4uBC4On-GO1t2EFk02jzSmZzaMD48mUJI9rG2rgMo,4946
8
8
  bitunix_automated_crypto_trading/ThreadManager.py,sha256=WmYRQu8aNrgp5HwSqpBqX1WESNSEpbD2CznPFpd9HuI,2330
9
- bitunix_automated_crypto_trading/TickerManager.py,sha256=JTlXUL9GadRjloK6Gw2HhacjvIe31CiiIFl1KGkWztA,37444
9
+ bitunix_automated_crypto_trading/TickerManager.py,sha256=n2GyvfH2YMuZ31Q_IcLd4U3ZOEIOLhLwMIR8iI5Gp5A,41460
10
10
  bitunix_automated_crypto_trading/__init__.py,sha256=1hzk6nX8NnUCr1tsq8oFq1qGCNhNwnwldWE75641Eew,78
11
11
  bitunix_automated_crypto_trading/bitunix.py,sha256=Zyrf8P-xi7DJogX_bcc6uDW66J7FAxdS-0jbuHRPFfM,25845
12
- bitunix_automated_crypto_trading/config.py,sha256=zeNmV1KK8Yv5cHzBxaly0lmcjwSZEBAMUm_OvFSBCK4,4922
12
+ bitunix_automated_crypto_trading/config.py,sha256=aBBHdkMnw4ODzcwQl1CCx_r1O08hShDRGlSA6JXt5lg,5024
13
13
  bitunix_automated_crypto_trading/logger.py,sha256=tAaTQcv5r--zupk_Fhfe1USfBAzSiXzVa4QRnaOFIFY,2933
14
- bitunix_automated_crypto_trading-3.1.5.dist-info/METADATA,sha256=YJdYd5cjlCI7XA-Ef9WMVDCnblI22sSxyX--HmMcK-Q,996
15
- bitunix_automated_crypto_trading-3.1.5.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
16
- bitunix_automated_crypto_trading-3.1.5.dist-info/entry_points.txt,sha256=UXREYHuSl2XYd_tOtLIq0zg3d1kX3lixX5SpN8yGBw4,82
17
- bitunix_automated_crypto_trading-3.1.5.dist-info/top_level.txt,sha256=uyFzHUCOsp8elnG2Ovor6xXcf7dxRxY-C-Txiwix64Q,33
18
- bitunix_automated_crypto_trading-3.1.5.dist-info/RECORD,,
14
+ bitunix_automated_crypto_trading-3.1.6.dist-info/METADATA,sha256=CzoCXqOg2hhZOrZZ9UMEnC3ohtqNrWEi6xT17G7pjq0,996
15
+ bitunix_automated_crypto_trading-3.1.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
16
+ bitunix_automated_crypto_trading-3.1.6.dist-info/entry_points.txt,sha256=UXREYHuSl2XYd_tOtLIq0zg3d1kX3lixX5SpN8yGBw4,82
17
+ bitunix_automated_crypto_trading-3.1.6.dist-info/top_level.txt,sha256=uyFzHUCOsp8elnG2Ovor6xXcf7dxRxY-C-Txiwix64Q,33
18
+ bitunix_automated_crypto_trading-3.1.6.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.1)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5