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