static void OptimisticPessimisticMethod(int bar, BacktestEval eval, ref double current,
bool isTopReachable, bool isBottomReachable,
bool isHigherPrice, bool isLowerPrice,
double priceHigher, double priceLower,
Order orderHigher, Order orderLower,
bool isClosingAmbiguity)
{
double open = Open[bar];
double high = High[bar];
double low = Low[bar];
double close = Close[bar];
bool isOptimistic = interpolationMethod == InterpolationMethod.Optimistic;
if (eval == BacktestEval.None)
{ // There is no more orders
if (!session[bar].IsTopReached && !session[bar].IsBottomReached)
{ // Neither the top nor the bottom was reached
if (close < open)
{ // Hit the Top
current = high;
session[bar].SetWayPoint(high, WayPointType.High);
session[bar].IsTopReached = true;
}
else
{ // Hit the Bottom
current = low;
session[bar].SetWayPoint(low, WayPointType.Low);
session[bar].IsBottomReached = true;
}
}
else if (!session[bar].IsTopReached)
{ // Hit the Top
current = high;
session[bar].SetWayPoint(high, WayPointType.High);
session[bar].IsTopReached = true;
}
else if (!session[bar].IsBottomReached)
{ // Hit the Bottom
current = low;
session[bar].SetWayPoint(low, WayPointType.Low);
session[bar].IsBottomReached = true;
}
}
if (eval == BacktestEval.Correct)
{ // Hit the order or the top/bottom
Order theOrder = null;
double thePrice = 0;
if (isHigherPrice)
{
theOrder = orderHigher;
thePrice = priceHigher;
}
else if (isLowerPrice)
{
theOrder = orderLower;
thePrice = priceLower;
}
if (!session[bar].IsBottomReached && isBottomReachable)
{ // The order or the bottom
bool goUpward;
if (current - low < micron)
goUpward = false;
else if (thePrice - current < micron)
goUpward = true;
else if (theOrder.OrdDir == OrderDirection.Buy)
goUpward = !isOptimistic;
else if (theOrder.OrdDir == OrderDirection.Sell)
goUpward = isOptimistic;
else
goUpward = thePrice - current < current - low;
if (goUpward)
{ // Execute order
current = thePrice;
ExecOrd(bar, theOrder, thePrice, eval);
}
else
{ // Hit the Bottom
current = low;
session[bar].SetWayPoint(low, WayPointType.Low);
session[bar].IsBottomReached = true;
}
}
else if (!session[bar].IsTopReached && isTopReachable)
{ // The order or the top
bool goUpward;
if (current - high < micron)
goUpward = true;
else if (current - thePrice < micron)
goUpward = false;
else if (theOrder.OrdDir == OrderDirection.Buy)
goUpward = !isOptimistic;
else if (theOrder.OrdDir == OrderDirection.Sell)
goUpward = isOptimistic;
else
goUpward = high - current < current - thePrice;
if (goUpward)
{ // Hit the Top
current = high;
session[bar].SetWayPoint(high, WayPointType.High);
session[bar].IsTopReached = true;
}
else
{ // Execute order
current = thePrice;
ExecOrd(bar, theOrder, thePrice, eval);
}
}
else
{ // Execute the order
current = thePrice;
ExecOrd(bar, theOrder, thePrice, eval);
}
}
else if (eval == BacktestEval.Ambiguous)
{ // Ambiguous - two orders or order and bar closing
if (!isClosingAmbiguity)
{ // Execute one of both orders
bool executeUpper;
if (priceHigher - current < micron)
executeUpper = true;
else if (current - priceLower < micron)
executeUpper = false;
else if (session[bar].Summary.PosDir == PosDirection.Long)
executeUpper = isOptimistic;
else if (session[bar].Summary.PosDir == PosDirection.Short)
executeUpper = !isOptimistic;
else
{
if (orderHigher.OrdDir == OrderDirection.Buy && orderLower.OrdDir == OrderDirection.Buy)
executeUpper = !isOptimistic;
else if (orderHigher.OrdDir == OrderDirection.Sell && orderLower.OrdDir == OrderDirection.Sell)
executeUpper = isOptimistic;
else if (orderHigher.OrdDir == OrderDirection.Buy && orderLower.OrdDir == OrderDirection.Sell)
{
if (current < close)
executeUpper = isOptimistic;
else
executeUpper = !isOptimistic;
if (Data.Strategy.OppSignalAction == OppositeDirSignalAction.Reverse)
executeUpper = !executeUpper;
}
else
{
if (current < close)
executeUpper = !isOptimistic;
else
executeUpper = isOptimistic;
if (Data.Strategy.OppSignalAction == OppositeDirSignalAction.Reverse)
executeUpper = !executeUpper;
}
}
Order theOrder;
double thePrice;
if (executeUpper)
{
theOrder = orderHigher;
thePrice = priceHigher;
}
else
{
theOrder = orderLower;
thePrice = priceLower;
}
current = thePrice;
ExecOrd(bar, theOrder, thePrice, eval);
}
else
{ // Execute or exit the bar
if (isHigherPrice)
{
bool toExecute = false;
if (session[bar].Summary.PosDir == PosDirection.Long)
toExecute = isOptimistic;
else if (session[bar].Summary.PosDir == PosDirection.Short)
toExecute = !isOptimistic;
else if (orderHigher.OrdDir == OrderDirection.Buy)
toExecute = !isOptimistic;
else if (orderHigher.OrdDir == OrderDirection.Sell)
toExecute = isOptimistic;
if (toExecute)
{ // Execute
current = priceHigher;
ExecOrd(bar, orderHigher, priceHigher, eval);
}
else
{ // Exit the bar
current = close;
orderHigher.OrdStatus = OrderStatus.Cancelled;
session[bar].BacktestEval = BacktestEval.Ambiguous;
}
}
else if (isLowerPrice)
{ // The priceLower or Exit the bar
bool toExecute = false;
if (session[bar].Summary.PosDir == PosDirection.Long)
toExecute = !isOptimistic;
else if (session[bar].Summary.PosDir == PosDirection.Short)
toExecute = isOptimistic;
else if (orderLower.OrdDir == OrderDirection.Buy)
toExecute = isOptimistic;
else if (orderLower.OrdDir == OrderDirection.Sell)
toExecute = !isOptimistic;
if (toExecute)
{ // Execute
current = priceLower;
ExecOrd(bar, orderLower, priceLower, eval);
}
else
{ // Exit the bar
current = close;
orderLower.OrdStatus = OrderStatus.Cancelled;
session[bar].BacktestEval = BacktestEval.Ambiguous;
}
}
}
}
return;
}