Скрипты: как написать стратегию

Скрипт стратегии определяет функцию decide(bars, params, ctx, state) и возвращает одно решение на каждый закрытый бар. Это решение управляет симулированным оценочным счётом и ничем больше.

Senzoukria · Документация · Обновлено: сентябрь 2026


Где найти

Где
Страница «Скрипты» → Новая стратегия
Точка входа
decide(bars, params, ctx, state), возвращает решение или null
Ритм
Один раз на закрытый бар — формирующийся бар не передаётся никогда
Счёт
Симулированный оценочный счёт на этом компьютере; платформа не отправляет ордера брокеру
Языки
JavaScript и Python используют одну точку входа и одну и ту же форму решения

Что она делает

Стратегия выполняется в той же песочнице, что и индикатор. После вашего кода дописывается короткая обёртка — именно после, чтобы номера строк остались теми, которые вы видите в редакторе, — она вызывает decide(), приводит ответ к норме и переносит объект state на следующий бар.

Если decide() не определена, запуск завершается сообщением о том, что стратегия обязана определить decide(bars, params, ctx, state). Если функция вернула undefined или null, это допустимый ответ со смыслом «на этом баре сделки нет», и лента запуска сообщает «Сделок на этой выборке нет».

Контекст несёт симулированную позицию, признак отсутствия позиции и шаг цены, поэтому расстояния выражаются в тиках, и тот же скрипт работает на другом контракте без правок.

Объект решения

Что может вернуть decide()
ПолеПо умолчаниюЧто меняет
action: "buy"Открывает длинную позицию по рынку на симулированном счёте, с учётом ограничителей счёта.
action: "sell"Открывает короткую позицию по рынку, с теми же ограничителями.
action: "close"Закрывает открытую позицию; при отсутствии позиции безвредно.
qty1Контракты. Округляется вниз и ограничивается снизу единицей.
stopTicksнетРасстояние выхода по убытку в тиках от цены исполнения.
targetTicksнетРасстояние выхода по прибыли в тиках.
nullНа этом баре сделки нет.
state{}Всё, что вы сохраните в объекте state, вернётся вам на следующем баре; при смене скрипта состояние очищается.

Как этим пользоваться

  • Начните с шаблона стратегии пробоя: он покупает пробой максимума N баров с фиксированным стопом и целью и показывает, как использовать переносимое состояние, чтобы считать бары удержания позиции.
  • Сначала запустите на тестовых данных — запуск стратегии сообщает, было ли вообще возвращено решение, и это самый быстрый способ найти условие, которое никогда не срабатывает.
  • Затем подключите её на панели автостратегии в Реплее, чтобы наблюдать её решения бар за баром на реальных воспроизводимых данных.
  • Выражайте риск в тиках, а не в ценах: шаг цены приходит в контексте, и счёт сам переводит расстояние в уровень выхода.

Ограничения и подводные камни

  • Ограничители счёта применяются до любого входа: пробитая просадка, достигнутый дневной лимит убытка или превышенный потолок по контрактам отклоняют вход, и панель показывает причину.
  • Возвращаемое значение, не являющееся распознанным решением, сообщается как таковое, с перечислением допустимых форм.
  • Поскольку решения принимаются на закрытых барах, стратегия не может реагировать на движение внутри бара — именно это делает сопоставимыми живой прогон в симуляции и бэктест того же кода.
  • Ни один скрипт не доберётся до брокера. Стратегия здесь — это стратегия на бумаге, и ни один её результат не является обещанием по поводу реальной торговли.

Эта страница на других языках

Частые вопросы

Можно ли написать стратегию на Python?
Да. Обёртка существует на каждом языке и дописывается на языке скрипта, поэтому стратегия на Python получает обёртку на Python. Ключи решения пишите как stopTicks и targetTicks: панель автостратегии читает именно их. Цикл бэктеста на Python принимает также stop_ticks и target_ticks.
Как сохранить значение между барами?
Запишите его в объект state, переданный четвёртым аргументом. Он вернётся при следующем вызове и обнулится при смене скрипта.
Почему мою покупку отклонили?
Либо её заблокировал ограничитель счёта — причина выводится, — либо по инструменту не было живой цены, и тогда вход ждёт, а не выдумывает исполнение.