В продолжении темы:
здесь Скрипт (на API) формирует две лимитные заявки и должен держать их, периодически переставляю, в случае изменения условия.
Проблема: после запуска скрипта до момента первого изменения уровня цены для одной из лимиток все нормально. После первого изменения уровня цены, лимитки начинают переставляться каждый пересчет скрипта, генерируя ненужные транзакции.
Учитывая маленький таймфрейм, можно гарантированно нарваться на штраф от биржи.
Вопрос: это нормальная работа программы или где-то недоработка (со стороны ТСЛаб, или моего кода?)
Примерный алгоритм кода (по всем свечам не пробегаюсь, рассматриваю сразу последнюю закрытую свечу):
ISecurityRt secRT = source as ISecurityRt;
LongPos1 = source.Positions.GetLastActiveForSignal("L", tradeCount-1);
ShortPos1 = source.Positions.GetLastActiveForSignal("S", tradeCount-1);
if (LongPos1 == null && ShortPos1 == null) //если нет позиций
{
LongLevel = "расчет уровня для лимитки в лонг";
ShortLevel = "расчет уровня для лимитки в шорт";
if (secRT.HasActiveOrders)
{
foreach (IOrder order in secRT.Orders)
{
if (order.IsActive && order.IsBuy && "условие") LongLevel = order.Price;
if (order.IsActive && order.IsBuy == false && "условие") ShortLevel = order.Price;
}
}
source.Positions.BuyAtPrice(tradeCount, 1, LongLevel, "L"); //ставим лимитку в стакан
source.Positions.SellAtPrice(tradeCount, 1, ShortLevel, "S"); //ставим лимитку в стакан
}
else if (LongPos1 != null) //если есть лонг
{
LongPos1.CloseAtPrice(tradeCount, "уровень для закрытия", "LX");
}
else if (ShortPos1 != null) //если есть шорт
{
ShortPos1.CloseAtPrice(tradeCount, "уровень для закрытия", "SX");
}