Алексей Боровков – Алгоритмический трейдинг: Создание, тестирование и запуск роботов на рынке Форекс (страница 5)
'size': order.executed.size
}
elif order.issell():
self.log(
f'ПРОДАЖА ИСПОЛНЕНА, Цена: {order.executed.price:.2f}, '
f'Стоимость: {order.executed.value:.2f}, '
f'Комиссия: {order.executed.comm:.2f}'
)
# Фиксируем завершение сделки
if self.current_trade:
self.current_trade['exit_date'] = self.datas[0].datetime.date(0)
self.current_trade['exit_price'] = order.executed.price
self.current_trade['pnl'] = (
(order.executed.price – self.current_trade['entry_price']) *
self.current_trade['size']
)
self.current_trade['pnl_percent'] = (
(order.executed.price / self.current_trade['entry_price'] – 1) * 100
)
self.trades.append(self.current_trade.copy())
self.current_trade = {}
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log(f'Ордер отменен/отклонен: {order.getstatusname()}')
self.order = None
def notify_trade(self, trade):
"""Обработка изменения статуса сделки"""
if not trade.isclosed:
return
self.log(f'СДЕЛКА ЗАКРЫТА, Прибыль: {trade.pnl:.2f}, Чистая прибыль: {trade.pnlcomm:.2f}')
def next(self):
"""Основная логика на каждом новом баре"""
# Пропускаем если ордер уже открыт
if self.order:
return
# Проверяем, есть ли открытая позиция
if not self.position:
# УСЛОВИЕ ДЛЯ ПОКУПКИ:
# 1. Быстрая MA пересекает медленную снизу вверх
# 2. ADX > порогового значения (сила тренда)
crossover_up = (self.fast_ma[-1] < self.slow_ma[-1] and
self.fast_ma[0] > self.slow_ma[0])
strong_trend = self.adx[0] > self.params.adx_threshold
if crossover_up and strong_trend:
# Рассчитываем размер позиции на основе риска
capital = self.broker.getvalue()
risk_amount = capital * self.params.risk_per_trade
if self.params.use_atr_filter:
stop_distance = self.atr[0] * self.params.atr_multiplier
else:
stop_distance = self.data.close[0] * self.params.stop_loss
if stop_distance > 0:
size = risk_amount / stop_distance
size = min(size, capital * 0.1 / self.data.close[0]) # Не более 10% капитала
self.log(f'СИГНАЛ НА ПОКУПКУ: цена={self.data.close[0]:.2f}, '
f'ADX={self.adx[0]:.2f}, размер={size:.2f}')
self.order = self.buy(size=size)
else:
# УСЛОВИЕ ДЛЯ ЗАКРЫТИЯ ПОЗИЦИИ:
# Быстрая MA пересекает медленную сверху вниз
crossover_down = (self.fast_ma[-1] > self.slow_ma[-1] and
self.fast_ma[0] < self.slow_ma[0])
if crossover_down:
self.log(f'СИГНАЛ НА ЗАКРЫТИЕ: цена={self.data.close[0]:.2f}')
self.order = self.close()
# =====================================================================