Розробка маркетплейсу торгових стратегій
Маркетплейс торгових стратегій — це платформа, де розробники публікують алгоритмічні стратегії, а користувачі підписуються та запускають їх на своїх акаунтах. Працює як App Store, але замість додатків — торгові алгоритми.
Архітектура платформи
Strategy Runtime — середовище виконання. Кожна стратегія запускається в ізольованому контейнері з обмеженими ресурсами та доступом тільки до авторизованих API.
Strategy SDK — інструменти для розробників: типізовані інтерфейси, доступ до ринкових даних, розміщення ордерів через платформний API.
Backtesting Integration — автоматичний бектест кожної стратегії перед публікацією.
Marketplace Frontend — каталог стратегій з фільтруванням, детальні картки, система підписок.
Billing System — прийом платежів та розподіл між платформою та розробником.
Strategy SDK
from abc import ABC, abstractmethod
class StrategyBase(ABC):
"""Базовий клас для усіх стратегій"""
def __init__(self, context: StrategyContext):
self.ctx = context
@abstractmethod
async def on_candle(self, candle: Candle) -> None:
"""Викликається при закритті кожної свічі"""
async def on_trade(self, trade: Trade) -> None:
"""Опційно: викликається при кожній угоді"""
async def on_order_update(self, order: Order) -> None:
"""Опційно: викликається при зміні статусу ордера"""
async def buy_market(self, quantity: float) -> Order:
return await self.ctx.place_order('BUY', 'MARKET', quantity=quantity)
async def sell_market(self, quantity: float) -> Order:
return await self.ctx.place_order('SELL', 'MARKET', quantity=quantity)
def get_position(self) -> float:
return self.ctx.position.quantity
# Приклад простої стратегії від розробника
class RSICrossStrategy(StrategyBase):
"""EMA crossover + RSI фільтр"""
def __init__(self, context, fast_period=9, slow_period=21, rsi_period=14):
super().__init__(context)
self.fast_ema = EMA(fast_period)
self.slow_ema = EMA(slow_period)
self.rsi = RSI(rsi_period)
async def on_candle(self, candle: Candle):
fast = self.fast_ema.update(candle.close)
slow = self.slow_ema.update(candle.close)
rsi = self.rsi.update(candle.close)
position = self.get_position()
if fast > slow and rsi < 70 and position == 0:
await self.buy_market(quantity=self.get_balance() * 0.95 / candle.close)
elif fast < slow and position > 0:
await self.sell_market(quantity=position)
Ізоляція та безпека
Запуск ненадійного коду — серйозний ризик безпеки. Захисти:
Docker контейнери з обмеженнями ресурсів:
services:
strategy-runner:
image: strategy-runtime:latest
mem_limit: 256m
cpus: 0.5
network_mode: none
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
Мережева ізоляція — стратегія не може робити довільні HTTP-запити. Весь доступ до даних — тільки через платформні API.
Code review — ручна перевірка перед публікацією для нових розробників.
Sandbox тестування — автоматичний запуск в sandbox з виявленням підозрілої поведінки.
Конвеєр публікації
Кожна стратегія повинна пройти обов'язковий бектест перед публікацією:
class PublicationPipeline:
REQUIRED_BACKTEST_PERIOD = 365 # днів
async def process_submission(self, strategy: StrategySubmission):
# 1. Статичний аналіз коду
lint_result = await self.code_linter.check(strategy.code)
if lint_result.has_errors:
return PublicationResult.rejected(lint_result.errors)
# 2. Автоматичний бектест
backtest = await self.backtester.run(
strategy=strategy,
symbol=strategy.config.symbol,
period_days=self.REQUIRED_BACKTEST_PERIOD,
)
# 3. Перевірка мінімальних метрик
if backtest.sharpe_ratio < 0.5:
return PublicationResult.rejected("Sharpe ratio below minimum")
if backtest.max_drawdown > 0.5:
return PublicationResult.rejected("Max drawdown exceeds 50%")
# 4. Публікація
published = await self.publish(strategy, backtest)
return PublicationResult.approved(published.id)
Монетизація для розробників
Моделі:
Monthly Subscription — фіксована плата на місяць. Проста, передбачувана дохідність.
Performance Fee — % від прибутку підписчика. Вирівнює стимули.
One-time Purchase — одноразова плата за доступ.
Free + Upsell — базова безкоштовно, вдосконалені функції платно.
Розрахунок доходу:
def calculate_developer_payout(subscription, performance):
if subscription.model == 'MONTHLY':
platform_fee = subscription.price * Decimal('0.30')
return subscription.price - platform_fee
elif subscription.model == 'PERFORMANCE':
profit = performance.follower_profit
if profit <= 0:
return Decimal(0)
developer_share = profit * subscription.performance_fee_pct
platform_fee = developer_share * Decimal('0.30')
return developer_share - platform_fee
Картка стратегії в UI
Ключові дані: графік P&L за часом, max drawdown, Sharpe ratio, win rate, активні підписники, середній час перебування, підтримувані біржі/символи, опис логіки простою мовою, історія версій.
Прозорість критична — користувачі повинні розуміти що робить стратегія, навіть без перегляду коду.







