Алексей Боровков – Алгоритмический трейдинг: Создание, тестирование и запуск роботов на рынке Форекс (страница 4)
('take_profit', 0.04),# Тейк-профит 4%
('risk_per_trade', 0.01), # Риск на сделку 1% от капитала
('use_atr_filter', True), # Использовать фильтр ATR
('atr_period', 14), # Период ATR
('atr_multiplier', 2),# Множитель ATR для стоп-лосса
('printlog', False), # Вывод логов
)
def __init__(self):
"""Инициализация индикаторов"""
# Создаем индикаторы
self.fast_ma = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.fast_ma
)
self.slow_ma = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.slow_ma
)
# ADX индикатор (направленность тренда)
self.adx = bt.indicators.AverageDirectionalMovementIndex(
self.data, period=self.params.adx_period
)
# ATR для фильтра волатильности и расчета стоп-лосса
self.atr = bt.indicators.AverageTrueRange(
self.data, period=self.params.atr_period
)
# Переменные для отслеживания состояния
self.order = None
self.buyprice = None
self.buycomm = None
# Для логирования
self.trades = []
self.current_trade = {}
def log(self, txt, dt=None, doprint=False):
"""Метод для логирования"""
if self.params.printlog or doprint:
dt = dt or self.datas[0].datetime.date(0)
print(f'{dt.isoformat()} {txt}')
def notify_order(self, order):
"""Обработка изменения статуса ордера"""
if order.status in [order.Submitted, order.Accepted]:
# Ордер отправлен/принят – ничего не делаем
return
if order.status in [order.Completed]:
if order.isbuy():
self.log(
f'ПОКУПКА ИСПОЛНЕНА, Цена: {order.executed.price:.2f}, '
f'Стоимость: {order.executed.value:.2f}, '
f'Комиссия: {order.executed.comm:.2f}'
)
self.buyprice = order.executed.price
self.buycomm = order.executed.comm
# Устанавливаем стоп-лосс и тейк-профит
if self.params.use_atr_filter:
sl = self.buyprice – self.atr[0] * self.params.atr_multiplier
tp = self.buyprice + self.atr[0] * self.params.atr_multiplier * 2
else:
sl = self.buyprice * (1 – self.params.stop_loss)
tp = self.buyprice * (1 + self.params.take_profit)
self.sell(exectype=bt.Order.StopTrail, price=sl)
self.sell(exectype=bt.Order.Limit, price=tp)
# Сохраняем информацию о сделке
self.current_trade = {
'entry_date': self.datas[0].datetime.date(0),
'entry_price': order.executed.price,
'stop_loss': sl,
'take_profit': tp,