Пример скрипта с самостоятельным управлением заявками

В режиме самостоятельного управления заявками можно управлять заявками агента, выставлять заявку, снимать заявку.
В этом режиме недоступны стандартные методы работы с позициями (BuyAtMarket, BuyAtPrice и т.д.).
И соответственно у агента не будут работать стандартные опции для работы с позициями: Автооткрытие, автозакрытие, виртуальная позиция, ждать исполнения и другие.
В этом режиме работать с заявками следует через интерфейс ISecurityRt.

Доступные свойства и методы интерфейса ISecurityRt:

  • IsPortfolioReady - возвращает истину если инструмент готов к торговле

  • BalanceQuantity - количество лотов по бумаге из таблицы Позиции

  • EstimatedBalance - баланс счета на основе стоимости всех бумаг

  • CurrencyBalance - количество свободных денег на счету, связанном с бумагой

  • Orders - список исполненных и активных заявок по бумаге (только для данного агента)
    CancelledOrders - список отмененных заявок по бумаге (только для данного агента)

  • HasActiveOrders - есть активные заявки или нет

  • NewOrder(...) - выставить новую заявку

  • CancelOrder(...) - отменить заявку

  • ChangeOrder(...) - выставить новую заявку

Важно:

  • В свойстве скрипта нужно поставить галочку 'Отключить генерацию позиций'

  • Нужно запустить скрипт в режиме агента.

  • Чтобы агент начал выставлять заявки нужно в свойстве агента поставить галочки: 'исполнять входы сразу' и 'исполнять выходы сразу'.

using System.Linq; using TSLab.DataSource; using TSLab.Script; using TSLab.Script.Handlers; using TSLab.Script.Realtime; namespace MyLib { /// <summary> /// Пример скрипта с самостоятельным управлением заявками /// Скрипт получает текущие активные заявки, если нет активных заявок, то выставляет лимитку. /// Если есть активные заявки, то снимает их. И так далее. /// В свойстве скрипта нужно поставить галочку 'Отключить генерацию позиций' /// Нужно запустить скрипт в режиме агента. /// </summary> public class RtSecurityLimit : IExternalScript { public void Execute(IContext ctx, ISecurity sec) { var secRt = sec as ISecurityRt; if (secRt == null) // Скрипт работает только в режиме агента return; if (!secRt.IsPortfolioReady) // Инструмент еще не готов к торговле return; if (ctx.BarsCount == 0) // Нет баров return; var ordersAll = secRt.Orders.ToList(); // Получить все заявки var ordersActive = secRt.Orders.Where(x => x.IsActive).ToList(); // Получить все активные заявки var ordersCancelled = secRt.CancelledOrders.ToList(); // Получить отмененные заявки if (ordersActive.Count == 0) { // Если заявок нет, то выставляем одну заявку var price = sec.Bars.Last().Close * 0.98; secRt.NewOrder(OrderType.Limit, true, price, 1, "LN"); } else { // Если есть активные заявки, то все снимаем foreach (var order in ordersActive) { secRt.CancelOrder(order); } } } } }