Как писать свои индикаторы
В этой статье показано, как добавить свой индикатор и вывести его в графике TradeJS.
В TradeJS есть два пути индикаторов:
- TypeScript plugin-индикаторы (эта статья)
- Pine
plot-индикаторы внутри Pine-стратегий
1. Создайте пакет плагина индикаторов
TradeJS загружает индикаторы из плагинов через tradejs.config.ts.
В пакете плагина экспортируйте indicatorEntries:
import type { IndicatorPluginEntry } from '@tradejs/types';
import { defineIndicatorPlugin } from '@tradejs/core/config';
export const indicatorEntries = defineIndicatorPlugin({
indicatorEntries: [
{
indicator: {
id: 'sandboxMomentum',
label: 'Sandbox Momentum',
enabled: false,
},
historyKey: 'sandboxMomentum',
compute: ({ data }) => {
const last = data[data.length - 1];
const prev = data[data.length - 2];
if (!last || !prev || prev.close === 0) {
return null;
}
return ((last.close - prev.close) / prev.close) * 100;
},
renderer: {
shortName: 'SBX MOM',
minHeight: 120,
figures: [
{
key: 'sandboxMomentum',
title: 'Sandbox Momentum: ',
type: 'line',
color: '#f59e0b',
},
{
key: 'sandboxMomentumZero',
title: 'Zero: ',
type: 'line',
color: '#94a3b8',
dashed: true,
constant: 0,
},
],
},
} satisfies IndicatorPluginEntry,
],
}).indicatorEntries;
2. Подключите плагин в tradejs.config.ts
import { defineConfig } from '@tradejs/core/config';
import { basePreset } from '@tradejs/base';
export default defineConfig(basePreset, {
indicators: ['@your-scope/tradejs-indicators-pack'],
});
3. Перезапустите runtime/UI
Перезапустите ваш runtime/UI TradeJS, чтобы он подхватил изменения в реестре плагинов.
4. Выведите индикатор на графике
renderer нужно объявить в indicatorEntries, а дальше проброс делается автоматически:
- Бэкенд отдает
renderersв метаданных индикаторов. - Фронтенд сохраняет renderer-описания в состоянии индикаторов.
- Слой графика создает pane/figures по renderer-описанию.
Минимальная рабочая связка:
{
historyKey: 'sandboxMomentum',
compute: ({ data }) => {
const last = data[data.length - 1];
const prev = data[data.length - 2];
if (!last || !prev || prev.close === 0) return null;
return ((last.close - prev.close) / prev.close) * 100;
},
renderer: {
shortName: 'SBX MOM',
paneId: 'sandbox_momentum_pane',
minHeight: 120,
figures: [
{ key: 'sandboxMomentum', type: 'line', color: '#f59e0b' },
{ key: 'sandboxMomentumZero', type: 'line', constant: 0, dashed: true },
],
},
}
renderer.figures[].keyдолжен совпадать с ключом в свечах (обычноhistoryKey).- Для горизонтальных уровней используйте
constant: тогда значение не нужно писать вcompute. - После этого просто включите индикатор в UI (Indicators), панель/линии появятся автоматически.
5. Чеклист дебага
- Индикатор не виден:
проверьте, что пакет есть в
indicators. - Пустые значения:
убедитесь, что
computeвозвращает конечные числа и корректно обрабатывает warmup. - Неправильная отрисовка:
сверьте
renderer.figures[].keyс ключами истории, которые реально пишутся.