Блог им. KonstantinBesedin

Алгоритмическая торговая платформа на крипте

Всем привет.
Давно почитываю smart-lab.

Вот решил маленький постик написать, потому как к вам, ребята, многоуважаемые спецы, появился вопрос.

Кратко о себе: разработчик c# бэкенд (20 лет в enterprise разработке), react\js (7+ лет разработки в enterprise).

Брат занимается торговлей крипты, лет 5 плотно, многому меня научил.

Я написал пару ботов в телеге, которые ему жизнь облегчают — тупо смотрят рыночную структуру, тренд в нисходящую сторону, учитываются ликвидации при подходе к зоне сопротивления (брат торгует только в шорт), сигнал — классика. Торгует только на Bybit.

Все работает, но дико не хватает проверки на истории и прочего, «платформенного».
Пробовал ряд платформ — не понравилось, не хватает функционала и бэктесты врут.

Ребят я не писатель, задам пару вопросов, просто если ответите, буду рад.
Написал часть платформы, чтобы мне было легче работать с индикаторами, видеть результаты, equity и прочее. Есть CLI которая может разом пройтись для стратегии по всем фьючерсам и выдать результаты — норм стратегия или гамно…

Я для себя развиваю. Будет ли вам подобная штука интересна и полезна?

Упор делаю на максимальное приближение к Байбит в симулятре — ликвидации, фандинг, MMR Tier, много много чего учитывается. Оптимизация под работу одновременно с несколькими биржами. Binance в проработке.

Спецы, просто ваше мнение интересно, стоит ли в массы продукт толкать или уже все есть и вам все ок и не нужно..?
Алгоритмическая торговая платформа на крипте
Алгоритмическая торговая платформа на крипте
Алгоритмическая торговая платформа на крипте
Алгоритмическая торговая платформа на крипте
Алгоритмическая торговая платформа на крипте
Алгоритмическая торговая платформа на крипте
Алгоритмическая торговая платформа на крипте
Алгоритмическая торговая платформа на крипте
Алгоритмическая торговая платформа на крипте

Вот пример простейшей стратегии, я на ней часть функционала платформы тестирую. Просто от базового класса обьявляете и все работает как часики.
using Cryptian.Core.Configuration;
using Cryptian.Core.Constants;
using Cryptian.Core.Enums;
using Cryptian.Core.Events;
using Cryptian.Core.Stratigies;
using Cryptian.Indicators.Candlesticks;
using Cryptian.Indicators.Ema;
using Cryptian.Indicators.Macd;
using Cryptian.Indicators.Volume;
using Microsoft.Extensions.Logging;

namespace Cryptian.Strategies.Examples.UITests
{
	/// <summary>
	/// UI-тест: Short с 2 TP (50%+50%) и SL на двух символах.
	/// Pull-стиль: вся логика в OnKline, GetActiveTrade как единственный источник правды.
	/// </summary>
	public sealed class MultiTpStrategy : Strategy
	{
		private static readonly Dictionary<string, decimal> Quantities = new()
		{
			["BTCUSDT"]      = 0.002m,
			["1000PEPEUSDT"] = 1000m,
		};

		protected override StrategyConfig Configure()
		{
			return new StrategyConfig()
				.Chart(c => c
					.Pane(p => p
						.Indicator(new CandlesticksIndicator())
						.Indicator(new EmaIndicator(20)))
					.Pane(p => p.Height(20.0).Indicator(new VolumeIndicator()))
					.Pane(p => p.Height(20.0).Indicator(new MacdIndicator())))
				.Exchange(Exchange.Bybit, e => e
					.Symbols(Quantities.Keys.ToArray())
					.Klines(k => k.Timeframe(Timeframe.M1, 500).Timeframe(Timeframe.M5, 500))
					.Tickers()
					.Trading(t => t.ClosedHistory(500)));
		}

		public override void OnKline(KlineEvent e)
		{
			if (!e.IsClosed || e.Timeframe != Timeframe.M1)
			{
				return;
			}

			if (!Quantities.TryGetValue(e.Symbol, out var qty))
			{
				return;
			}

			// Source of truth — активная сделка (Pending или Open).
			// Есть сделка → ждём SL/TP.
			if (Trading.GetActiveTrade(e.Symbol) is not null)
			{
				return;
			}

			var price = (decimal)e.Kline.Close;
			var dec   = GetPriceDecimals(e.Symbol);
			var sl    = Math.Round(price * 1.010m, dec);
			var tp1   = Math.Round(price * 0.990m, dec);
			var tp2   = Math.Round(price * 0.980m, dec);

			Logger.LogInformation("[MultiTp] {Symbol} Sell {Qty} @ Market | SL={Sl} TP1={Tp1}(50%) TP2={Tp2}(50%)",
				e.Symbol, qty, sl, tp1, tp2);

			Trading.Sell(e.Symbol, qty)
				.Market()
				.StopLoss(sl)
				.TakeProfit(tp1, 0.5m)
				.TakeProfit(tp2, 0.5m)
				.Place();
		}

