Розробка DCA бота
DCA (Dollar-Cost Averaging) — це стратегія покупки фіксованої суми активу через рівні проміжки часу незалежно від ціни. Купили по $50,000, купили по $45,000, купили по $55,000 — середня ціна входу згладжується. Бот автоматизує цю дисципліну.
Як працює DCA-бот
Логіка проста: кожен N період (година, день, тиждень) бот виконує market або limit ордер на фіксовану суму в USD. Жодного аналізу, жодних індикаторів — тільки розклад.
import asyncio
from decimal import Decimal
from datetime import datetime
class DCABot:
def __init__(self, config: DCAConfig, exchange_client):
self.config = config
self.exchange = exchange_client
self.total_invested = Decimal(0)
self.total_purchased = Decimal(0)
async def execute_dca_order(self):
try:
# Перевіряємо баланс
balance = await self.exchange.get_balance(self.config.quote_currency)
if balance < self.config.amount_per_order:
await self.alert(f"Недостатньо коштів: {balance} < {self.config.amount_per_order}")
return
# Виконуємо покупку
order = await self.exchange.place_market_order(
symbol=self.config.symbol,
side='buy',
quote_order_qty=float(self.config.amount_per_order) # у USDT
)
self.total_invested += self.config.amount_per_order
self.total_purchased += Decimal(str(order.filled_quantity))
avg_price = self.total_invested / self.total_purchased
await self.log_purchase(order, avg_price)
await self.telegram_notify(
f"DCA: куплено {order.filled_quantity:.6f} {self.config.base_currency} "
f"по {order.fill_price:.2f} USDT\n"
f"Середня ціна входу: {avg_price:.2f} USDT"
)
except Exception as e:
await self.alert(f"DCA ордер не вдався: {e}")
Конфігурація
@dataclass
class DCAConfig:
symbol: str = 'BTCUSDT'
base_currency: str = 'BTC'
quote_currency: str = 'USDT'
amount_per_order: Decimal = Decimal('100') # $100 за раз
# Розклад
interval: str = 'daily' # 'hourly', 'daily', 'weekly'
time_utc: str = '12:00' # час виконання
# Опціональні умови
dip_buying: bool = False # купувати більше при падінні
dip_threshold: float = 5.0 # % падіння = додаткова покупка
dip_multiplier: float = 2.0 # подвійна сума при dip
# Ліміти
max_total_investment: Decimal = Decimal('10000') # максимум за всі часи
stop_above_price: float = None # зупинити при ціні вище N
Розширений DCA: покупка на просадках
Vanilla DCA купує завжди однаково. Покращення: подвоюємо покупку при падінні ціни:
async def enhanced_dca_order(self):
current_price = await self.exchange.get_price(self.config.symbol)
last_purchase_price = await self.db.get_last_purchase_price(self.config.symbol)
amount = self.config.amount_per_order
if last_purchase_price and self.config.dip_buying:
price_drop = (last_purchase_price - current_price) / last_purchase_price * 100
if price_drop >= self.config.dip_threshold:
amount *= Decimal(str(self.config.dip_multiplier))
logger.info(f"Просадка виявлена ({price_drop:.1f}%), купуємо {self.config.dip_multiplier}x")
await self.execute_order(amount)
Планувальник завдань
import schedule
import time
def start_scheduler(bot: DCABot, config: DCAConfig):
if config.interval == 'hourly':
schedule.every().hour.do(lambda: asyncio.run(bot.execute_dca_order()))
elif config.interval == 'daily':
schedule.every().day.at(config.time_utc).do(lambda: asyncio.run(bot.execute_dca_order()))
elif config.interval == 'weekly':
schedule.every().monday.at(config.time_utc).do(lambda: asyncio.run(bot.execute_dca_order()))
while True:
schedule.run_pending()
time.sleep(60)
Статистика та аналітика
Бот повинен показувати:
- Середню ціну входу (avg cost basis)
- Поточний unrealized PnL
- Кількість та суми всіх DCA покупок
- Графік equity curve
def get_statistics(self) -> dict:
current_price = self.get_current_price()
current_value = self.total_purchased * Decimal(str(current_price))
unrealized_pnl = current_value - self.total_invested
unrealized_pnl_percent = unrealized_pnl / self.total_invested * 100
return {
'total_invested': str(self.total_invested),
'total_purchased': str(self.total_purchased),
'avg_purchase_price': str(self.total_invested / self.total_purchased),
'current_value': str(current_value),
'unrealized_pnl': str(unrealized_pnl),
'unrealized_pnl_percent': float(unrealized_pnl_percent),
'num_orders': self.order_count,
}
DCA-бот — це один з найпростіших, але при цьому один з найбільш ефективних інструментів для довгострокових інвесторів. Дослідження показують, що DCA стратегія в BTC за будь-який 4-річний період історично дала позитивний результат. Розробка займає 1-2 дні, але цінність для користувача — довгострокова.







