Реализация DCA-бота (Dollar Cost Averaging) в мобильном приложении
DCA-бот покупает актив через равные интервалы на фиксированную сумму: каждый понедельник в 10:00 — $50 в BTC, независимо от цены. Стратегия простая, но мобильный интерфейс для управления ею требует точной работы с расписаниями, историей покупок и текущей позицией.
Настройка DCA-стратегии
Пользователь задаёт несколько параметров:
- Актив и биржа — BTC/USDT на Binance
- Сумма ордера — $50 за раз
- Интервал — каждые 7 дней / каждые 24 часа / каждые N часов
- Первая покупка — немедленно или по расписанию
- Лимит по средней цене (опционально) — не покупать, если цена выше $X
Интервал удобно задавать через picker с предустановленными вариантами (1ч / 4ч / 12ч / 24ч / 7д / 30д) плюс возможность кастомного значения. На бэкенде это превращается в cron-выражение или в scheduled job с execute_at.
// Flutter — выбор интервала
enum DcaInterval {
oneHour('1ч', Duration(hours: 1)),
fourHours('4ч', Duration(hours: 4)),
oneDay('24ч', Duration(hours: 24)),
oneWeek('7д', Duration(days: 7));
const DcaInterval(this.label, this.duration);
final String label;
final Duration duration;
}
// Segment control или ChoiceChip
Wrap(
spacing: 8,
children: DcaInterval.values.map((interval) => ChoiceChip(
label: Text(interval.label),
selected: selectedInterval == interval,
onSelected: (_) => setState(() => selectedInterval = interval),
)).toList(),
)
Текущая позиция и статистика
Главный экран DCA-бота показывает, как накапливается позиция:
- Средняя цена входа — взвешенная средняя по всем покупкам
- Текущая цена — актуальная, из биржи или price API
- Unrealized PnL — разница между текущей ценой и средней ценой входа, умноженная на объём
- Следующая покупка — countdown до следующего исполнения
Средняя цена входа считается бэкендом и хранится в модели бота. Не доверяем клиенту считать её самостоятельно — расхождения из-за комиссий, частичных исполнений и округлений.
История покупок
Список всех выполненных ордеров: дата, цена исполнения, количество актива, сумма в USD. Визуально полезно наложить точки покупок на ценовой график актива — пользователь видит, что часть покупок пришлась на локальные дна. Именно это демонстрирует суть DCA.
На Flutter: fl_chart LineChart с ценой BTC как линией и кастомными FlSpot маркерами для каждой DCA-покупки.
LineChartBarData(
spots: priceHistory.map((p) => FlSpot(p.timestamp.toDouble(), p.price)).toList(),
isCurved: true,
color: Colors.blue,
dotData: FlDotData(
show: true,
checkToShowDot: (spot, barData) => dcaPurchaseDates.contains(spot.x),
getDotPainter: (spot, percent, barData, index) => FlDotCirclePainter(
radius: 5,
color: Colors.green,
),
),
)
Стоп-условия
DCA-бот не работает вечно — нужны условия остановки:
- Достигнуто максимальное число покупок (например, 52 покупки = год еженедельного DCA)
- Накоплено максимальное количество актива
- Достигнут target PnL (например, +30% по позиции — зафиксировать)
Эти условия задаются в настройках и отображаются как «прогресс к цели»: 12 из 52 покупок, 0.18 из 0.5 BTC накоплено.
Что входит в работу
- Форма создания DCA-стратегии с выбором интервала и условий остановки
- Дашборд: средняя цена входа, текущий PnL, countdown до следующей покупки
- График цены с отмеченными точками покупок
- История ордеров с пагинацией
- Push при каждом исполнении ордера
Сроки
4–6 рабочих дней. Стоимость рассчитывается индивидуально после анализа требований.







