Как работает и настраивается ИИ
ИИ в TradeJS дополнительно проверяет сигнал перед исполнением ордера.
Модуль
@tradejs/node
Откуда берется конфигурация
TradeJS ищет данные для подключения к ИИ в таком порядке:
- Настройки аккаунта в Redis-записи текущего пользователя.
В веб-интерфейсе нажмите шестерёнку на левой боковой панели и укажите в настройках аккаунта:
AI_API_KEYAI_API_ENDPOINT
Эти значения хранятся на уровне пользователя, поэтому разные операторы могут использовать разные ключи или провайдеры без общего глобального секрета.
Как работает проверка
Для entry с сигналом:
- TradeJS формирует данные для проверки.
- Сохраняет результат в Redis (
analysis:<symbol>:<signalId>). - Вне бэктеста может заблокировать ордер, если оценка ниже порога.
Если стратегия не задала порог, TradeJS использует значение 4. Встроенные
стратегии задают MIN_AI_QUALITY в своей конфигурации. Поэтому проверяйте
итоговую конфигурацию стратегии и не рассчитывайте на одно общее значение.
Примечания:
AI_API_KEYиAI_API_ENDPOINTнужно задавать в записи пользователя, а не в переменных окружения приложения.- Для стандартной точки подключения OpenAI явно сохраните
https://api.openai.com/v1в настройках пользователя.
Чтобы проверить изменения фильтра до выхода в рабочий режим, см. Проверка ИИ-фильтра на данных бэктестов. Этот сценарий использует набор данных из бэктеста и прогоняет текущую логику запросов на том же наборе исторических сделок.
AI_MODE
Через AI_MODE можно выбрать способ проверки ордеров в рабочем режиме при AI_ENABLED=true.
AI_MODE=llm— TradeJS отправляет данные выбранному поставщику ИИ и принимает решение по оценке модели.AI_MODE=gate— TradeJS применяет локальные детерминированные правила стратегии. Результаты проверки всё равно сохраняются для последующего разбора и сравнения.
MIN_AI_QUALITY остается общим порогом в обоих режимах.
На практике:
AI_MODE=gateближе всего кai-train --localOnly: оба режима используют одинаковые локальные правила допуска.AI_MODE=llmнужно проверять обычным запускомai-trainили по записям рабочего процесса, потому что ответ поставщика может отличаться от результата локальных правил.
Пример:
{
"AI_ENABLED": true,
"AI_MODE": "gate",
"MIN_AI_QUALITY": 4
}
Пример адаптера TrendLine
TrendLine добавляет в общие данные поле trendline с полной геометрией линии:
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 в манифесте стратегии.
TradeJS сохраняет основной запрос и добавляет к нему ваши блоки.
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}
`,
};
Затем подключите адаптер в манифесте:
import type { StrategyManifest } from '@tradejs/types';
import { myStrategyAiAdapter } from './adapters/ai';
export const myStrategyManifest: StrategyManifest = {
name: 'MyStrategy',
aiAdapter: myStrategyAiAdapter,
};
Важно:
- так можно изменить запрос для конкретной стратегии через публичный интерфейс
- основной запрос по-прежнему применяется, а ваши блоки добавляются к системной и пользовательской частям
Логика фильтра перед размещением ордера
const minAiQuality = runtime.ai?.minQuality ?? 4;
const shouldMakeOrder =
makeOrdersEnabled &&
(!signal || env === 'BACKTEST' || quality == null || quality >= minAiQuality);
Если проверка не пройдена, сигнал сохраняется, но ордер не отправляется.
ИИ и машинное обучение
- Модель машинного обучения добавляет вероятности и метаданные.
- ИИ оценивает качество сетапа и может заблокировать исполнение.