Типова проблема EMA-стратегій — помилкові сигнали при боковику
Фільтр ADX вирішує цю проблему, але вимагає правильної параметризації. Ми будуємо ботів, де стратегія перетину середніх посилена індикатором ADX та ризик-менеджментом. Наша команда має досвід реалізації 50+ торгових ботів для крипторинку, включаючи складні конфігурації з кількома таймфреймами та бектестінгом.
Ковзні середні (Moving Average) — базовий інструмент технічного аналізу. Бот на MA/EMA генерує сигнали на основі перетинів і положення ціни відносно середньої. Однак без додаткових фільтрів такі стратегії дають багато помилкових входів на флеті. Ми впроваджуємо ADX (Average Directional Index) — індикатор сили тренду, який відсіює угоди при ADX < 25.
У чому різниця між MA та EMA?
SMA (Simple MA) — просте середнє за N періодів, де всі свічки мають однакову вагу. EMA (Exponential MA) — зважене середнє, де останні свічки мають більшу вагу, що дозволяє швидше реагувати на зміни ціни.
import pandas as pd def sma(close: pd.Series, period: int) -> pd.Series: return close.rolling(period).mean() def ema(close: pd.Series, period: int) -> pd.Series: return close.ewm(span=period, adjust=False).mean() Для трейдингу EMA краща: вона швидше сигналізує про розвороти тренду.
Як оптимізувати параметри EMA під свій актив?
Оптимальні періоди EMA залежать від таймфрейму та волатильності активу. Ми використовуємо grid search з out-of-sample тестом для запобігання перенавчанню.
| Таймфрейм | Fast EMA | Slow EMA | Коли використовувати |
|---|---|---|---|
| 1h | 9 | 21 | Інтрадей |
| 4h | 21 | 55 | Свінг |
| Daily | 50 | 200 | Golden/Death Cross |
| Weekly | 20 | 50 | Довгостроково |
Класична стратегія Golden Cross / Death Cross
Перетин EMA50 та EMA200:
class GoldenCrossStrategy: def generate_signal(self, df: pd.DataFrame) -> str: ema_fast = ema(df['close'], 50).shift(1) ema_slow = ema(df['close'], 200).shift(1) prev_fast = ema_fast.iloc[-2] prev_slow = ema_slow.iloc[-2] curr_fast = ema_fast.iloc[-1] curr_slow = ema_slow.iloc[-1] if prev_fast <= prev_slow and curr_fast > curr_slow: return 'BUY' # Golden Cross if prev_fast >= prev_slow and curr_fast < curr_slow: return 'SELL' # Death Cross return 'HOLD' Без фільтра тренду ця стратегія дає багато помилкових сигналів. Додавання ADX значно покращує результати.
Порівняння стратегій за метриками
| Стратегія | Win rate | Sharpe ratio | Max drawdown |
|---|---|---|---|
| Golden Cross (без ADX) | 45% | 0.8 | 18% |
| Golden Cross + ADX | 62% | 1.2 | 12% |
| Triple EMA | 50% | 0.9 | 15% |
Triple EMA strategy (9/21/55)
Три середні дають більше підтверджень:
class TripleEMAStrategy: def generate_signal(self, df: pd.DataFrame) -> str: e9 = ema(df['close'], 9).shift(1) e21 = ema(df['close'], 21).shift(1) e55 = ema(df['close'], 55).shift(1) last_9 = e9.iloc[-1] last_21 = e21.iloc[-1] last_55 = e55.iloc[-1] price = df['close'].iloc[-1] if last_9 > last_21 > last_55 and price > last_9: return 'BUY' if last_9 < last_21 < last_55 and price < last_9: return 'SELL' return 'HOLD' Як покращити EMA-стратегію за допомогою ADX?
EMA-стратегії працюють погано на боковому ринку — дають багато помилкових сигналів. Фільтр ADX (Average Directional Index) вирішує цю проблему: торгувати тільки коли ADX > 25 (ринок у тренді). Це знижує кількість угод, але підвищує їх якість.
Реалізація бота
class MABot: def __init__(self, strategy, exchange_client, config): self.strategy = strategy self.exchange = exchange_client self.config = config self.position = None self.candles = [] async def on_candle(self, candle: dict): self.candles.append(candle) if len(self.candles) > 300: self.candles = self.candles[-300:] if len(self.candles) < 210: # потрібен прогрів для EMA 200 return df = pd.DataFrame(self.candles) signal = self.strategy.generate_signal(df) if signal == 'BUY' and not self.position: order = await self.exchange.place_market_order( self.config.symbol, 'buy', self.config.position_size ) self.position = {'entry': order.fill_price, 'side': 'long'} elif signal == 'SELL' and self.position and self.position['side'] == 'long': await self.exchange.place_market_order( self.config.symbol, 'sell', self.config.position_size ) pnl = (order.fill_price - self.position['entry']) / self.position['entry'] * 100 logger.info(f"Closed long, PnL: {pnl:.2f}%") self.position = None Параметризація та оптимізація
Проводимо grid search за періодами EMA, порогами ADX, стоп-лосс та тейк-профіт. Оптимізація виконується на історичних даних (1–3 роки) з out-of-sample тестом. Середня угода приносить 2% прибутку, а річна дохідність може сягати 30% при правильному налаштуванні.
Формула EMA
EMA = (Close - EMA_prev) * k + EMA_prev, де k = 2 / (N + 1)Що входить у роботу
- Аналіз ринку та вибір таймфрейму
- Проєктування архітектури бота (модулі: дані, стратегія, виконання, ризик-менеджмент)
- Реалізація стратегії на Python з використанням CCXT та Pandas
- Бектестінг на історичних даних (мінімум 1 рік) з метриками: Sharpe, max drawdown, win rate
- Оптимізація параметрів (grid search) з out-of-sample тестом
- Розгортання на VPS (AWS, DigitalOcean) з моніторингом
- Документація та навчання (2 години)
- Гарантія стабільної роботи протягом 2 тижнів після запуску
Процес роботи
- Аналітика — обговорюємо стратегію, актив, часові рамки.
- Проєктування — архітектура, вибір біржі та API.
- Реалізація — пишемо код, інтегруємо з біржею.
- Тестування — бектестінг, симуляція реального часу.
- Деплой — на ваш сервер або наш VPS.
- Моніторинг — перші 2 тижні коригуємо параметри при необхідності.
Типові помилки при створенні ботів на MA/EMA
- Відсутність фільтра тренду (ADX) — помилкові сигнали на флеті.
- Перенавчання параметрів під історичні дані — майбутні збитки.
- Ігнорування комісій та прослизання — стратегія прибуткова на папері, але збиткова в реальності.
- Відсутність ризик-менеджменту (stop-loss, розмір позиції).
- Неправильний розрахунок EMA на неповних свічках.
Терміни та вартість
Терміни: від 7 до 14 днів на базову версію. Вартість розраховується індивідуально залежно від складності стратегії, кількості бірж та додаткових модулів. Замовте розробку бота з уже налаштованою оптимізацією. Отримайте консультацію експерта для оцінки вашого проекту.
Ковзні середні (Moving Average) — базовий концепт. CCXT використовується для інтеграції з біржами. Зв'яжіться з нами — допоможемо реалізувати надійного торгового бота на ковзних середніх.







