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

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

Last updated