Вот небольшой пример. в нем используется стек заявок. До конца в нем не уверен, собственно говоря вот сабж:http://www.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=4829&#Post4829 как получу на него ответ исправлю и дополню пример.
public void Execute(IContext ctx, ISecurity sec) { //проверка на лабораторию-если не реальная торговля-выходим if (!sec.Positions.IsRealtime) return; int i = sec.Bars.Count() - 1; if (i < 0) return; //получаем биржевой стакан IList<IQueueData> buyQueue=sec.GetBuyQueue(i); IList<IQueueData> sellQueue = sec.GetSellQueue(i); ISecurityRt secRt = sec as ISecurityRt; if (secRt == null) return; //текущая позиция. если больше нуля-значит в лонге. мееьше нуля-в шорте double lotsBalance = 0; //пробегаемся по всем исполненным лимитникам-нам необходимо текущее число лотов foreach (IOrder order in secRt.Orders) if (order.OrderType == TSLab.DataSource.OrderType.Limit) { lotsBalance += order.IsBuy ? (order.Quantity-order.RestQuantity) : (-order.Quantity+order.RestQuantity); //для примера-если ордер не исполнился-убиваем if (!order.IsExecuted) secRt.CancelOrder(order); }
//условие-у нас нулевой баланс лотов if (lotsBalance == 0) { //ставим лимитник на бай-хотим выше остальных secRt.NewOrder(TSLab.DataSource.OrderType.Limit, true, buyQueue[0].Price + 0.01, 1, "Long"); //ставим лимитник на продажу-хотим ниже всех secRt.NewOrder(TSLab.DataSource.OrderType.Limit, false, sellQueue[0].Price - 0.01, 1, "Short"); } else if (lotsBalance < 0) { //закрываем отрицательный баланс покупкой secRt.NewOrder(TSLab.DataSource.OrderType.Limit, true, buyQueue[0].Price + 0.01, -lotsBalance, "Long"); } else { //закрываем положительный баланс лотов продажей secRt.NewOrder(TSLab.DataSource.OrderType.Limit, false, sellQueue[0].Price - 0.01, lotsBalance, "Short"); }