Базовый API
@tradejs/core — публичный пакет для разработки strategy и indicator плагинов в TradeJS.
Что экспортируется
defineConfig(basePreset, overrides)defineStrategyPlugin(plugin)defineIndicatorPlugin(plugin)defineConnectorPlugin(plugin)- общие типы доступны из
@tradejs/types
Правило импортов
- Импортируйте config/plugin registration из
@tradejs/core/config. - Импортируйте runtime/хелперы из явных публичных subpath’ов вроде
@tradejs/node/strategies,@tradejs/node/backtest,@tradejs/core/indicators,@tradejs/core/math,@tradejs/core/time,@tradejs/node/pine. - Импортируйте общие типы из
@tradejs/types. - Не используйте непубличные deep-imports.
Конвенции по утилитам (для контрибьюторов)
- Browser-safe helper’ы держите в
@tradejs/core, Node runtime helper’ы в@tradejs/node, infra-адаптеры в@tradejs/infra. - Тестовые helper-утилиты изолируйте от runtime-кода и экспортируйте только стабильные API.
- Избегайте дублирования helper-логики в runtime-файлах; выносите общий код в единые функции.
Как подключить плагины
Создайте tradejs.config.ts в корне проекта:
import { defineConfig } from '@tradejs/core/config';
import { basePreset } from '@tradejs/base';
export default defineConfig(basePreset, {
strategies: ['@scope/my-strategy-plugin', './src/plugins/strategy.ts'],
indicators: ['@scope/my-indicator-plugin', './src/plugins/indicator.ts'],
connectors: ['@scope/my-connector-plugin', './src/plugins/connector.ts'],
hooks: {
onBar: async ({ ctx, market }) => {
void ctx;
void market;
},
},
});
Каждый элемент в списке плагинов — это строка-модуль:
- npm-пакет (например
@scope/my-plugin) - локальный относительный путь от корня проекта (например
./src/plugins/connector.ts) - абсолютный путь или
file://URL
Поддерживаемые имена файла:
tradejs.config.tstradejs.config.mtstradejs.config.jstradejs.config.mjstradejs.config.cjs
Общие хуки проекта
tradejs.config.ts поддерживает project-level hooks. Они применяются ко всем стратегиям, которые загружены текущим config.
import { defineConfig } from '@tradejs/core/config';
import { basePreset } from '@tradejs/base';
export default defineConfig(basePreset, {
hooks: {
beforeSignals: async ({
connectorName,
tickers,
runtimeStrategies,
}) => {
void connectorName;
void tickers;
void runtimeStrategies;
},
onBar: async ({ ctx, market }) => {
// Вызывается для каждой подключенной стратегии на каждой свече.
// Подходит для общих risk rules и cross-strategy проверок.
void ctx;
void market;
},
beforePlaceOrder: async ({ ctx, entry }) => {
// Вызывается перед постановкой ордера для любого entry.
void ctx;
void entry;
},
},
});
Используйте project hooks, когда логика должна быть общей для нескольких стратегий в одном проекте. Стратегически-специфичные hooks оставляйте в manifest.ts.
У project hooks есть две группы:
- strategy runtime hooks, например
onBar,afterBarDecisionиbeforePlaceOrder - batch hooks для signals, например
beforeSignalsиafterSignals
beforeSignals и afterSignals оборачивают весь пайплайн npx @tradejs/cli signals, а не одну свечу конкретной стратегии. Их можно объявлять только в tradejs.config.ts, но не в manifest.ts.
beforeSignals может прервать текущий прогон signals:
export default defineConfig(basePreset, {
hooks: {
beforeSignals: async () => {
return {
abort: true,
reason: 'GLOBAL_UNREALIZED_PNL_TARGET_REACHED_CLOSE_ALL',
};
},
},
});
afterSignals получает итог выполнения: найденные сигналы, статус и общую длительность прогона.
Готовые project hook helpers
@tradejs/node/strategies экспортирует опциональные helpers для типовых
runtime risk controls. Они не включаются автоматически через basePreset;
добавляйте только те хуки, которые нужны конкретному проекту.
import { defineConfig } from '@tradejs/core/config';
import { basePreset } from '@tradejs/base';
import { getBuiltInStrategyDefaultConfig } from '@tradejs/strategies';
import {
closeOppositePositionsBeforeOpen,
createCloseAllOnGlobalProfitBeforeSignalsHook,
createMoveStopToBreakEvenOnBarHook,
} from '@tradejs/node/strategies';
export default defineConfig(basePreset, {
hooks: {
beforeSignals: createCloseAllOnGlobalProfitBeforeSignalsHook({
getStrategyDefaultConfig: getBuiltInStrategyDefaultConfig,
profitRiskMultiplier: 5,
}),
onBar: createMoveStopToBreakEvenOnBarHook(),
beforePlaceOrder: async ({ ctx, entry }) => {
if (!ctx.strategyConfig.CLOSE_OPPOSITE_POSITIONS) {
return;
}
await closeOppositePositionsBeforeOpen({
connector: ctx.connector,
entryContext: entry.context,
});
},
},
});
Доступные helpers:
closeOppositePositionsBeforeOpen(...)закрывает уже открытые позиции на других символах с противоположным направлением перед постановкой нового entry. Используйте его изbeforePlaceOrder, если проекту нужна cross-symbol очистка позиций перед новым ордером.createCloseAllOnGlobalProfitBeforeSignalsHook(...)создаетbeforeSignalshook. Он проверяет общий unrealized PnL до обработки тикеров, закрывает все открытые позиции при достижении глобального порога и прерывает текущий запускsignals.createMoveStopToBreakEvenOnBarHook(...)создаетonBarhook. Он переносит stop loss в цену входа позиции после того, как движение в плюс достигло заданного множителя риска. Без параметров используется дефолтный trigger в половину риска.
createCloseAllOnGlobalProfitBeforeSignalsHook принимает:
getStrategyDefaultConfig(strategyName)— опциональный resolver, который нужен, чтобы объединить default config стратегии с runtime config перед чтениемMAX_LOSS_VALUE.profitRiskMultiplier— опциональный множитель для порога от среднегоMAX_LOSS_VALUE.
createMoveStopToBreakEvenOnBarHook принимает:
isEnabled(config)— опциональный predicate для включения хука по config конкретной стратегии.triggerRiskMultiplier— опциональный множитель от текущего или сконфигурированного процента риска. Дефолт —0.5.
Для одного и того же stage:
- сначала выполняются project hooks из
tradejs.config.ts - затем hooks из
manifest.ts - hooks merge’ятся дополнительно, поэтому strategy-local hooks не отключаются
Strategy plugin API
Плагин стратегии экспортирует strategyEntries:
import { defineStrategyPlugin } from '@tradejs/core/config';
import type { StrategyRegistryEntry } from '@tradejs/types';
const strategyEntries: StrategyRegistryEntry[] = [
{
manifest: { name: 'MyStrategy' },
creator: async () => {
return async () => 'NO_SIGNAL';
},
},
];
export default defineStrategyPlugin({ strategyEntries });
Strategy Manifest
Каждый strategy entry содержит manifest с полями:
- обязательное
name - опциональные
hooks - опциональный
aiAdapter - опциональный
mlAdapter
Подробно про lifecycle-хуки: Strategy Runtime Hooks.
Indicator plugin API
Плагин индикаторов экспортирует indicatorEntries:
import { defineIndicatorPlugin } from '@tradejs/core/config';
export default defineIndicatorPlugin({
indicatorEntries: [
{
indicator: { id: 'myIndicator', label: 'My Indicator', enabled: false },
historyKey: 'myIndicatorHistory',
compute: ({ data }) => data.at(-1)?.close ?? null,
renderer: {
indicatorName: 'MY_INDICATOR',
shortName: 'MY_IND',
paneId: 'candle_pane',
figures: [{ key: 'myIndicator', title: 'MY_IND', type: 'line' }],
},
},
],
});
Connector plugin API
Плагин коннекторов экспортирует connectorEntries:
import { defineConnectorPlugin } from '@tradejs/core/config';
import type { ConnectorRegistryEntry } from '@tradejs/types';
const connectorEntries: ConnectorRegistryEntry[] = [
{
name: 'MyExchange',
providers: ['myexchange', 'mx'],
creator: async ({ userName }) => {
return {
kline: async () => [],
getTickers: async () => [],
getPosition: async () => null,
getPositions: async () => [],
placeOrder: async () => true,
closePosition: async () => true,
getState: async () => ({}),
setState: async () => {},
};
},
},
];
export default defineConnectorPlugin({ connectorEntries });
Типы, которые чаще всего нужны
StrategyCreatorStrategyDecisionStrategyAPISignalDirection,Interval,Candle
Общие контракты лежат в @tradejs/types, а публичные helper/runtime entrypoint’ы — в @tradejs/core/* и @tradejs/node/*.