Пример скрипта с самостоятельным управлением заявками
В режиме самостоятельного управления заявками можно управлять заявками агента, выставлять заявку, снимать заявку.
В этом режиме недоступны стандартные методы работы с позициями (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); } } } } }