Как создавать стратегии
В TradeJS решение стратегии описывается небольшим типизированным контрактом. Его можно реализовать на TypeScript или связать с отдельным файлом Pine.
TradeJS поддерживает два пути создания стратегий:
Типовая структура стратегии
В публичном пакете @tradejs/strategy-* или в вашем npm-пакете обычно есть:
config.tscore.tsfigures.ts(если стратегия рисует свои линии/точки/зоны)strategy.tsmanifest.tsadapters/ai.ts(опционально)adapters/ml.ts(опционально)hooks.ts(опционально)
Контракт среды исполнения
core.ts возвращает один из трех вариантов:
skipentryexit
Общая среда исполнения отвечает за:
- дополнение сигнала данными ИИ и модели машинного обучения
- проверки правил
- исполнение ордера
- хуки жизненного цикла
Файлы:
@tradejs/node/strategies@tradejs/core/strategies- Хуки жизненного цикла стратегий
Правило импортов:
- импортируйте код среды исполнения Node.js из
@tradejs/node/strategies - импортируйте чистые вспомогательные функции стратегии из
@tradejs/core/strategies - импортируйте общие контракты из
@tradejs/types - не импортируйте непубличные внутренние модули напрямую
Пример минимального core.ts
export const createMyStrategyCore: CreateStrategyCore<
MyStrategyConfig
> = async ({ strategyApi }) => {
return async () => {
const position = await strategyApi.getCurrentPosition();
if (position && position.qty > 0) {
return strategyApi.skip('POSITION_EXISTS');
}
const { currentPrice } = await strategyApi.getDecisionPriceContext();
const { stopLossPrice, takeProfitPrice } =
strategyApi.getDirectionalTpSlPrices({
price: currentPrice,
direction: 'LONG',
takeProfitDelta: 2,
stopLossDelta: 1,
unit: 'percent',
});
return strategyApi.entry({
direction: 'LONG',
orderPlan: {
qty: 1,
stopLossPrice,
takeProfits: [{ rate: 1, price: takeProfitPrice }],
},
});
};
};
Правила доступа к данным через StrategyAPI
- Используйте
getDecisionPriceContext()для текущей закрытой свечи, времени и цены в момент сигнала. - Используйте
getCurrentIndicatorsContext()для типизированного снимка индикаторов иbaseContext. Тип снимка наследуется изCreateStrategyCore; не передавайте параметр типа самому методу. - Вызывайте
getCurrentPosition()один раз и определяйте наличие позиции поqty. - Полная история рынка недоступна через
StrategyAPI. Детектор с внутренним состоянием должен восстановиться из начальных данных и хранить только необходимое скользящее окно ограниченного размера. - Возвращайте выход через
strategyApi.exit({ code, direction }). Цена и время выхода определяются по текущей закрытой свече и не могут быть переопределены стратегией.
Где настраивается среда исполнения
-
manifest.ts:entryRuntimeDefaultshooksaiAdaptermlAdapter
-
tradejs.config.ts:hooksдля общей логики сразу на все стратегии текущего проекта- подходит для общих правил риска, управления позициями нескольких стратегий и общих фильтров ордеров
-
adapters/*:- преобразование правил из конфигурации (
mapEntryRuntimeFromConfig) - подготовка данных для ИИ и модели машинного обучения
- преобразование правил из конфигурации (
Пошаговые руководства
Внешняя стратегия как npm-плагин
import { defineConfig } from '@tradejs/core/config';
import { basePreset } from '@tradejs/base';
export default defineConfig(basePreset, {
strategies: ['@scope/tradejs-strategy-pack'],
});
Пример плагина:
- публикуйте стратегию как npm-пакет и подключайте через
strategies