Всем привет. Решили попробовать прямое управление ордерами и столкнулся с непониманием работы TSLab. Почему заявки, выставленные через
ISecurityRt. NewOrder снимаются и перевыставляются каждый пересчёт если цена остаётся не изменой.
Пошерстил форум, в теме
Практические примеры API об этом говорят, но не говорят причины. Времени уже много с той темы прошло и выросло уже не мало Pro программистов TSLab. Добрые люди разъясните пожалуйста, как правильно работать с заявками, что бы они стояли столько сколько мне нужно и я их сам отменял либо же они исполнялись.
Вот просто код. Брокер Алор. Заяка если есть сниметься если нет, понятно выставляется. Если убрать проверку на HasActiveOrders, то просто перевыставление происходит каждый пересчёт.
public class TestTradeScript : IExternalScript
{
public readonly OptimProperty TargetPrice = new OptimProperty(0, 1, 500000, 1);
public void Execute(IContext ctx, ISecurity sec)
{
ISecurityRt secRt = sec as ISecurityRt;
if (secRt == null) return;
if (!secRt.HasActiveOrders)
{
double price = secRt.RoundPrice(TargetPrice.Value);
secRt.NewOrder(OrderType.Limit, true, price, 0d, 1, "signal");
}
}
}
А вообще корни проблемы, по которой я полез в эти дебри — это «частичное исполнение лимитных заявок». Кто как решает эту проблему? Я сейчас просто через позиции генерирую новые сигналы пока не наберётся нужный объём. В итоге имею сразу пачку открытых позиций разного объёма, что не удобно потом разгружать и в целом сопровождать. Встречал на форуме что в 2.0 теперь как то можно заставить позу ждать пока «нальют», но мой тесты показывают аналогичное поведение лимитных заявок как в 1.2, они формируются кусками. Единственное что я попробовал сделать это после пересчёта отрытую не полную позицию изменить через ChangeAtPrice. И такими изменениями ждать полного набора позы. Есть ли более красивые способы ? Может это настройками «Агента» или программы как - то регулируется.