Как работает и настраивается ИИ
AI в TradeJS — это runtime-слой дополнительной проверки сигнала перед исполнением ордера.
Runtime-модуль
@tradejs/node
Откуда берется конфигурация
TradeJS ищет AI credentials в таком порядке:
- Настройки аккаунта в Redis-записи текущего пользователя.
В web UI откройте drawer настроек аккаунта через шестеренку в левом сайдбаре и задайте:
OPENAI_API_KEYOPENAI_API_ENDPOINT
Эти значения хранятся на уровне пользователя, поэтому разные операторы могут использовать разные ключи или провайдеры без общего глобального секрета.
Поведение runtime
Для entry с сигналом:
- Runtime строит AI payload.
- Сохраняет анализ в Redis (
analysis:<symbol>:<signalId>). - В non-backtest режиме может заблокировать ордер по quality threshold.
Порог по умолчанию: 4.
Примечания:
OPENAI_API_KEYиOPENAI_API_ENDPOINTдолжны задаваться в записи пользователя, а не в app environment variables.- Если нужен стандартный OpenAI endpoint, сохраните
https://api.openai.com/v1в настройках пользователя явно.
Если нужно проверить изменения AI-фильтра до выхода в рабочий режим, см. Проверка AI-фильтра на данных бэктестов. Этот сценарий использует AI-датасет, выгруженный из бэктеста, чтобы прогнать текущую логику промптов на том же историческом наборе сделок.
AI_MODE
Используйте AI_MODE, чтобы выбрать, какой AI decision path управляет live-апрувом ордера при AI_ENABLED=true.
AI_MODE=llm— runtime отправляет payload в настроенный AI provider и использует ответ модели для quality gate.AI_MODE=gate— runtime использует локальный deterministic strategy gate для апрува, при этом AI analysis records все равно сохраняются для последующего разбора и сравнения.
MIN_AI_QUALITY остается общим порогом в обоих режимах.
Практически это означает:
AI_MODE=gateближе всего кai-train --localOnly, потому что оба режима используют одну и ту же локальную deterministic approval logic.AI_MODE=llmнужно валидировать обычнымai-trainили live/runtime records, потому что ответ провайдера может отличаться от локального gate.
Пример:
{
"AI_ENABLED": true,
"AI_MODE": "gate",
"MIN_AI_QUALITY": 4
}
Пример TrendLine adapter
TrendLine расширяет общий payload полем trendline без trim:
export const trendLineAiAdapter: StrategyAiAdapter = {
buildPayload: ({ signal, basePayload }) => ({
...basePayload,
figures: {
...basePayload.figures,
trendline: signal.figures?.trendLine ?? null,
},
}),
mapEntryRuntimeFromConfig: (config) =>
mapAiRuntimeFromConfig(
config as Pick<TrendLineConfig, 'AI_ENABLED' | 'MIN_AI_QUALITY'>,
),
};
Как подменить промпт для своей стратегии
Используйте aiAdapter в manifest вашей стратегии.
Runtime сохраняет базовый prompt и добавляет ваши add-on блоки.
import type { StrategyAiAdapter } from '@tradejs/types';
export const myStrategyAiAdapter: StrategyAiAdapter = {
buildSystemPromptAddon: ({ signal }) => `
Дополнительные правила для ${signal.strategy}:
- Делай акцент на подтверждении пробоя + согласовании с объемом.
- Если подтверждения по объему нет, снижай quality до <= 3.
`,
buildHumanPromptAddon: ({ signal }) => `
Дополнительный контекст:
- riskRatio=${signal.prices.riskRatio}
- symbol=${signal.symbol}
`,
};
Затем подключите adapter в manifest:
import type { StrategyManifest } from '@tradejs/types';
import { myStrategyAiAdapter } from './adapters/ai';
export const myStrategyManifest: StrategyManifest = {
name: 'MyStrategy',
aiAdapter: myStrategyAiAdapter,
};
Важно:
- это публичный способ кастомизировать поведение prompt для конкретной стратегии
- базовый runtime-prompt все равно применяется; ваши add-on просто дописываются в system/human prompt
Реальный паттерн gate-логики
const minAiQuality = runtime.ai?.minQuality ?? 4;
const shouldMakeOrder =
makeOrdersEnabled &&
(!signal || env === 'BACKTEST' || quality == null || quality >= minAiQuality);
Если gate не пройден, сигнал сохраняется, но ордер не отправляется.
AI + ML в одном runtime
- ML добавляет вероятности/метаданные.
- AI оценивает качество сетапа и может заблокировать исполнение.