		/// <summary>
		/// Количество десятичных знаков цены из TickSize символа.
		/// </summary>
		private int GetPriceDecimals(string symbol)
		{
			var info = Symbols.Get(symbol);

			if (info is null)
			{
				return 2;
			}

			var tick = info.TickSize;
			var decimals = 0;

			while (tick < 1m && decimals < 10)
			{
				tick *= 10;
				decimals++;
			}

			return decimals;
		}
	}
}



Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.

521
9 комментариев
Думал мне скажут куку-зачем пишешь, все уже есть, а поставили два лайка, спасибо ребят, красавчики) Всем классного вечера)
avatar
Статистики нифига нет, остальное пока тоже так себе, тем более 20лет в разработке на C#.
Да и С# в России сейчас никому не нужон, на Хабре не так давно это обсуждали, так что.
Да и в backtrader все уже есть.
avatar
Большое спасибо за фидбэк, Beach Bunny! Ребята, дайте еще комментариев, плиз, стоит ли развивать продукт до продакшен реди для пользователей. Если подобное не нужно не буду продолжать тратить время)
avatar
Konstantin Besedin, сколько времени у вас будет к примеру тестироваться по 30 тикерам,  у каждого тикера по 70_000 свечек ?
Оптимизировать такое количество одновременно в одной стратегии сможет ваш пепелац?  
На питоне можно и даже относительно оптимальные параметры можно найти за 60минут для 4-6 одновременно оптимизируемых параметров ( это не перебор брутофорсом)  и при этом еще статистика считается около 25 величин разных.
Питон — сила, большое количество высоко производительных-оптимизированных либ, а вам придется все это заново самостоятельно пилить.
Как то так
--
Да еще, ссылки на github нет, то есть вы это продавать потом будете, а в питоне оперсорс и безплатно
avatar
Спасибо за ответ, пока не тестил, работаю над функционалом. Одно тестил точно в течении недели — одновременно запустил бинанс и байбит на максималках, тикеры, стаканы гл. 50, ui. 476+ фьючей на каждой бирже — тормозов не было, проц 5-15 процентов, память ~3-5 ГБ… Стабильно) Остальное докручу. Сейчас над реаличтисностью бэктестера работаю, до мелочей прорабатываю… А так вы правы — вряд ли я стану кому-то конкурентом и смогу продвинуть продукт судя по тому что рынок уже очень насыщен. Большое спасибо и вы во многом правы!
avatar
Konstantin Besedin, психологически комфортнее пилить лопату, потстоянно что-то доделывая и улучшая, но это редко дает прибыль, для прибыли надо самому становиться алготрейдером и торговать, возможно и на своей лопате, тогда и понимать будешь, что нужно
avatar
Beach Bunny — золотые слова. Я бы вам дал свой продукт пощупать как допишу)
avatar
Если конечно он вам нужен будет)
avatar

Читайте на SMART-LAB:
Фото
GBP/USD: рынок склоняет чашу весов в пользу фунта
Британский фунт в прошедший период пытался продолжить рост, но смог лишь незначительно прибавить в цене, колеблясь в широком диапазоне в...
Производственные итоги первого квартала: нейтральная оценка и рекомендации «ПОКУПАТЬ»
Не так давно мы подвели производственные итоги с начала 2026 года. Динамика операционных результатов компании за 1 квартал 2026 года во многом...
Дорогая нефть поддерживает крепкий рубль
Высокий курс рубля прежде всего обеспечивается дорогой нефтью и, как следствие, высокой экспортной выручкой, которая продается на внутреннем рынке....
Фото
Исповедь по Магниту: пришло время каяться за свои грехи. Самый подробный разбор отчета за 2025 год 
Магнит — это как сыр с плесенью. Удовольствие для гурманов 😁 Примитивная оценка акций Магнита делается через мультипликатор EV/EBITDA...

теги блога Konstantin Besedin

....все тэги



UPDONW
Новый дизайн