Empty5m.py Hyperopt
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓ ┃ Strategy ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDC ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ Drawdown ┃ ┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩ │ Empty5m │ 13 │ 0.36 │ 44.066 │ 4.41 │ 5:58:00 │ 12 0 1 92.3 │ 36.632 USDC 3.39% │ └──────────┴────────┴──────────────┴─────────────────┴──────────────┴──────────────┴────────────────────────┴────────────────────┘
This commit is contained in:
32
Empty5m.json
32
Empty5m.json
@@ -14,33 +14,19 @@
|
||||
"trailing_only_offset_is_reached": false
|
||||
},
|
||||
"max_open_trades": {
|
||||
"max_open_trades": 1
|
||||
},
|
||||
"buy": {
|
||||
"buy_longue_derive": "sma60_deriv1_1h",
|
||||
"buy_deriv1_sma12d": 0.0002,
|
||||
"buy_deriv1_sma5d": -0.0006,
|
||||
"buy_deriv1_sma60": -0.0003,
|
||||
"buy_longue": 180,
|
||||
"start_bear_deriv1": 0.005,
|
||||
"start_bear_deriv2": -0.003,
|
||||
"start_bear_indicator": "sma60",
|
||||
"start_bull_deriv1": -0.001,
|
||||
"start_bull_deriv2": 0.0,
|
||||
"start_bull_indicator": "sma12"
|
||||
},
|
||||
"protection": {
|
||||
"drop_from_last_entry": -0.03,
|
||||
"mises_bear": 5,
|
||||
"mises_bull": 1
|
||||
"max_open_trades": 20
|
||||
},
|
||||
"sell": {
|
||||
"b30_indicateur": "sma24",
|
||||
"baisse": 0.14,
|
||||
"sell_force_sell": -0.135,
|
||||
"sell_indicator": "sma12"
|
||||
"baisse": 0.2,
|
||||
"sell_force_sell": -0.121,
|
||||
"sell_indicator": "sma36"
|
||||
},
|
||||
"protection": {
|
||||
"drop_from_last_entry": 0.0,
|
||||
"mises_bull": 4
|
||||
}
|
||||
},
|
||||
"ft_stratparam_v": 1,
|
||||
"export_time": "2026-03-07 14:31:15.874478+00:00"
|
||||
"export_time": "2026-03-07 20:20:17.895644+00:00"
|
||||
}
|
||||
167
Empty5m.py
167
Empty5m.py
@@ -187,24 +187,24 @@ class Empty5m(IStrategy):
|
||||
}
|
||||
}
|
||||
|
||||
start_bull_indicator = CategoricalParameter(sma_indicators_d, default='sma100', space='buy', optimize=True, load=True)
|
||||
start_bull_deriv1 = DecimalParameter(-0.0005, 0.0005, decimals=3, default=0, space='buy', optimize=True, load=True)
|
||||
start_bull_deriv2 = DecimalParameter(-0.0005, 0.0005, decimals=3, default=0, space='buy', optimize=True, load=True)
|
||||
# start_bull_indicator = CategoricalParameter(sma_indicators_d, default='sma100', space='buy', optimize=True, load=True)
|
||||
# start_bull_deriv1 = DecimalParameter(-0.005, 0.005, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
# start_bull_deriv2 = DecimalParameter(-0.005, 0.005, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
|
||||
start_bear_indicator = CategoricalParameter(sma_indicators_d, default='sma100', space='buy', optimize=True, load=True)
|
||||
start_bear_deriv1 = DecimalParameter(-0.005, 0.005, decimals=3, default=0, space='buy', optimize=True, load=True)
|
||||
start_bear_deriv2 = DecimalParameter(-0.005, 0.005, decimals=3, default=0, space='buy', optimize=True, load=True)
|
||||
# start_bear_indicator = CategoricalParameter(sma_indicators_d, default='sma100', space='buy', optimize=True, load=True)
|
||||
# start_bear_deriv1 = DecimalParameter(-0.005, 0.005, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
# start_bear_deriv2 = DecimalParameter(-0.005, 0.005, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
|
||||
buy_deriv1_sma60 = DecimalParameter(-0.0005, 0.0005, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
buy_deriv1_sma5d = DecimalParameter(-0.0007, 0.0007, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
buy_deriv1_sma12d = DecimalParameter(-0.0007, 0.0007, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
# buy_deriv1_sma60 = DecimalParameter(-0.005, 0.005, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
# buy_deriv1_sma5d = DecimalParameter(-0.007, 0.007, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
# buy_deriv1_sma12d = DecimalParameter(-0.007, 0.007, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
|
||||
# buy_deriv2_sma60 = DecimalParameter(-0.0005, 0.0005, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
# buy_deriv2_sma5d = DecimalParameter(-0.0007, 0.0007, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
# buy_deriv2_sma12d = DecimalParameter(-0.0007, 0.0007, decimals=4, default=0, space='buy', optimize=True, load=True)
|
||||
|
||||
buy_longue = CategoricalParameter(long_timeperiods, default=120, space='buy', optimize=True, load=True)
|
||||
buy_longue_derive = CategoricalParameter(sma_deriv1_indicators, default="sma60_deriv1_1h", space='buy', optimize=False, load=True)
|
||||
# buy_longue = CategoricalParameter(long_timeperiods, default=120, space='buy', optimize=True, load=True)
|
||||
# buy_longue_derive = CategoricalParameter(sma_deriv1_indicators, default="sma60_deriv1_1h", space='buy', optimize=False, load=True)
|
||||
|
||||
# sell_score_indicator = CategoricalParameter(score_indicators, default="sma24_score", space='sell')
|
||||
|
||||
@@ -216,16 +216,14 @@ class Empty5m(IStrategy):
|
||||
# baisses = list()
|
||||
# for i in range(0, 0.5, 0.05):
|
||||
# baisses.append(i)
|
||||
mises_bear = IntParameter(1, 10, default=1, space='protection')
|
||||
# mises_bear = IntParameter(1, 10, default=1, space='protection')
|
||||
mises_bull = IntParameter(1, 10, default=1, space='protection')
|
||||
baisse = DecimalParameter(0.1, 0.5, decimals=2, default=0.3, space='protection', optimize=True, load=True)
|
||||
b30_indicateur = CategoricalParameter(sma_indicators, default="sma36", space='protection', optimize=True, load=True)
|
||||
|
||||
sell_force_sell = DecimalParameter(-0.2, 0, decimals=3, default=-0.02, space='sell')
|
||||
sell_indicator = CategoricalParameter(sma_indicators, default="sma36", space='sell', optimize=True, load=True)
|
||||
|
||||
baisse = DecimalParameter(0.1, 0.5, decimals=2, default=0.3, space='sell', optimize=True, load=True)
|
||||
b30_indicateur = CategoricalParameter(sma_indicators_h, default="sma36", space='sell', optimize=True, load=True)
|
||||
b30_indicateur = CategoricalParameter(sma_indicators, default="sma36", space='sell', optimize=True, load=True)
|
||||
|
||||
# lost_indicator = CategoricalParameter(sma_deriv1_indicators, default="sma5_deriv1", space='protection')
|
||||
|
||||
@@ -258,10 +256,10 @@ class Empty5m(IStrategy):
|
||||
# sl_max = self.wallets.get_available_stake_amount() / 2
|
||||
#
|
||||
# amount = sl_min + (1 - range_pos) * (sl_max - sl_min)
|
||||
if last_candle['enter_tag'] in ['fall', 'bear', 'Force', 'Range-']:
|
||||
amount = self.wallets.get_available_stake_amount() / self.mises_bear.value
|
||||
else:
|
||||
amount = self.wallets.get_available_stake_amount() / self.mises_bull.value # / (2 * self.pairs[pair]['count_of_lost'] + 1)
|
||||
# if last_candle['enter_tag'] in ['fall', 'bear', 'Force', 'Range-']:
|
||||
# amount = self.wallets.get_available_stake_amount() / self.mises_bear.value
|
||||
# else:
|
||||
amount = self.wallets.get_available_stake_amount() / self.mises_bull.value # / (2 * self.pairs[pair]['count_of_lost'] + 1)
|
||||
|
||||
# factor = 1
|
||||
#
|
||||
@@ -334,7 +332,7 @@ class Empty5m(IStrategy):
|
||||
# stake_amount = trade.stake_amount
|
||||
self.pairs[trade.pair]['last_buy'] = current_rate
|
||||
self.pairs[trade.pair]['total_amount'] += stake_amount
|
||||
print(f"adjust {pair} drop={drop_from_last_entry} {current_time} dispo={dispo} amount={stake_amount} rate={current_rate}")
|
||||
# print(f"adjust {pair} drop={drop_from_last_entry} {current_time} dispo={dispo} amount={stake_amount} rate={current_rate}")
|
||||
# print(f"adjust {pair} {current_time} dispo={dispo} amount={stake_amount} rate={current_rate}")
|
||||
|
||||
trade_type = last_candle['enter_tag'] if last_candle['enter_long'] == 1 else 'pct48'
|
||||
@@ -566,12 +564,16 @@ class Empty5m(IStrategy):
|
||||
self.pairs[pair]['force_sell'] = True
|
||||
return 'sma'
|
||||
|
||||
if profit > max(5, expected_profit) and \
|
||||
if profit > 0 and \
|
||||
(baisse > self.baisse.value and last_candle[f"close"] <= last_candle[self.b30_indicateur.value]) \
|
||||
and last_candle['hapercent'] <0 :
|
||||
self.pairs[pair]['force_sell'] = True
|
||||
return 'B30'
|
||||
|
||||
# if profit > 0 and baisse > 0.5 and last_candle['hapercent'] <0 and last_candle[f"close"] <= last_candle['sma12']:
|
||||
# self.pairs[pair]['force_sell'] = True
|
||||
# return 'B50'
|
||||
|
||||
if current_profit > - self.sell_force_sell.value and last_candle['has_cross_sma3_1h'] == 1:
|
||||
self.pairs[pair]['force_sell'] = True
|
||||
return 'Cross'
|
||||
@@ -676,9 +678,28 @@ class Empty5m(IStrategy):
|
||||
dataframe[f'min{timeperiod}'] = talib.MIN(dataframe['close'], timeperiod=timeperiod)
|
||||
dataframe[f"percent{timeperiod}"] = dataframe['close'].pct_change(timeperiod)
|
||||
dataframe[f"sma{timeperiod}"] = dataframe['mid'].ewm(span=timeperiod, adjust=False).mean()
|
||||
# dataframe[f"high{timeperiod}"] = dataframe['high'].ewm(span=timeperiod, adjust=False).mean()
|
||||
# dataframe[f"low{timeperiod}"] = dataframe['low'].ewm(span=timeperiod, adjust=False).mean()
|
||||
# dataframe = self.calculateRegression(dataframe, column=f"high{timeperiod}", window=10, degree=1, future_offset=12)
|
||||
# dataframe = self.calculateRegression(dataframe, column=f"low{timeperiod}", window=10, degree=1, future_offset=12)
|
||||
|
||||
self.calculeDerivees(dataframe, f"sma{timeperiod}", timeframe=self.timeframe, ema_period=timeperiod)
|
||||
|
||||
dataframe = self.calculateRegression(dataframe, column='mid', window=30, degree=1, future_offset=12)
|
||||
dataframe = self.calculateRegression(dataframe, column='sma24', window=30, degree=1, future_offset=12)
|
||||
|
||||
dataframe["percent"] = dataframe["mid"].pct_change(1)
|
||||
dataframe["percent3"] = dataframe["mid"].pct_change(3)
|
||||
|
||||
dataframe["volume_mean"] = dataframe["volume"].rolling(20).mean()
|
||||
dataframe["volume_ratio"] = dataframe["volume"] / dataframe["volume_mean"]
|
||||
|
||||
dataframe["market_state"] = 0
|
||||
|
||||
dataframe.loc[dataframe["percent"] < -0.005, "market_state"] = -1
|
||||
dataframe.loc[(dataframe["percent3"] < -0.015) & (dataframe["volume_ratio"] > 2), "market_state"] = -2
|
||||
dataframe.loc[(dataframe["percent"] > 0.003) & (dataframe["volume_ratio"] > 1.5), "market_state"] = 1
|
||||
dataframe["velocity"] = dataframe["percent"] - dataframe["percent3"]
|
||||
|
||||
# ######################################################################################################
|
||||
################### INFORMATIVE 1h
|
||||
@@ -698,6 +719,7 @@ class Empty5m(IStrategy):
|
||||
self.calculeDerivees(informative, f"sma{timeperiod}", timeframe=self.timeframe, ema_period=timeperiod)
|
||||
|
||||
informative = self.calculateRegression(informative, column='sma3', window=10, degree=1, future_offset=12)
|
||||
informative = self.calculateRegression(informative, column='low', window=10, degree=1, future_offset=12)
|
||||
|
||||
for timeperiod in long_timeperiods:
|
||||
informative[f"sma{timeperiod}"] = informative['mid'].ewm(span=timeperiod, adjust=False).mean()
|
||||
@@ -733,8 +755,8 @@ class Empty5m(IStrategy):
|
||||
# dataframe['cross_sma60'] = qtpylib.crossed_below(dataframe[self.sell_sma_indicators.value], dataframe[self.sell_crossed_sma_indicators.value])
|
||||
|
||||
dataframe[f'has_cross_sma3_1h'] = qtpylib.crossed_above(dataframe[f"sma60"], dataframe['sma3_regression_1h'])
|
||||
dataframe[f'has_cross_min'] = qtpylib.crossed_above(dataframe[f"close"], dataframe['min60_1h'])
|
||||
dataframe[f'has_cross_min_6'] = (dataframe['has_cross_min'].rolling(6).max() == 1)
|
||||
dataframe[f'has_cross_min'] = qtpylib.crossed_above(dataframe[f"close"], dataframe['min60'])
|
||||
dataframe[f'has_cross_min_6'] = (dataframe['has_cross_min'].rolling(15).max() == 1)
|
||||
|
||||
dataframe['atr'] = talib.ATR(dataframe)
|
||||
dataframe['rsi'] = talib.RSI(dataframe['close'], timeperiod=14)
|
||||
@@ -762,11 +784,11 @@ class Empty5m(IStrategy):
|
||||
# #####################################################################################
|
||||
# CA MONTE !!
|
||||
# #####################################################################################
|
||||
conditions.append(dataframe[f"{self.start_bull_indicator.value}_deriv1_1h" ] > self.start_bull_deriv1.value)
|
||||
conditions.append(dataframe[f"{self.start_bull_indicator.value}_deriv2_1h"] > self.start_bull_deriv2.value)
|
||||
conditions.append(dataframe['sma12_deriv1'] > self.buy_deriv1_sma60.value)
|
||||
conditions.append(dataframe['sma5_deriv1_1h'] > self.buy_deriv1_sma5d.value)
|
||||
conditions.append(dataframe['sma12_deriv1_1h'] > self.buy_deriv1_sma12d.value)
|
||||
# conditions.append(dataframe[f"{self.start_bull_indicator.value}_deriv1_1h" ] > self.start_bull_deriv1.value)
|
||||
# conditions.append(dataframe[f"{self.start_bull_indicator.value}_deriv2_1h"] > self.start_bull_deriv2.value)
|
||||
# conditions.append(dataframe['sma12_deriv1'] > self.buy_deriv1_sma60.value)
|
||||
# conditions.append(dataframe['sma5_deriv1_1h'] > self.buy_deriv1_sma5d.value)
|
||||
# conditions.append(dataframe['sma12_deriv1_1h'] > self.buy_deriv1_sma12d.value)
|
||||
|
||||
# conditions.append(dataframe['sma36_deriv2'] > self.buy_deriv2_sma60.value)
|
||||
# conditions.append(dataframe['sma5_deriv2_1h'] > self.buy_deriv2_sma5d.value)
|
||||
@@ -787,11 +809,11 @@ class Empty5m(IStrategy):
|
||||
# | (dataframe['sma60_inv_1h'] == -1)
|
||||
# )
|
||||
|
||||
if conditions:
|
||||
dataframe.loc[
|
||||
reduce(lambda x, y: x & y, conditions),
|
||||
['enter_long', 'enter_tag']
|
||||
] = (1, 'bull')
|
||||
# if conditions:
|
||||
# dataframe.loc[
|
||||
# reduce(lambda x, y: x & y, conditions),
|
||||
# ['enter_long', 'enter_tag']
|
||||
# ] = (1, 'bull')
|
||||
|
||||
# #####################################################################################
|
||||
# conditions = list()
|
||||
@@ -835,39 +857,39 @@ class Empty5m(IStrategy):
|
||||
# },
|
||||
# #####################################################################################
|
||||
conditions = list()
|
||||
conditions.append(dataframe[f"{self.start_bull_indicator.value}_deriv1_1h" ] < self.start_bull_deriv1.value)
|
||||
conditions.append(dataframe[f"{self.start_bull_indicator.value}_deriv2_1h"] < self.start_bull_deriv2.value)
|
||||
conditions.append(dataframe[f"{self.start_bear_indicator.value}_deriv1_1h" ] > self.start_bear_deriv1.value)
|
||||
conditions.append(dataframe[f"{self.start_bear_indicator.value}_deriv2_1h"] > self.start_bear_deriv2.value)
|
||||
# conditions.append(dataframe[f"{self.start_bull_indicator.value}_deriv1_1h" ] < self.start_bull_deriv1.value)
|
||||
# conditions.append(dataframe[f"{self.start_bull_indicator.value}_deriv2_1h"] < self.start_bull_deriv2.value)
|
||||
# conditions.append(dataframe[f"{self.start_bear_indicator.value}_deriv1_1h" ] > self.start_bear_deriv1.value)
|
||||
# conditions.append(dataframe[f"{self.start_bear_indicator.value}_deriv2_1h"] > self.start_bear_deriv2.value)
|
||||
|
||||
conditions.append(dataframe['sma12_deriv1'] > self.buy_deriv1_sma60.value)
|
||||
conditions.append(dataframe['sma5_deriv1_1h'] > self.buy_deriv1_sma5d.value)
|
||||
conditions.append(dataframe['sma12_deriv1_1h'] > self.buy_deriv1_sma12d.value)
|
||||
# conditions.append(dataframe['sma12_deriv1'] > self.buy_deriv1_sma60.value)
|
||||
# conditions.append(dataframe['sma5_deriv1_1h'] > self.buy_deriv1_sma5d.value)
|
||||
# conditions.append(dataframe['sma12_deriv1_1h'] > self.buy_deriv1_sma12d.value)
|
||||
#
|
||||
# # conditions.append(dataframe['sma12_deriv2'] > -0.002)
|
||||
# # conditions.append(dataframe['sma5_deriv2_1h'] > 0)
|
||||
# # conditions.append(dataframe['sma12_deriv2_1h'] > -0.03)
|
||||
#
|
||||
# conditions.append(dataframe['hapercent'] > 0)
|
||||
# # conditions.append(dataframe['percent12'] < 0.01)
|
||||
# # conditions.append(dataframe['percent5'] < 0.01)
|
||||
# conditions.append(dataframe['max_rsi_24'] < 80)
|
||||
#
|
||||
# dynamic_rsi_threshold = 70 + 15 * np.tanh(dataframe["dist_sma200_1h"] * 5)
|
||||
# conditions.append((dataframe['max_rsi_12_1h'] < dynamic_rsi_threshold))
|
||||
# conditions.append(dataframe[f"close"] > dataframe['sma60'])
|
||||
# conditions.append(((dataframe[f"range_pos"] < 0.05) ) | ((dataframe['sma12_deriv1'] > 0) & (dataframe['sma12_deriv2'] > 0)))
|
||||
#
|
||||
# conditions.append(
|
||||
# (dataframe['close_1h'] > dataframe[f'sma{self.buy_longue.value}_1h'])
|
||||
# | (dataframe['sma60_inv_1h'] == -1)
|
||||
# )
|
||||
|
||||
# conditions.append(dataframe['sma12_deriv2'] > -0.002)
|
||||
# conditions.append(dataframe['sma5_deriv2_1h'] > 0)
|
||||
# conditions.append(dataframe['sma12_deriv2_1h'] > -0.03)
|
||||
|
||||
conditions.append(dataframe['hapercent'] > 0)
|
||||
# conditions.append(dataframe['percent12'] < 0.01)
|
||||
# conditions.append(dataframe['percent5'] < 0.01)
|
||||
conditions.append(dataframe['max_rsi_24'] < 80)
|
||||
|
||||
dynamic_rsi_threshold = 70 + 15 * np.tanh(dataframe["dist_sma200_1h"] * 5)
|
||||
conditions.append((dataframe['max_rsi_12_1h'] < dynamic_rsi_threshold))
|
||||
conditions.append(dataframe[f"close"] > dataframe['sma60'])
|
||||
conditions.append(((dataframe[f"range_pos"] < 0.05) ) | ((dataframe['sma12_deriv1'] > 0) & (dataframe['sma12_deriv2'] > 0)))
|
||||
|
||||
conditions.append(
|
||||
(dataframe['close_1h'] > dataframe[f'sma{self.buy_longue.value}_1h'])
|
||||
| (dataframe['sma60_inv_1h'] == -1)
|
||||
)
|
||||
|
||||
if conditions:
|
||||
dataframe.loc[
|
||||
reduce(lambda x, y: x & y, conditions),
|
||||
['enter_long', 'enter_tag']
|
||||
] = (1, 'bear')
|
||||
# if conditions:
|
||||
# dataframe.loc[
|
||||
# reduce(lambda x, y: x & y, conditions),
|
||||
# ['enter_long', 'enter_tag']
|
||||
# ] = (1, 'bear')
|
||||
|
||||
# conditions = list()
|
||||
# conditions.append(dataframe['close_1h'] < dataframe[f'sma{self.buy_longue.value}_1h'])
|
||||
@@ -907,15 +929,18 @@ class Empty5m(IStrategy):
|
||||
# ['enter_long', 'enter_tag']
|
||||
# ] = (1, 'Force')
|
||||
|
||||
# conditions = list()
|
||||
conditions = list()
|
||||
# conditions.append(dataframe['mid_regression'].shift(2) > dataframe['mid_regression'].shift(1))
|
||||
# conditions.append(dataframe['mid_regression'].shift(1) < dataframe['mid_regression'])
|
||||
# conditions.append(dataframe['has_cross_min_6'] == 1)
|
||||
# # conditions.append(dataframe['sma12_deriv1'] >= 0)
|
||||
# dataframe.loc[
|
||||
# reduce(lambda x, y: x & y, conditions),
|
||||
# ['enter_long', 'enter_tag']
|
||||
# ] = (1, 'Mid')
|
||||
conditions.append(dataframe['close'] <= dataframe['min12_1h'])
|
||||
conditions.append(dataframe['min60'] == dataframe['min60'].shift(5))
|
||||
conditions.append(dataframe['has_cross_min_6'] == 1)
|
||||
# conditions.append(dataframe['min5_1h'] / dataframe['min12_1h'] < 0.03)
|
||||
# conditions.append(dataframe['sma12_deriv1'] >= 0)
|
||||
dataframe.loc[
|
||||
reduce(lambda x, y: x & y, conditions),
|
||||
['enter_long', 'enter_tag']
|
||||
] = (1, 'Mid')
|
||||
|
||||
return dataframe
|
||||
|
||||
|
||||
1218
EmptyAI.py
Normal file
1218
EmptyAI.py
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user