Недавно открыл счет в Финам и опробовал данный скрипт в "боевом" режиме. Причем, на удивление удачно опробовал - сразу обнаружил проблему, которую можно было бы не увидеть в более сложном скрипте (и соответственно, начать терять деньги не понимая, куда они уходят).

В боевом режиме скрипт работает совершенно не так, как в режиме симуляции. А именно, по разному расставляются стопы. В "боевом" режиме стопы периодически начинают почти сразу выставляться по low предыдущего бара, параллельно запущенный скрипт в режиме симуляции выставляет их "как положено".

Просмотрев код скрипта сразу обратил внимание на следующий подозрительный код:

#region execute signals
//--------------------------------------------------------------------------------
// выполнение сигналов для длинной позиции
LongPos = source.Positions.GetLastActiveForSignal("LN");
if (LongPos == null)
{
// Если нет активной длинной позиции
if (BuyPrice > 0)
{
// Если есть сигнал Buy,
// выдаем условный ордер на открыте новой длинной позиции.
source.Positions.BuyIfGreater(bar+1, 1, BuyPrice, "LN");
}
LongPos = source.Positions.GetLastActiveForSignal("LN");
if (LongPos != null) LongLowPeriod = LongClosePeriod;
}

Подозрительный потому, что по всей видимости функция BuyIfGreater работает по разному в режиме симуляции и в боевом режиме. Похоже, в режиме симуляции, после выполнения BuyIfGreater позиция сразу "открывается" и следующий GetLastActiveForSignal дает true, а в боевом режиме - позиция открывается на следующем цикле и GetLastActiveForSignal дает false. Отсюда, LongLowPeriod не сбрасывается, что приводит к радикальным отличиям в функционировании скрипта.

Большая просьба к разработчикам подтвердить или опровергнуть мою теорию и более подробно описать работу функций выставления заявок.

К сожалению, существующая документация совершенно не раскрывает детали работы данных функций (особенно тех, которые по разному могут работать в режиме симуляции и в бою), а ведь от детального понимания их работы зависят реальные деньги!