При тестировании робота в OS.Tester, который работает лимитными ордерами, возможно дублирование заявок
Файл \OsEngine\OsTrader\Panels\Tab\BotTabSimple.cs - стр. 2883 - метод CheckStopOpener(decimal price)
В цикле перебираются заявки, ожидающие своей цены для открытия. Внутри цикла используются методы LongCreate() и ShortCreate(), в результате работы которых исполненные заявки удаляются из коллекции, которая перебирается в цикле. Это приводит либо к критической ошибке при удалении заявки строке:
_stopsOpener.Remove(_stopsOpener[i]) (нет значения по индексу),
либо к дублированию выполнения заявок (там все сложнее, можно проверить на тестовых данных.
Вариант решения:
1. Открываем все, что пора открывать
2. Если что-то открылось, то остальное удаляем из очереди ожидания
Код:
private void CheckStopOpener(decimal price)
{
try
{
// 1. Создаем копию пула заявок
List
// 2. Открываем все, что пора открывать
bool itWasNewDeal = false;
foreach (var stopOrder in copyOf_stopsOpener)
{
if ((stopOrder.ActivateType == StopActivateType.HigherOrEqual &&
price >= stopOrder.PriceRedLine) // пробили вниз
||
(stopOrder.ActivateType == StopActivateType.LowerOrEqyal &&
price <= stopOrder.PriceRedLine)) // пробили вверх
{
if (stopOrder.Side == Side.Buy)
{
Position newDeal = LongCreate(stopOrder.PriceOrder, stopOrder.Volume, OrderPriceType.Limit, _manualControl.SecondToOpen, true);
if (newDeal != null)
{
itWasNewDeal = true;
}
}
else if (stopOrder.Side == Side.Sell)
{
Position newDeal = ShortCreate(stopOrder.PriceOrder, stopOrder.Volume, OrderPriceType.Limit, _manualControl.SecondToOpen, true);
if (newDeal != null)
{
itWasNewDeal = true;
}
}
}
}
// 3. Если что-то открылось, то остальное удаляем из очереди ожидания
if (itWasNewDeal)
{
_stopsOpener.Clear();
}
}
catch (Exception error)
{
SetNewLogMessage(error.ToString(), LogMessageType.Error);
}
}
поменял _stopsOpener.Remove(_stopsOpener[i]) на _stopsOpener.RemoveAt(i);
должно корректно удаление отрабатываться. В этом проблема.
ООО «ВАН ТЕХНОЛОГИИ»т: +7 953 769 56 45
* Торговля на финансовых рынках связана с риском, который лежит на Вас.
* Ничто из написанного на сайте o-s-a.net не является рекомендацией.
* Если Вы этого не понимаете, не читайте этот сайт, ничего не покупайте.