реклама
Бургер менюБургер меню

Алексей Боровков – Алгоритмический трейдинг: Создание, тестирование и запуск роботов на рынке Форекс (страница 4)

18

('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,