Ничего сверхъестественного не делали, всё банально до безобразия, добавили лишь обработку лимитника Profit target. К сожалению, подробных комментариев дать не могу, ибо обладаю недостаточной информацией на этот счёт, не разбираюсь в этих лимитниках, ценообразовании, да и в целом с торговлей знаком совсем недавно. Могу ток сказать что глядя в код видно, что лимитник выставляется на следующем баре.
Не могу утверждать что 100% правильная реализация, но мне сказали "работает как надо", а я только рад этому

(если конечно это действительно так).
Кстати, если даже этот вариант в целом не верный (а исходя из ваших рассуждений думаю это так), в нашем случае он "сгладил" красивый результат бэктеста, и приблизил результаты к реальным, даже с небольшим запасом прочности, т.е. резалты показываются немного в худшую сторону.
P.S. немного тяжело было слышать, что результат, полученный на дефолтном филлтайпе, был не верным.. А там так всё красиво было..))
Код:
else if (order.OrderType == OrderType.Limit)
{
// Profit Target
if(order.Name == "Profit target")
{
if(Strategy.Bars.CurrentBar >= BAR_INDEX + 1)
{
double nextLow = NextLow;
double nextHigh = NextHigh;
if ((order.OrderAction == Cbi.OrderAction.Buy && order.LimitPrice > nextLow + epsilon)
|| (order.OrderAction == Cbi.OrderAction.BuyToCover && order.LimitPrice > nextLow + epsilon)
|| (order.OrderAction == Cbi.OrderAction.Sell && order.LimitPrice < nextHigh - epsilon)
|| (order.OrderAction == Cbi.OrderAction.SellShort && order.LimitPrice < nextHigh - epsilon))
{
FillPrice = order.LimitPrice; // set fill price
}
}
}
else
{
// Orders are filled when traded through the limit price not at the limit price
double nextLow = NextLow;
double nextHigh = NextHigh;
if ((order.OrderAction == Cbi.OrderAction.Buy && order.LimitPrice > nextLow + epsilon)
|| (order.OrderAction == Cbi.OrderAction.BuyToCover && order.LimitPrice > nextLow + epsilon)
|| (order.OrderAction == Cbi.OrderAction.Sell && order.LimitPrice < nextHigh - epsilon)
|| (order.OrderAction == Cbi.OrderAction.SellShort && order.LimitPrice < nextHigh - epsilon))
{
FillPrice = order.LimitPrice; // set fill price
BAR_INDEX = Strategy.Bars.CurrentBar;
}
}
}