Всех приветствую!
Пятая статья в нашей серии про ИИ-вайбкодинг и создание торговых роботов по своим идеям.
И сегодня рассмотрим то, как писать Технические Задания для ИИ. А именно, ТЗ на самих роботов. Современные программисты называют это вместо «ТЗ» — «ПРОМПТ», чтобы это не значило… Я далее тоже буду Тех Задания для ИИ называть ПРОМПТ. Я — «современный малолетний программист».
В общем. Учимся писать Промпты на создание роботов.

ВАЖНО! Внизу представлены Промпты, которые собираются современными моделями с первого раза и без ошибок. Роботов по ним можно тут же запускать в тестере и в реале. Если у Вас проблемы, используйте хорошую модель.
Не забываем, перед тем, как просить ИИ написать робота, надо скормить ему контекст. Мы это уже обсуждали в этой серии, но важно повториться. Без этого мало что получится даже с таким хорошим ИИ как Kimi k2.7.
Пишем в чат с ИИ, чтобы очень подробно прочитал контекст в папке проекта.
Выглядеть в чате это может так:
Если открыть чат с ИИ и написать: «Напиши робота на московскую биржу, чтобы знал, когда зарабатывать, только в прибыль работал» — можно получить исключительно плохой результат (натуральный Кал!). Вполне возможно, конкретно Kimi даже напишет с первого раза робота, который будет работать, но это не то, что нужно.
Поэтому никогда так не делайте!
И если вспомнить, что «ПРОМПТ» – это ТЗ, то есть замечательная поговорка про это дело:
«Плохое ТЗ — Результат ХЗ»
Тут – то же самое! Поэтому наберитесь терпения, прежде чем мучить ИИ. Научитесь составлять Промпты.
Было бы замечательно, если бы в Промпте было семь пунктов.
**1. Идея робота своими словами**
Перед цифрами и индикаторами опишите суть стратегии простым языком. Одно-два предложения. Это самый важный пункт, он задаёт направление всему остальному.
Примеры:
— «Ловим тренд по EMA. Не входим во флэт, фильтруем через ADX.»
— «Торгуем отскок от границы канала Bollinger Bands.»
— «Скринер: ищем бумаги, у которых цена пробила верхнюю границу канала.»
ИИ прочитает эту фразу и поймёт, что вы хотите. Всё остальное — детализация.
**2. Тип источника (таб)**
В OsEngine девять типов источников. Выбираем один:
— `BotTabSimple` — один инструмент, один таймфрейм. Самый распространённый. Для трендовых, контртрендовых, паттерновых стратегий.
— `BotTabScreener` — несколько инструментов одновременно. Один робот торгует по десятку бумаг. Для скринеров и мультитикерных стратегий.
— `BotTabPair` — два коррелирующих инструмента. Для парного арбитража. Имеет встроенный расчёт корреляции и графика минимальных остатков от разницы между двумя инструментами с оптимальным мультипликатором.
— `BotTabIndex` — пользовательский индекс из нескольких бумаг. Веса задаются вручную. Для торговли против индекса или спреда.
— `BotTabCluster` — кластерный график. Доступны горизонтальные объёмы по ценам. Для анализа кластеров + торговли через `BotTabSimple`
— `BotTabPolygon` — валютный арбитраж. Три инструмента, образующие замкнутый треугольник.
— `BotTabOptions` — опционы. Отдельный таб для работы с опционными сериями.
— `BotTabNews` — лента новостей. События по новостям, можно комбинировать с `BotTabSimple`.
— `BotTabSyntheticBond` — синтетические облигации. Конструирование облигаций из доступных инструментов.
В 95% случаев хватает `BotTabSimple`. Для скринеров — `BotTabScreener`. Для пар — `BotTabPair`
**3. Индикаторы**
Какие индикаторы, параметры, область на графике:
— Название: `Sma`, `Bollinger`, `Rsi`, `Macd`, `Atr`
— Параметры: период, отклонение, сглаживание
— Область: `Prime` (основная, на графике цены) или `NewArea0` (отдельная область ниже)
— Как создавать: `_tab.CreateCandleIndicator(indicator, «Prime»)`
**4. Точки входа и выхода**
— Условие входа Long (например: цена пересекла SMA снизу вверх)
— Условие входа Short (например: цена пересекла SMA сверху вниз)
— Тип ордера: `Market`, `Limit`, `Stop`
— Объём позиции (фиксированный лот, риск в процентах, расчёт через `GetVolume`)
— Стоп-лосс (фиксированный, по ATR, за локальным экстремумом)
— Тейк-профит (фиксированный, 1:2, 1:3)
— Трейлинг-стоп (если нужен — шаг, активация)
**5. Примеры для заимствования**
Из `CONTEXT_ROBOTS.md` находим похожего робота и говорим ИИ:
— «Сделай как в роботе `EnvelopTrend`, но период 50 вместо 20»
— «Возьми структуру из `SmaScreener`, а логику входа свою»
— «Используй как базу `PinBarTrade`, добавь трейлинг-стоп»
Это сильно упрощает задачу. ИИ копирует проверенную структуру, а не выдумывает с нуля.
**6. Параметры робота**
Что должно быть в настройках:
— `Regime` (On / Off / OnlyLong / OnlyShort / OnlyClose)
— Параметры индикаторов (периоды, отклонения)
— **Стандартный расчёт объёма** (как в большинстве роботов проекта):
— `VolumeType` — тип объёма: `Contracts` / `Contract currency` / `Deposit percent`
— `Volume` — значение: лоты, сумма в валюте или процент от депозита
— `TradeAssetInPortfolio` — актив для расчёта: `Prime` (основной) или код актива
— Стоп-лосс (в пунктах или ATR-множитель)
— Тейк-профит (в пунктах или соотношение к стопу)
— Трейлинг-стоп (шаг активации, шаг трейлинга)
— Время торговли (если нужно — начало, конец, перерыв)
Объём в коде рассчитывается через метод `GetVolume(tab)`, который учитывает тип объёма, лотность и округление.
**7. Особые случаи**
— Проверка готовности индикатора (`candles.Count + N < indicator.Values.Count`) — не торговать, пока индикатор не накопил достаточно данных
— Защита от повторного входа (`_tab.PositionsOpenAll.Count > 0`) — не открывать вторую позицию, пока первая открыта
— `try-catch` вокруг всей торговой логики, чтобы робот не падал на ошибке
— Проверка режима (`_regime.ValueString == «Off»` — выходим, не торгуем)
— Проверка типа запуска (`StartProgram.IsOptimizer` — не рисовать на графике, не логировать лишнее)
— Отмена стоп-ордеров при открытии позиции (`BuyAtStopCancel()`) — чтобы не осталось висячих ордеров
Идея робота: Ловим тренд по EMA. Не входим во флэт — фильтруем через ADX.
Тип источника: BotTabSimple. Один инструмент, один таймфрейм.
Индикаторы:
Точки входа и выхода:
— Вход Long: свеча закрылась выше EMA(50), ADX > 25, позиции нет
— Вход Short: свеча закрылась ниже EMA(50), ADX > 25, позиции нет
— Тип ордера: Market
— Объём: рассчитывается через GetVolume(tab). VolumeType = Deposit percent, Volume = 20, TradeAssetInPortfolio = Prime
— Стоп-лосс: за EMA на расстоянии ATR * 2
— Тейк-профит: 1:2 к стопу (ATR * 4)
— Трейлинг-стоп: при достижении половины тейка переносим стоп в безубыток, далее трейлим за EMA
Пример для заимствования:
Сделай по структуре робота EnvelopTrend из CONTEXT_ROBOTS.md, но вместо Envelop используй EMA+ADX+ATR
Параметры:
— Regime (On/Off/OnlyLong/OnlyShort)
— EmaPeriod (50)
— AdxPeriod (14)
— AdxMinValue (25)
— AtrPeriod (14)
— AtrStopMultiplier (2.0)
— AtrTakeMultiplier (4.0)
— VolumeType (Deposit percent)
— Volume (20)
— TradeAssetInPortfolio (Prime)
Особыеслучаи:
— Проверка готовности индикаторов: candles.Count >= max(EmaPeriod, AdxPeriod, AtrPeriod) + 5
— Защита от повторного входа: _tab.PositionsOpenAll.Count > 0 — выходим
— Отмена стоп-ордеров при открытии позиции
— try-catch вокруг всей торговой логики
— Проверка режима: _regime.ValueString == «Off» — не торгуем
— Проверка IsOsOptimizer — не логировать лишнее при оптимизации
— Обязательно нужно добавить контроль неторгового времени. Надо внедрить стандартные неторговые периоды с MOEX. По выходным не торгуем. В будние дни торгуем с 10 утра и до 18.
Идея робота: Скринер ищет бумаги в восходящем тренде. Покупаем при пробое верхней границы Bollinger Bands.
Тип источника: BotTabScreener. Несколько инструментов одновременно.
Индикаторы:
Точки входа и выхода:
— Вход Long: свеча закрылась выше верхней линии Bollinger, цена выше EMA(50), RSI < 70, позиции на этом инструменте нет
— Вход Short: нет. Только лонг
— Тип ордера: Market
— Объём: рассчитывается через GetVolume(tab). VolumeType = Deposit percent, Volume = 20, TradeAssetInPortfolio = Prime
— Максимум открытых позиций: 5 одновременно (параметр MaxPositions)
— Стоп-лосс: нижняя линия Bollinger. Это единственный тип выхода
Пример для заимствования:
Сделай по структуре робота SmaScreener из CONTEXT_ROBOTS.md, но вместо SMA используй Bollinger+EMA+RSI
Параметры:
— Regime (On/Off/OnlyLong)
— BollingerPeriod (20)
— BollingerDeviation (2.0)
— EmaPeriod (50)
— RsiPeriod (14)
— RsiMax (70)
— VolumeType (Deposit percent)
— Volume (20)
— TradeAssetInPortfolio (Prime)
— MaxPositions (5)
Особыеслучаи:
— Проверка готовности индикаторов: candles.Count >= max(BollingerPeriod, EmaPeriod, RsiPeriod) + 5
— Защита от повторного входа: tab.PositionsOpenAll.Count > 0 — выходим
— Проверка лимита позиций: _tabScreener.PositionsOpenAll.Count >= MaxPositions — не открываем новые
— try-catch вокруг всей торговой логики
— Проверка режима: _regime.ValueString == «Off» — не торгуем
— Проверка IsOsOptimizer — не логировать лишнее при оптимизации
— Обязательно нужно добавить контроль неторгового времени. Надо внедрить стандартные неторговые периоды с MOEX. По выходным не торгуем. В будние дни торгуем с 10 утра и до 18.
Идея робота: Ловим импульс по ленте сделок. Выставляем лимитную заявку по краю стакана в сторону импульса и переставляем вслед за ценой. Держим несколько минут. Если цена отошла на 0.5% от точки импульса — отменяем.
Тип источника: BotTabSimple. Один инструмент, тики и стакан.
Индикаторы:
Нет классических индикаторов. Используем ленту сделок и стакан.
Точки входа и выхода:
— Фиксация импульса: объём за 5 секунд превысил средний объём за минуту в 3 раза. Запоминаем цену входа (LastPrice)
— Направление: если последняя сделка была на покупку (Trade.BuySell == Buy), ищем вход Long. Если на продажу — Short
— Выставление заявки: лимитная BuyAtLimit по лучшему bid + 1 шаг цены. Или SellAtLimit по лучшему ask — 1 шаг
— Перестановка: каждую секунду проверяем стакан. Если цена сдвинулась, отменяем старую заявку, ставим новую по краю стакана
— Вход: заявка исполнилась
— Стоп-лосс: если позиция открыта, и цена ушла на 0.3% против — закрываем по рынку
— Тейк-профит: если позиция открыта, и цена ушла на 0.5% в плюс — закрываем по рынку
— Отмена: если с момента импульса прошло 3 минуты и заявка не исполнилась — отменяем
— Отмена 2: если цена отошла на 0.5% от точки импульса — отменяем заявку, не входим
Пример для заимствования:
Сделай по структуре HFT-роботов из CONTEXT_HIGH_FREQUENCY.md. Используй NewTickEvent для ленты, MarketDepthUpdateEvent для стакана, OrderUpdateEvent для отслеживания заявок.
Параметры:
— Regime (On/Off/OnlyLong/OnlyShort)
— ImpulseWindowSeconds (5) — окно подсчёта импульса
— ImpulseVolumeMultiplier (3.0) — во сколько раз объём должен превысить средний
— MaxWaitMinutes (3) — сколько минут ждать исполнения заявки
— CooldownSeconds (1) — минимальное время между входами в логику
— CancelDeviationPercent (0.5) — отмена, если цена отошла на 0.5%
— StopLossPercent (0.3) — стоп после входа
— TakeProfitPercent (0.5) — тейк после входа
— VolumeType (Deposit percent)
— Volume (20)
— TradeAssetInPortfolio (Prime)
Особые случаи:
— Проверка режима: _regime.ValueString == «Off» — не торгуем
— Защита от повторного входа: пока есть открытая позиция или активная заявка — не ловим новый импульс
— Cooldown: после обработки импульса ждём CooldownSeconds перед следующим входом, иначе на волатильном рынке робот поставит 10 заявок за секунду
— try-catch вокруг логики перестановки заявок
— Проверка IsOsOptimizer — не торгуем в оптимизаторе, для HFT это не имеет смысла
— Проверка на null: стакан может быть пустым на старте
— Обновление стакана: _tab.MarketDepthUpdateEvent += _tab_MarketDepthUpdateEvent
— Обязательно нужно добавить контроль неторгового времени. Надо внедрить стандартные неторговые периоды с MOEX. По выходным не торгуем. В будние дни торгуем с 10 утра и до 18.
Идея робота: Сетка маркет-мейкинга ловит откаты в направлении тренда. EMA определяет тренд. В восходящем — сетка покупок ниже цены. В нисходящем — продаж выше цены. Сетка сама движется за ценой, перестраивать вручную не надо.
Тип источника: BotTabSimple. Один инструмент.
Индикаторы:
1) EMA (период 50, область Prime) — определяет направление тренда.
Точки входа и выхода:
— Определение тренда: цена закрытия выше EMA(50) — восходящий. Ниже — нисходящий.
— Создание сетки: при восходящем тренде — Buy-сетка через GridsMaster. При нисходящем — Sell-сетка. Тип MarketMaking. Параметры сетки: GridLevels линий, шаг GridStep%, тейк равен шагу.
— Объём: рассчитывается через GetVolume(tab) и передаётся в сетку.
— Движение за ценой: включить TrailingUp и TrailingDown с параметрами GridTrailingStep и GridTrailingLimit. Тейк-профитные ордера при сдвиге не двигаем.
— Защита сетки: автозакрытие по времени жизни (GridLifeTime) и по количеству сделок (GridMaxPositions) через StopBy.
— Закрытие по смене тренда: если цена пересекла EMA в обратную сторону — закрыть сетку принудительно и удалить после закрытия позиций.
— Защита от двойной сетки: пока сетка активна — не создаём новую.
Пример для заимствования:
Сделай по структуре GridTwoSignals из CONTEXT_GRIDS.md. Используй TrailingUp/Down с лимитом и StopBy для защиты.
Параметры:
— Regime (On/Off/OnlyLong/OnlyShort)
— EmaPeriod (50)
— GridLevels (5) — количество линий сетки
— GridStep (0.1) — шаг сетки в процентах от цены
— GridTrailingStep (0.1) — порог сдвига сетки в процентах от цены
— GridTrailingLimit (10.0) — предел сдвига сетки в процентах от цены
— GridLifeTime (600) — время жизни сетки в секундах
— GridMaxPositions (50) — максимум позиций по сетке
— VolumeType (Deposit percent)
— Volume (5)
— TradeAssetInPortfolio (Prime)
Особыеслучаи:
— Проверка готовности EMA: candles.Count >= EmaPeriod + 5
— Проверка режима: _regime.ValueString == «Off» — не торгуем
— Защита от двойной сетки: не создавать вторую, пока первая работает
— try-catch вокруг логики создания и управления сеткой
— Проверка IsOsOptimizer — не выставлять ордера в оптимизаторе
— Обязательно нужно добавить контроль неторгового времени. Надо внедрить стандартные неторговые периоды с MOEX. По выходным не торгуем. В будние дни торгуем с 10 утра и до 18.
Идея робота: Межсекторный арбитраж. Создаём два индекса — условно банковский и нефтегазовый. Торгуем расхождение между секторами: когда один убегает от другого, шортим лидера, лонгим аутсайдера. Закрываем при возврате спреда.
Тип источника: Два BotTabIndex (для расчёта индексов) + два BotTabScreener (для торговли бумагами каждого сектора).
Индикаторы:
Нет классических индикаторов. Используем корреляцию и коинтеграцию между двумя индексами.
Точки входа и выхода:
— Индексы: BankIndex из банков (Сбер, ВТБ, СберПреф) с равными весами. OilIndex из нефтегаза (Лукойл, Газпром, Татнефть) с равными весами. Формулы задаются в интерфейсе OsEngine (формула: A0+A1+A2)
— Скринеры: BankScreener с теми же банками. OilScreener с теми же нефтегазовыми.
— Сигнал: на SpreadChangeEvent обоих индексов считаем коинтеграцию. Если BankIndex отклонился вверх от OilIndex (CointegrationLineSide.Down) — шортим весь BankScreener, лонгим весь OilScreener. Если наоборот — зеркально.
— Фильтр: торгуем, только если корреляция между индексами выше MinCorrelation.
— Объём: рассчитывается через GetVolume. Депозит делится поровну между двумя скринерами, внутри скринера — равномерно между бумагами.
— Закрытие: при возврате коинтеграции к нулю (No signal) — закрываем все позиции обоих скринеров.
— Стоп: если позиции открыты, и коинтеграция ушла ещё дальше против нас на StopDeviation, то закрываем всё.
Пример для заимствования:
Сделай по структуре IndexArbitrageClassic из CONTEXT_INDEX_AND_SPREAD.md. Два индекса, два скринера, корреляция + коинтеграция.
Параметры:
— Regime (On/Off/OnlyLong/OnlyShort/OnlyClosePosition)
— CorrelationPeriod (50) — период корреляции
— MinCorrelation (0.7) — минимальная корреляция для входа
— CointegrationLookBack (100) — глубина коинтеграции
— EntryDeviation (2.0) — множитель стандартного отклонения для входа
— ExitDeviation (0.5) — множитель для выхода
— StopDeviation (3.0) — стоп, если отклонение усилилось
— VolumeType (Deposit percent)
— Volume (5)
— TradeAssetInPortfolio (Prime)
Особые случаи:
— Синхронизация: свечи всех табов должны иметь одинаковый TimeStart. Без синхронизации не торгуем
— Проверка готовности: индексы должны накопить минимум CorrelationPeriod + 5 свечей
— Проверка режима: _regime.ValueString == «Off» — не торгуем
— Защита от пустых скринеров: проверять, что Tabs.Count > 0, перед торговлей
— try-catch вокруг всей логики расчёта коинтеграции и выставления ордеров
— Проверка IsOsOptimizer — не логировать лишнее при оптимизации
— Обязательно нужно добавить контроль неторгового времени. Надо внедрить стандартные неторговые периоды с MOEX. По выходным не торгуем. В будние дни торгуем с 10 утра и до 18.
— Режима торгов в этом роботе только два: “Off” и “On”
Идея робота: Монитор-робот отслеживает, на каких инструментах скринера сейчас пила (боковик с частыми колебаниями), а на каких — тренд. Использует индикаторы EfficiencyRatio и VHFilter. Выводит таблицу с метриками, выбрасывает алерты при смене режима и может автоматически входить при выходе цены из пилы в направлении пробоя.
Тип источника: BotTabScreener. Несколько инструментов одновременно.
Индикаторы:
Точки входа и выхода:
— Расчёт метрик: для каждого инструмента в скринере читаем последние значения ER и VHFilter
— Статус «Пила»: ER < `_erSawThreshold` И VHFilter < `_vhfSawThreshold`
— Статус «Тренд»: ER > `_erTrendThreshold` И VHFilter > `_vhfTrendThreshold`
— Up-сигнал: инструмент перешёл из статуса «Пила» в «Тренд», и последняя свеча растущая
— Down-сигнал: инструмент перешёл из статуса «Пила» в «Тренд», и последняя свеча падающая
— Авто-вход Long: `_longIsOn == true`, up-сигнал, текущая свеча бычья (`IsUp`), лонгов по скринеру < `_longMaxPositions`
— Авто-вход Short: `_shortIsOn == true`, down-сигнал, текущая свеча медвежья (`IsDown`), шортов по скринеру < `_shortMaxPositions`
— Стоп-лосс: `_longStopPercent` / `_shortStopPercent` от цены входа (0 = выключен)
— Тейк-профит: `_longProfitPercent` / `_shortProfitPercent` от цены входа (0 = выключен)
— Закрытие по времени: `_longMaxCandlesInPositions` / `_shortMaxCandlesInPositions` свечей в позиции
— Алерты: при смене статуса с «Пила» на «Тренд» (вверх или вниз) — звук + сообщение в лог. Дедупликация по времени свечи через `Dictionary<string, SignalData>`
— Тип ордера: Market
— Объём: рассчитывается через `GetVolume(tab)`. VolumeType = Deposit percent, Volume = 20, TradeAssetInPortfolio = Prime
Пример для заимствования:
Сделай по структуре MonitorHighLow из CONTEXT_MONITORS.md, но вместо PriceChannel и расстояния до High/Low используй EfficiencyRatio + VHFilter для определения пилы/тренда.
Параметры:
— Regime (Off / OnCandleUpdate / OnCandleFinish)
— LookBack (20) — период для расчёта канала High/Low пробоя
— ErSawThreshold (0.3) — ER ниже этого значения = пила
— ErTrendThreshold (0.6) — ER выше этого значения = тренд
— VhfSawThreshold (0.3) — VHFilter ниже этого значения = пила
— VhfTrendThreshold (0.5) — VHFilter выше этого значения = тренд
— LongIsOn (false) — включить автоторговлю в лонг
— LongMaxPositions (5) — максимум одновременных лонгов
— LongStopPercent (0.5) — стоп-лосс в %
— LongProfitPercent (1.0) — тейк-профит в %
— LongMaxCandlesInPositions (50) — закрытие по времени, свечи
— LongVolumeType (Deposit percent)
— LongVolume (20)
— LongTradeAssetInPortfolio (Prime)
— ShortIsOn (false) — включить автоторговлю в шорт
— ShortMaxPositions (5) — максимум одновременных шортов
— ShortStopPercent (0.5)
— ShortProfitPercent (1.0)
— ShortMaxCandlesInPositions (50)
— ShortVolumeType (Deposit percent)
— ShortVolume (20)
— ShortTradeAssetInPortfolio (Prime)
— UpSignalsIsOn (false) — включить алерты вверх
— UpSignalsMusic (Duck / Wolf)
— UpSignalsErrorLogIsOn (true)
— DownSignalsIsOn (false) — включить алерты вниз
— DownSignalsMusic (Wolf)
— DownSignalsErrorLogIsOn (true)
Особые случаи:
— Проверка готовности индикаторов: candles.Count >= max(ErPeriod, VhfPeriod, LookBack) + 5 и значения индикаторов != 0
— Проверка режима: _regime.ValueString == «Off» — не торгуем
— Проверка неторгового периода: _tradePeriodsSettings.CanTradeThisTime(tab.TimeServerCurrent) == false — выходим
— Защита от повторного сигнала: signal.Time == candles[^1].TimeStart — пропускаем
— Rate-limited обновление таблицы: не чаще 1 раза в секунду
— Обращение к DataGridView только из UI-потока через InvokeRequired / Invoke
— try-catch вокруг всей логики обработчиков и обновления таблицы
— Проверка IsOsOptimizer — не логировать лишнее при оптимизации
— Обязательно нужно добавить контроль неторгового времени. Надо внедрить стандартные неторговые периоды с MOEX. По выходным не торгуем. В будние дни торгуем с 10 утра и до 18.
Это заготовки для ПРОМПТОВ для Ваших будущих роботов. Самые базовые. Вот от них и старайтесь работать.
Удачных алгоритмов!
Комментарии открыты для друзей, добавляйтесь!

https://smart-lab.ru/company/os_engine/blog/1024149.php
Скачать OsEngine: https://github.com/AlexWan/OsEngine
Официальная поддержка OsEngine в MAX:https://max
Канал Научный трейдинг в MAX:https://max.ru/
Поддержка OsEngine в Телеграм:https://t.me/osengine_official_support
Канал Научный трейдинг (Bad Quant) в Телеграм:https://t.me/bad_quant