class OptimizedTradingBot(SimpleTradingBot):
def __init__(self, client, symbol, initial_capital=1000):
super().__init__(client, symbol, initial_capital)
self.optimization_params = {
'ma_short': range(10, 31, 5),
'ma_long': range(40, 101, 10),
'rsi_period': range(10, 21, 2),
'rsi_overbought': range(65, 81, 5),
'rsi_oversold': range(20, 36, 5),
'stop_loss': [0.01, 0.02, 0.03],
'take_profit': [0.03, 0.05, 0.07]
}
def optimize_parameters(self, data):
"""Tối ưu hóa tham số"""
best_performance = {
'total_return': -float('inf'),
'params': None
}
for ma_short in self.optimization_params['ma_short']:
for ma_long in self.optimization_params['ma_long']:
if ma_short >= ma_long:
continue
for rsi_period in self.optimization_params['rsi_period']:
for rsi_overbought in self.optimization_params['rsi_overbought']:
for rsi_oversold in self.optimization_params['rsi_oversold']:
if rsi_oversold >= rsi_overbought:
continue
for stop_loss in self.optimization_params['stop_loss']:
for take_profit in self.optimization_params['take_profit']:
params = {
'ma_short': ma_short,
'ma_long': ma_long,
'rsi_period': rsi_period,
'rsi_overbought': rsi_overbought,
'rsi_oversold': rsi_oversold,
'stop_loss': stop_loss,
'take_profit': take_profit
}
performance = self._test_parameters(data, params)
if performance['total_return'] > best_performance['total_return']:
best_performance['total_return'] = performance['total_return']
best_performance['params'] = params
return best_performance['params']
def _test_parameters(self, data, params):
"""Kiểm tra hiệu suất với bộ tham số"""
indicators = TechnicalIndicators(data)
data['MA_short'] = indicators.calculate_ma(params['ma_short'])
data['MA_long'] = indicators.calculate_ma(params['ma_long'])
data['RSI'] = indicators.calculate_rsi(params['rsi_period'])
signals = TradingSignals(data).generate_signals()
capital = self.initial_capital
position = None
trades = []
for i in range(1, len(data)):
if signals['Signal'].iloc[i] == 1 and position is None:
entry_price = data['close'].iloc[i]
quantity = capital / entry_price
position = {
'type': 'long',
'entry_price': entry_price,
'quantity': quantity,
'stop_loss': entry_price * (1 - params['stop_loss']),
'take_profit': entry_price * (1 + params['take_profit'])
}
elif signals['Signal'].iloc[i] == -1 and position is not None:
exit_price = data['close'].iloc[i]
profit = (exit_price - position['entry_price']) * position['quantity']
capital += profit
trades.append({
'entry_price': position['entry_price'],
'exit_price': exit_price,
'profit': profit
})
position = None
if position is not None:
current_price = data['close'].iloc[i]
if current_price <= position['stop_loss'] or current_price >= position['take_profit']:
profit = (current_price - position['entry_price']) * position['quantity']
capital += profit
trades.append({
'entry_price': position['entry_price'],
'exit_price': current_price,
'profit': profit
})
position = None
return {
'total_return': (capital - self.initial_capital) / self.initial_capital,
'total_trades': len(trades),
'win_rate': len([t for t in trades if t['profit'] > 0]) / len(trades) if trades else 0
}