Хуки жизненного цикла стратегий
Среда исполнения вызывает хуки, то есть обработчики жизненного цикла, до и после решения стратегии, оценки с помощью ИИ и машинного обучения, а также постановки ордера.
Хуки можно объявлять в двух местах:
- локально для стратегии в
manifest.tsчерезmanifest.hooks - на уровне проекта в
tradejs.config.tsчерезhooks
Обработчики из tradejs.config.ts применяются ко всем стратегиям проекта.
Обработчики из manifest.ts добавляются к ним. На каждом этапе сначала работают
обработчики проекта, а затем обработчики стратегии.
Порядок вызова
- onInit — один раз при создании среды исполнения
- onBar — на каждой свече до
core.ts - afterCoreDecision — после
core.ts, только еслиcore.tsвообще выполнялся - afterBarDecision — после финального решения по свече, независимо от того, пришло оно из
onBarили изcore.ts - onSkip — только для
skip - beforeClosePosition — проверка, которая может заблокировать закрытие
- afterEnrichMl — только когда есть
decision.signal - afterEnrichAi — только когда есть
decision.signal - beforeEntryGate — проверка, которая может заблокировать вход
- beforePlaceOrder — прямо перед вызовом коннектора
- afterPlaceOrder — после успешной постановки ордера
- onRuntimeError — при любой ошибке среды исполнения или хука
Общая структура параметров
Каждый хук получает нужную для своего этапа часть одного и того же вложенного объекта:
{
ctx?: StrategyHookCtx;
market?: StrategyHookMarketContext;
decision?: StrategyDecision;
entry?: StrategyHookEntryContext;
ml?: StrategyHookMlContext;
ai?: StrategyHookAiContext;
policy?: StrategyHookPolicyContext;
order?: StrategyHookOrderContext;
error?: StrategyHookErrorPayload;
}
Общие вложенные объекты
ctx:
{
connector: Connector;
strategyName: string;
userName: string;
symbol: string;
strategyConfig: StrategyConfig;
env: string;
isConfigFromBacktest: boolean;
}
market:
{
candle?: KlineChartItem;
btcCandle?: KlineChartItem;
data?: KlineChartItem[];
btcData?: KlineChartItem[];
}
entry:
{
context: StrategyEntrySignalContext;
orderPlan: StrategyEntryOrderPlan;
signal?: Signal;
runtime: {
raw?: StrategyEntryRuntimeOptions;
resolved: StrategyEntryRuntimeOptions;
};
}
ml:
{
config?: StrategyRuntimeMlOptions;
attempted: boolean;
applied: boolean;
result?: Signal['ml'];
skippedReason?:
| 'BACKTEST'
| 'DISABLED'
| 'NO_RUNTIME'
| 'NO_STRATEGY_CONFIG'
| 'NO_THRESHOLD'
| 'NO_RESULT';
}
ai:
{
config?: StrategyRuntimeAiOptions;
attempted: boolean;
applied: boolean;
quality?: number;
skippedReason?: 'BACKTEST' | 'DISABLED' | 'NO_RUNTIME' | 'NO_QUALITY';
}
policy:
{
aiQuality?: number;
makeOrdersEnabled: boolean;
minAiQuality: number;
}
order:
{
result: Signal | string;
}
error:
{
stage: StrategyHookStage;
cause: unknown;
}
Хуки-проверки возвращают такой объект, если хотят заблокировать исполнение:
{
allow?: boolean;
reason?: string;
}
Важные замечания
- Используйте
tradejs.config.ts -> hooks, когда логика должна применяться сразу ко всем стратегиям проекта: например, для общих правил риска, управления позициями нескольких стратегий или общих фильтров ордеров. beforeSignalsиafterSignalsтоже задаются на уровне проекта вtradejs.config.ts, но относятся к жизненному циклу командыsignals, а не к среде исполнения отдельной стратегии, описанной на этой странице.- Логику, которая нужна только одной стратегии, оставляйте в
manifest.hooks. entry.runtime.rawсодержит исходные настройки, которыеcore.tsвернул черезstrategyApi.entry(...).entry.runtime.resolvedсодержит итоговые настройки после объединения значений из манифеста, конфигурации адаптера и решения стратегии.afterEnrichMlописывает весь этап машинного обучения, а не только успешный результат. Проверяйтеml.attempted,ml.appliedиml.skippedReason.afterEnrichAiработает так же через объектai.afterCoreDecisionвызывается строго послеcore.ts. ЕслиonBarзавершил обработку свечи раньше, а вам всё равно нужно итоговое решение, используйтеafterBarDecision.- Ошибки неблокирующих хуков не прерывают работу: среда исполнения записывает их в журнал, вызывает
onRuntimeErrorи продолжает выполнение. - Ошибки в хуках-проверках (
beforeClosePosition,beforeEntryGate) тоже не прерывают работу. Среда исполнения ведёт себя так, будто хук вернулundefined.