Appearance
NinjaTrader 8
Этот раздел описывает индикатор TMPro для NinjaTrader 8. В документации он рассматривается как одна пользовательская сущность: индикатор устанавливается в NinjaTrader 8, подключается к аккаунту TradingMonitor.Pro, принимает сигналы и выполняет поддерживаемые торговые команды.
Перед началом
Подготовьте:
- NinjaTrader 8 на Windows;
- активный аккаунт
TradingMonitor.Pro; session tokenиз личного кабинета;- торговый account NinjaTrader, на котором вы хотите тестировать исполнение;
- файл или пакет индикатора
TMPro, полученный вместе с поставкой продукта.
Для первого запуска используйте demo account или выключенное live execution. Это позволяет проверить подключение, routing и формат команд без риска реального исполнения.
Установка индикатора
- Закройте NinjaTrader 8.
- Установите индикатор
TMProиз поставки продукта способом, указанным для вашего пакета. - Если поставка содержит исходные файлы индикатора, поместите их в каталог NinjaTrader 8 для custom indicators.
- Запустите NinjaTrader 8.
- Откройте
New > NinjaScript Editor. - Выполните compile.
- Добавьте индикатор
TMProна нужный chart.
После установки TMPro должен быть доступен в списке индикаторов NinjaTrader 8.
Настройки индикатора
| Настройка | Назначение |
|---|---|
Account / AccountName | Торговый account NinjaTrader для ордеров и операций с позициями. |
Connection URL / SignalR URL | Адрес подключения TradingMonitor.Pro. Обычно используется значение по умолчанию https://tradingmonitor.pro. |
Session Token | Token из личного кабинета. |
Instance ID | Необязательный идентификатор конкретного экземпляра индикатора. |
Instrument Mappings | Сопоставление symbols из сигналов с названиями инструментов NinjaTrader. |
Quantity Multiplier | Множитель количества контрактов из входящей команды. |
Enable Execution | Если выключено, индикатор принимает сигналы и пишет logs, но не выполняет торговые действия. |
Verbose Logging | Подробные сообщения для первичной настройки и диагностики. |
Пример instrument mapping:
text
ES1!=ES 06-26;NQ1!=NQ 06-26Используйте mapping, если symbol в сигнале отличается от имени инструмента в NinjaTrader.
Подключение
- Откройте chart, на котором добавлен
TMPro. - Укажите
Session Token. - Укажите
Instance ID, если хотите принимать команды только для конкретного терминала или рабочего места. - Выберите
Account. - Для первого запуска включите
Verbose Logging. - Оставьте
Enable Executionвыключенным, пока не проверите прием сигналов. - Примените настройки индикатора.
В Output window NinjaTrader индикатор должен показать понятный статус подключения или причину ошибки.
Маршрутизация сигналов
TMPro принимает команды, которые относятся к вашему аккаунту и подходят по routing.
Для отправки команды в NinjaTrader 8 используйте в desktop app значение:
json
"platform": "ninjatrader"Также можно использовать:
json
"platform": "any"Если указан instanceId, он должен совпадать с настройкой Instance ID в индикаторе. Если instanceId пустой, команда может быть принята любым подходящим экземпляром индикатора в рамках аккаунта.
Поддерживаемые команды
system
pauseresumeinfo
system.pause временно блокирует исполнение новых торговых команд. system.resume возвращает индикатор в рабочее состояние. system.info показывает окно TMPro с текстом payload.info и переданными данными DOHLCV/legacy OHLC.
order
submit
Для order.submit обычно используются поля:
instrument;side:buyилиsell;executionType:market,limit,stopилиstop_limit;quantity;limitPrice, если используетсяlimitилиstop_limit;stopPrice, если используетсяstopилиstop_limit;stopLoss/takeProfitкак абсолютные цены;stopLossTicks/takeProfitTicksкак расстояния в тиках.
Для tick-based защиты индикатор ждёт появления позиции, рассчитывает цены от фактической Position.AveragePrice через TickSize инструмента и округляет их к допустимому шагу цены. Если одновременно переданы абсолютная цена и расстояние в тиках для одной защиты, используется абсолютная цена. atmStrategyName не входит в гарантированный tracked Public API contract.
Пример:
json
{
"v": 1,
"signalId": "nt-order-001",
"ts": 1777000000000,
"ttlMs": 300000,
"platform": "ninjatrader",
"instanceId": "nt-demo-01",
"type": "order",
"cmd": "submit",
"payload": {
"instrument": "ES 06-26",
"side": "buy",
"executionType": "market",
"quantity": 1,
"stopLoss": 6280.25,
"takeProfit": 6310.25
}
}Полный каталог запросов и примеры curl, C# и Python: Справочник торговых команд.
position
Поддерживаемые действия:
close;reduce;protect;close_all;flatten_now.
Position-команды используются для закрытия, частичного уменьшения или защиты открытых позиций.
risk
Поддерживаемые действия:
block_instrument;allow_instrument;flatten_now.
Risk-команды используются для локальной блокировки инструмента и аварийного закрытия позиций.
Lifecycle позиции
Backend уже поддерживает SignalR Hub method PublishPositionLifecycle и ACK-контракт для position.opened, position.closed, order.cancelled и order.expired. Lifecycle-корреляция строится по стабильной паре:
text
lifecycleKey + entrySignalIdПервоначальный order.submit должен создать эту корреляцию в Backend. Последующие события передают те же lifecycleKey и entrySignalId; новый signalId или eventId допустим и означает только новую доставку/событие.
Минимальный контракт события для NinjaTrader:
| Поле | Значение |
|---|---|
eventId | Уникальный ID события, до 128 символов |
eventType | position.opened, position.closed, order.cancelled или order.expired |
platform | ninjatrader |
terminalInstanceId | Точное значение Instance ID indicator |
accountName | Выбранный account NinjaTrader, например Sim101 |
instrument | Точное имя инструмента после mapping |
positionRef | Ссылка на position для position.opened/position.closed |
entrySignalId | Стабильный ID первоначального entry |
lifecycleKey | Стабильный ключ всей операции |
sequence | Монотонный номер события |
timestamp | Unix milliseconds |
Для position.opened Backend возвращает ACK success=true, status=OK, state=active; для закрытия — success=true, status=OK, state=closed. Indicator проверяет success и status, а state можно использовать для диагностики. Если position.opened относится к entry-команде с dynamic protection и пришёл до регистрации ожидаемой корреляции, Backend вернёт success=false, status=NotFound. События position.opened для обычных ордеров без dynamic protection MainApp игнорирует в контексте dynamic protection.
Текущий NinjaTrader 8 indicator package реализует полный lifecycle pipeline: принимает lifecycle-поля из entry, отслеживает PositionUpdate и ExecutionUpdate, формирует position.opened/position.closed, сохраняет события в локальном outbox и вызывает PublishPositionLifecycle с повторными попытками после reconnect. При успешном ACK событие удаляется из outbox.
В lifecycle payload используется каноническое значение platform: "ninjatrader" (Backend также принимает nt8). В логах indicator ищите feedback sent, а не только PositionUpdate.
Обычные и API-сигналы на одном инструменте
TMPro не выполняет автоматический арбитраж противоположных сигналов. Обычные remote-сигналы и Public API-сигналы обрабатываются последовательно, но остаются независимыми командами. Встречный working или pending-ордер автоматически не отменяется.
Статус API execution filled относится к конкретному tracked-ордеру, а не гарантирует итоговое направление net-позиции. Другая заявка может уменьшить, закрыть или развернуть позицию до или после этого исполнения. TMProLocal, ручные заявки, ATM и сторонние стратегии не координируются с очередью remote-индикатора.
Рекомендация
Для одной пары Account + Instrument используйте один управляющий источник: либо Public API, либо обычные сигналы. Не смешивайте их с TMProLocal, ручными заявками или ATM на этой же паре во время автоматического исполнения.
Для разворота сначала отмените конфликтующие pending-ордера и дождитесь подтверждения отмены. Затем закройте текущую позицию, подтвердите Flat по PositionUpdate и только после этого открывайте новую сторону с новой защитой. Текущая версия индикатора не выполняет эту последовательность автоматически.
Подробное описание ограничения: Противоположные сигналы и итоговая позиция.
Проверка перед live
Перед включением live execution проверьте:
- indicator
TMProдобавлен на chart и пишет normal status; Session Tokenскопирован из правильного аккаунта;Accountвыбран правильно;platformв команде равенninjatraderилиany;Instance IDсовпадает сinstanceId, если он используется;- symbol из команды совпадает с инструментом NinjaTrader или настроен mapping;
Quantity Multiplierдает ожидаемый итоговый размер;Enable Executionвключается только после проверки на demo или dry-run.
Диагностика
Индикатор не появился в списке: выполните compile в NinjaScript Editor и проверьте ошибки компиляции.
Нет подключения: проверьте Connection URL, Session Token, доступ к интернету и системное время Windows.
Сигнал приходит в Dashboard, но не принимается индикатором: проверьте platform, instanceId, Session Token и logs NinjaTrader.
Команда принята, но не исполняется: проверьте Enable Execution, выбранный Account, права account, symbol mapping и размер позиции.
Ордер отклоняется NinjaTrader: проверьте instrument name, торговую сессию, quantity, price fields и ограничения broker/account.