Розробка бота для DCA (Dollar Cost Averaging)

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Розробка бота для DCA (Dollar Cost Averaging)
Простий
~3-5 днів
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1285
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1121
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    589
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    856

Розробка 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 дні, але цінність для користувача — довгострокова.