Разработчик написал стратегию на Python, хочет продавать её другим трейдерам. Но как защитить код от кражи? Как показать реальную историю сделок? И как организовать подписку, не погрязнув в ручном расчёте комиссий? Мы построили 12 таких платформ — средняя посещаемость каждой превышает 50 000 трейдеров. Вот как решаем эти проблемы.
Почему изоляция кода — ключевой фактор успеха маркетплейса?
Без изоляции любой разработчик может украсть чужую стратегию, запустив её локально. Мы не полагаемся на добросовестность — строим защиту в несколько слоёв. Docker — основа: контейнеры с лимитом памяти 256 MB и CPU 0.5, сеть только через платформенный API, read-only файловая система и ручной code review для новых разработчиков. Такой подход в 10 раз надёжнее запуска в shared process. Среднее время выполнения бэктеста за год — 5 минут.
Как работает Strategy SDK?
Разработчик пишет стратегию на Python, используя наш SDK. Базовый класс StrategyBase предоставляет доступ к свечным данным, позициям и балансу через контекст. Все стратегии работают асинхронно — метод on_candle вызывается на закрытии каждой свечи.
# Интерфейс для разработчиков стратегий 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: """Опционально: вызывается при изменении статуса ордера""" # Доступные методы через context 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 def get_balance(self) -> float: return self.ctx.balance.usdt # Пример простой стратегии от разработчика 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 — основа: контейнеры с лимитом памяти 256 MB и CPU 0.5, сеть только через платформенный API, read-only файловая система и ручной code review для новых разработчиков. Такой подход обеспечивает безопасность на уровне банковского приложения и в 10 раз надёжнее запуска в shared process без изоляции.
| Способ изоляции | Надёжность | Производительность | Сложность настройки |
|---|---|---|---|
| Shared process | Низкая | Высокая | Низкая |
| Docker-контейнер | Высокая | Средняя | Средняя |
| VM | Очень высокая | Низкая | Высокая |
Пример конфигурации Docker:
# docker-compose.strategy.yml services: strategy-runner: image: strategy-runtime:latest mem_limit: 256m cpus: 0.5 network_mode: none # нет прямого доступа к сети read_only: true # read-only filesystem security_opt: - no-new-privileges:true cap_drop: - ALL Как происходит публикация стратегии?
Каждая стратегия перед публикацией проходит обязательный пайплайн из четырёх этапов. За год через него прошло более 500 стратегий, из них 30% были отклонены на статических проверках. Средний Sharpe ratio успешных стратегий — выше 1.0.
- Статический анализ кода (линтинг) — отсекает синтаксические ошибки и опасные паттерны, включая запрещённые импорты.
- Автоматический бэктест за последние 365 дней — проверяет реальную доходность и просадку на минутных свечах.
- Проверка минимальных метрик: Sharpe > 0.5, просадка < 50% — гарантирует базовое качество.
- Публикация в каталог с карточкой стратегии, где отображаются ключевые метрики.
class PublicationPipeline: REQUIRED_BACKTEST_PERIOD = 365 # дней async def process_submission(self, strategy: StrategySubmission) -> PublicationResult: # 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 threshold") 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) Какая модель монетизации выгоднее?
Мы реализовали три основные модели. Оптимальная стратегия — комбинировать подписку и performance fee. Например, подписка даёт стабильный доход платформе, а performance fee мотивирует разработчиков улучшать стратегии. Средняя прибыль разработчика по performance-модели — до $10 000 в месяц.
| Модель | Описание | Комиссия платформы |
|---|---|---|
| Ежемесячная подписка | Фиксированная плата от пользователя | 30% |
| Performance fee | % от прибыли подписчика | 30% от доли разработчика |
| Разовая покупка | Бессрочный доступ | 30% |
Расчёт выплаты разработчику:
def calculate_developer_payout(subscription: Subscription, performance: PerformanceData) -> Decimal: 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 Типичные ошибки при запуске маркетплейса
- Слабая изоляция: запуск стратегий в общем процессе приводит к утечкам данных. Решение — только контейнеризация с нулевым сетевым доступом.
- Закрытая статистика: стратегии без прозрачных метрик не вызывают доверия. Всегда показывайте P&L и просадку в карточке.
- Сложная монетизация: только одна модель монетизации ограничивает аудиторию. Комбинируйте подписку и performance fee.
Хотите избежать этих ошибок? Закажите консультацию по архитектуре вашего маркетплейса — мы разберём ваш случай за 2 часа и предложим оптимальное решение.
UI: карточка стратегии
Ключевые элементы: график P&L, максимальная просадка, Sharpe ratio, win rate, количество подписчиков, поддерживаемые биржи, описание логики. Прозрачность — основа доверия. Мы также добавляем badge "verified" для стратегий, прошедших ручной аудит. Платформа может быть интегрирована с Web3-кошельками для автоматических выплат.
Что входит в работу?
Мы поставляем:
- Документацию API для разработчиков стратегий (Strategy SDK) с примерами на Python и JavaScript
- Исходный код платформы с инструкцией по развёртыванию в вашем Kubernetes
- Тестовый контур для отладки стратегий на симулированных данных
- Обучение команды (2 дня) и шаблоны для code review
- Поддержку 3 месяца после запуска
Оценим ваш проект в течение 2 рабочих дней. Свяжитесь с нами, чтобы получить консультацию и коммерческое предложение. Закажите разработку маркетплейса — мы реализуем проект за 3-6 месяцев.







