protected bool NoDirectionOscillatorLogic(int firstBar, int prvs, double[] adIndValue, double dLevel, ref IndicatorComp indComp, IndicatorLogic indLogic)
{
double sigma = Sigma();
switch (indLogic)
{
case IndicatorLogic.The_indicator_rises:
for (int bar = firstBar; bar < Bars; bar++)
{
int currBar = bar - prvs;
int baseBar = currBar - 1;
bool isHigher = adIndValue[currBar] > adIndValue[baseBar];
bool isNoChange = true;
while (Math.Abs(adIndValue[currBar] - adIndValue[baseBar]) < sigma && isNoChange && baseBar > firstBar)
{
isNoChange = (isHigher == (adIndValue[baseBar + 1] > adIndValue[baseBar]));
baseBar--;
}
indComp.Value[bar] = adIndValue[baseBar] < adIndValue[currBar] - sigma ? 1 : 0;
}
break;
case IndicatorLogic.The_indicator_falls:
for (int bar = firstBar; bar < Bars; bar++)
{
int currBar = bar - prvs;
int baseBar = currBar - 1;
bool isHigher = adIndValue[currBar] > adIndValue[baseBar];
bool isNoChange = true;
while (Math.Abs(adIndValue[currBar] - adIndValue[baseBar]) < sigma && isNoChange && baseBar > firstBar)
{
isNoChange = (isHigher == (adIndValue[baseBar + 1] > adIndValue[baseBar]));
baseBar--;
}
indComp.Value[bar] = adIndValue[baseBar] > adIndValue[currBar] + sigma ? 1 : 0;
}
break;
case IndicatorLogic.The_indicator_is_higher_than_the_level_line:
for (int bar = firstBar; bar < Bars; bar++)
{
indComp.Value[bar] = adIndValue[bar - prvs] > dLevel + sigma ? 1 : 0;
}
break;
case IndicatorLogic.The_indicator_is_lower_than_the_level_line:
for (int bar = firstBar; bar < Bars; bar++)
{
indComp.Value[bar] = adIndValue[bar - prvs] < dLevel - sigma ? 1 : 0;
}
break;
case IndicatorLogic.The_indicator_crosses_the_level_line_upward:
for (int bar = firstBar; bar < Bars; bar++)
{
int baseBar = bar - prvs - 1;
while (Math.Abs(adIndValue[baseBar] - dLevel) < sigma && baseBar > firstBar)
{ baseBar--; }
indComp.Value[bar] = (adIndValue[baseBar] < dLevel - sigma && adIndValue[bar - prvs] > dLevel + sigma) ? 1 : 0;
}
break;
case IndicatorLogic.The_indicator_crosses_the_level_line_downward:
for (int bar = firstBar; bar < Bars; bar++)
{
int baseBar = bar - prvs - 1;
while (Math.Abs(adIndValue[baseBar] - dLevel) < sigma && baseBar > firstBar)
{ baseBar--; }
indComp.Value[bar] = (adIndValue[baseBar] > dLevel + sigma && adIndValue[bar - prvs] < dLevel - sigma) ? 1 : 0;
}
break;
case IndicatorLogic.The_indicator_changes_its_direction_upward:
for (int bar = firstBar; bar < Bars; bar++)
{
int bar0 = bar - prvs;
int bar1 = bar0 - 1;
while (Math.Abs(adIndValue[bar0] - adIndValue[bar1]) < sigma && bar1 > firstBar)
{ bar1--; }
int bar2 = bar1 - 1 > firstBar ? bar1 - 1 : firstBar;
while (Math.Abs(adIndValue[bar1] - adIndValue[bar2]) < sigma && bar2 > firstBar)
{ bar2--; }
indComp.Value[bar] = (adIndValue[bar2] > adIndValue[bar1] && adIndValue[bar1] < adIndValue[bar0] && bar1 == bar0 - 1) ? 1 : 0;
}
break;
case IndicatorLogic.The_indicator_changes_its_direction_downward:
for (int bar = firstBar; bar < Bars; bar++)
{
int bar0 = bar - prvs;
int bar1 = bar0 - 1;
while (Math.Abs(adIndValue[bar0] - adIndValue[bar1]) < sigma && bar1 > firstBar)
{ bar1--; }
int bar2 = bar1 - 1 > firstBar ? bar1 - 1 : firstBar;
while (Math.Abs(adIndValue[bar1] - adIndValue[bar2]) < sigma && bar2 > firstBar)
{ bar2--; }
indComp.Value[bar] = (adIndValue[bar2] < adIndValue[bar1] && adIndValue[bar1] > adIndValue[bar0] && bar1 == bar0 - 1) ? 1 : 0;
}
break;
default:
return false;
}
return true;
}