Konstantin Besedin
Konstantin Besedin личный блог
Вчера в 19:21

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

Всем привет.
Давно почитываю 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;
		}
	}
}


6 Комментариев
  • Beach Bunny
    Вчера в 21:08
    Статистики нифига нет, остальное пока тоже так себе, тем более 20лет в разработке на C#.
    Да и С# в России сейчас никому не нужон, на Хабре не так давно это обсуждали, так что.
    Да и в backtrader все уже есть.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн