Grid-бот в мобільному додатку
Grid-бот виставляє сітку ордерів вище та нижче поточної ціни: продає на кожному рівні вгору, купує на кожному рівні вниз. Інтерфейс управління таким ботом вимагає візуалізації сітки — користувач повинен бачити, де стоять ордери, які виконались, який PnL принесли кожен рівень.
Параметри Grid-стратегії
Мінімальний набір параметрів для налаштування:
- Діапазон — нижня та верхня межа сітки в USDT (наприклад, 60,000 — 70,000 для BTC)
- Кількість рівнів — 10 рівнів означає крок (70,000 − 60,000) / 10 = $1,000
- Розмір ордера — $100 на кожен рівень
- Тип сітки — арифметична (рівний крок у USD) або геометрична (рівний крок у %)
Геометрична сітка коректна для волатильних активів: крок $500 має сенс при BTC на $10,000, але незначний при $60,000. При геометричній сітці рівні розраховуються як lower * (upper/lower)^(i/n).
// Android — обчислення рівнів сітки
fun calculateGridLevels(
lower: Double,
upper: Double,
count: Int,
type: GridType
): List<Double> = when (type) {
GridType.ARITHMETIC -> {
val step = (upper - lower) / count
(0..count).map { i -> lower + step * i }
}
GridType.GEOMETRIC -> {
val ratio = (upper / lower).pow(1.0 / count)
(0..count).map { i -> lower * ratio.pow(i.toDouble()) }
}
}
Користувач вводить діапазон та кількість рівнів — додаток негайно показує попередній перегляд: ось рівні, ось крок між ними, ось загальний капітал, необхідний для всіх ордерів.
Візуалізація сітки
Це головне завдання UI. Потрібен кастомний віджет: горизонтальні лінії рівнів сітки на фоні цінової діаграми. Виконані ордери — зелені/червоні маркери. Поточна ціна — пульсуюча лінія.
На Flutter це CustomPainter:
class GridChartPainter extends CustomPainter {
final List<GridLevel> levels;
final List<PricePoint> priceHistory;
final double currentPrice;
@override
void paint(Canvas canvas, Size size) {
final priceRange = levels.last.price - levels.first.price;
final priceToY = (double price) =>
size.height - (price - levels.first.price) / priceRange * size.height;
// Малюємо рівні сітки
for (final level in levels) {
final y = priceToY(level.price);
final paint = Paint()
..color = level.hasFilled ? Colors.green.withOpacity(0.3) : Colors.grey.withOpacity(0.2)
..strokeWidth = 1;
canvas.drawLine(Offset(0, y), Offset(size.width, y), paint);
// Лейбл ціни
final tp = TextPainter(
text: TextSpan(text: level.price.toStringAsFixed(0), style: const TextStyle(fontSize: 10)),
textDirection: TextDirection.ltr,
)..layout();
tp.paint(canvas, Offset(4, y - 12));
}
// Ціна лінія
final pricePaint = Paint()..color = Colors.blue..strokeWidth = 1.5;
for (int i = 1; i < priceHistory.length; i++) {
canvas.drawLine(
Offset(size.width * (i-1) / priceHistory.length, priceToY(priceHistory[i-1].price)),
Offset(size.width * i / priceHistory.length, priceToY(priceHistory[i].price)),
pricePaint,
);
}
}
@override
bool shouldRepaint(GridChartPainter old) =>
old.currentPrice != currentPrice || old.levels != levels;
}
Статистика Grid-бота
Grid PnL — загальний дохід від виконаних пар ордерів (купили на нижньому рівні, продали на верхньому). Кожна сработана пара приносить крок_сітки × розмір_ордера. При 10 рівнях та кроці $1,000: кожен прохід туди-назад = $1,000 прибутку на ордер $100.
Floating PnL — нереалізований прибуток/збиток від того, що ціна вийшла за діапазон. Якщо BTC впав нижче нижньої межі сітки — бот утримує всі куплені ордери в збитку до повернення ціни в діапазон.
Також показуємо: кількість виконаних пар ордерів, кількість активних ордерів зараз, капітал у роботі.
Що входить до роботи
- Форма налаштування з вибором типу сітки та попереднім переглядом рівнів
- Кастомний віджет для візуалізації сітки (CustomPainter)
- Дашборд: Grid PnL, Floating PnL, кількість виконаних пар
- Історія виконаних ордерів із групуванням за парами
- Real-time оновлення статусу ордерів через WebSocket
Терміни
6–8 робочих днів — кастомний віджет сітки займає значну частину. Вартість розраховується індивідуально після аналізу вимог.







