Скрипты: как написать стратегию
Скрипт стратегии определяет функцию 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, это допустимый ответ со смыслом «на этом баре сделки нет», и лента запуска сообщает «Сделок на этой выборке нет».
Контекст несёт симулированную позицию, признак отсутствия позиции и шаг цены, поэтому расстояния выражаются в тиках, и тот же скрипт работает на другом контракте без правок.
Объект решения
| Поле | По умолчанию | Что меняет |
|---|---|---|
| action: "buy" | — | Открывает длинную позицию по рынку на симулированном счёте, с учётом ограничителей счёта. |
| action: "sell" | — | Открывает короткую позицию по рынку, с теми же ограничителями. |
| action: "close" | — | Закрывает открытую позицию; при отсутствии позиции безвредно. |
| qty | 1 | Контракты. Округляется вниз и ограничивается снизу единицей. |
| stopTicks | нет | Расстояние выхода по убытку в тиках от цены исполнения. |
| targetTicks | нет | Расстояние выхода по прибыли в тиках. |
| null | — | На этом баре сделки нет. |
| state | {} | Всё, что вы сохраните в объекте state, вернётся вам на следующем баре; при смене скрипта состояние очищается. |
Как этим пользоваться
- Начните с шаблона стратегии пробоя: он покупает пробой максимума N баров с фиксированным стопом и целью и показывает, как использовать переносимое состояние, чтобы считать бары удержания позиции.
- Сначала запустите на тестовых данных — запуск стратегии сообщает, было ли вообще возвращено решение, и это самый быстрый способ найти условие, которое никогда не срабатывает.
- Затем подключите её на панели автостратегии в Реплее, чтобы наблюдать её решения бар за баром на реальных воспроизводимых данных.
- Выражайте риск в тиках, а не в ценах: шаг цены приходит в контексте, и счёт сам переводит расстояние в уровень выхода.
Ограничения и подводные камни
- Ограничители счёта применяются до любого входа: пробитая просадка, достигнутый дневной лимит убытка или превышенный потолок по контрактам отклоняют вход, и панель показывает причину.
- Возвращаемое значение, не являющееся распознанным решением, сообщается как таковое, с перечислением допустимых форм.
- Поскольку решения принимаются на закрытых барах, стратегия не может реагировать на движение внутри бара — именно это делает сопоставимыми живой прогон в симуляции и бэктест того же кода.
- Ни один скрипт не доберётся до брокера. Стратегия здесь — это стратегия на бумаге, и ни один её результат не является обещанием по поводу реальной торговли.
Связанные страницы
- Запуск стратегии на симулированном счёте
- Галерея шаблонов скриптов
- Скрипты на Python (движок Pyodide)
- Бэктест
Эта страница на других языках
Частые вопросы
- Можно ли написать стратегию на Python?
- Да. Обёртка существует на каждом языке и дописывается на языке скрипта, поэтому стратегия на Python получает обёртку на Python. Ключи решения пишите как stopTicks и targetTicks: панель автостратегии читает именно их. Цикл бэктеста на Python принимает также stop_ticks и target_ticks.
- Как сохранить значение между барами?
- Запишите его в объект state, переданный четвёртым аргументом. Он вернётся при следующем вызове и обнулится при смене скрипта.
- Почему мою покупку отклонили?
- Либо её заблокировал ограничитель счёта — причина выводится, — либо по инструменту не было живой цены, и тогда вход ждёт, а не выдумывает исполнение.