/// <summary> /// Calculates the logic of a band indicator. /// </summary> /// <param name="firstBar">The first bar number.</param> /// <param name="prvs">To use the previous bar or not.</param> /// <param name="adUpperBand">The Upper band values.</param> /// <param name="adLowerBand">The Lower band values.</param> /// <param name="indCompLong">Indicator component for Long position.</param> /// <param name="indCompShort">Indicator component for Short position.</param> /// <param name="indLogic">The chosen logic.</param> protected void BandIndicatorLogic(int firstBar, int prvs, double[] adUpperBand, double[] adLowerBand, ref IndicatorComp indCompLong, ref IndicatorComp indCompShort, BandIndLogic indLogic) { double sigma = Sigma(); switch (indLogic) { case BandIndLogic.The_bar_opens_below_the_Upper_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Open[bar] < adUpperBand[bar - prvs] - sigma ? 1 : 0; indCompShort.Value[bar] = Open[bar] > adLowerBand[bar - prvs] + sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_above_the_Upper_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Open[bar] > adUpperBand[bar - prvs] + sigma ? 1 : 0; indCompShort.Value[bar] = Open[bar] < adLowerBand[bar - prvs] - sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_below_the_Lower_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Open[bar] < adLowerBand[bar - prvs] - sigma ? 1 : 0; indCompShort.Value[bar] = Open[bar] > adUpperBand[bar - prvs] + sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_above_the_Lower_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Open[bar] > adLowerBand[bar - prvs] + sigma ? 1 : 0; indCompShort.Value[bar] = Open[bar] < adUpperBand[bar - prvs] - sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_below_the_Upper_Band_after_opening_above_it: for (int bar = firstBar; bar < Bars; bar++) { int baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adUpperBand[baseBar - prvs]) < sigma && baseBar > firstBar) { baseBar--; } indCompLong.Value[bar] = Open[bar] < adUpperBand[bar - prvs] - sigma && Open[baseBar] > adUpperBand[baseBar - prvs] + sigma ? 1 : 0; baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adLowerBand[baseBar - prvs]) < sigma && baseBar > firstBar) { baseBar--; } indCompShort.Value[bar] = Open[bar] > adLowerBand[bar - prvs] + sigma && Open[baseBar] < adLowerBand[baseBar - prvs] - sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_above_the_Upper_Band_after_opening_below_it: for (int bar = firstBar; bar < Bars; bar++) { int baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adUpperBand[baseBar - prvs]) < sigma && baseBar > firstBar) { baseBar--; } indCompLong.Value[bar] = Open[bar] > adUpperBand[bar - prvs] + sigma && Open[baseBar] < adUpperBand[baseBar - prvs] - sigma ? 1 : 0; baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adLowerBand[baseBar - prvs]) < sigma && baseBar > firstBar) { baseBar--; } indCompShort.Value[bar] = Open[bar] < adLowerBand[bar - prvs] - sigma && Open[baseBar] > adLowerBand[baseBar - prvs] + sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_below_the_Lower_Band_after_opening_above_it: for (int bar = firstBar; bar < Bars; bar++) { int baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adLowerBand[baseBar - prvs]) < sigma && baseBar > firstBar) { baseBar--; } indCompLong.Value[bar] = Open[bar] < adLowerBand[bar - prvs] - sigma && Open[baseBar] > adLowerBand[baseBar - prvs] + sigma ? 1 : 0; baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adUpperBand[baseBar - prvs]) < sigma && baseBar > firstBar) { baseBar--; } indCompShort.Value[bar] = Open[bar] > adUpperBand[bar - prvs] + sigma && Open[baseBar] < adUpperBand[baseBar - prvs] - sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_above_the_Lower_Band_after_opening_below_it: for (int bar = firstBar; bar < Bars; bar++) { int baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adLowerBand[baseBar - prvs]) < sigma && baseBar > firstBar) { baseBar--; } indCompLong.Value[bar] = Open[bar] > adLowerBand[bar - prvs] + sigma && Open[baseBar] < adLowerBand[baseBar - prvs] - sigma ? 1 : 0; baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adUpperBand[baseBar - prvs]) < sigma && baseBar > firstBar) { baseBar--; } indCompShort.Value[bar] = Open[bar] < adUpperBand[bar - prvs] - sigma && Open[baseBar] > adUpperBand[baseBar - prvs] + sigma ? 1 : 0; } break; case BandIndLogic.The_bar_closes_below_the_Upper_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Close[bar] < adUpperBand[bar - prvs] - sigma ? 1 : 0; indCompShort.Value[bar] = Close[bar] > adLowerBand[bar - prvs] + sigma ? 1 : 0; } break; case BandIndLogic.The_bar_closes_above_the_Upper_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Close[bar] > adUpperBand[bar - prvs] + sigma ? 1 : 0; indCompShort.Value[bar] = Close[bar] < adLowerBand[bar - prvs] - sigma ? 1 : 0; } break; case BandIndLogic.The_bar_closes_below_the_Lower_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Close[bar] < adLowerBand[bar - prvs] - sigma ? 1 : 0; indCompShort.Value[bar] = Close[bar] > adUpperBand[bar - prvs] + sigma ? 1 : 0; } break; case BandIndLogic.The_bar_closes_above_the_Lower_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Close[bar] > adLowerBand[bar - prvs] + sigma ? 1 : 0; indCompShort.Value[bar] = Close[bar] < adUpperBand[bar - prvs] - sigma ? 1 : 0; } break; default: return; } }
/// <summary> /// Calculates the logic of a band indicator. /// </summary> /// <param name="firstBar">The first bar number.</param> /// <param name="previous">To use the previous bar or not.</param> /// <param name="adUpperBand">The Upper band values.</param> /// <param name="adLowerBand">The Lower band values.</param> /// <param name="indCompLong">Indicator component for Long position.</param> /// <param name="indCompShort">Indicator component for Short position.</param> /// <param name="indLogic">The chosen logic.</param> /// <returns>True if everyting is ok.</returns> protected bool BandIndicatorLogic(int firstBar, int previous, double[] adUpperBand, double[] adLowerBand, ref IndicatorComp indCompLong, ref IndicatorComp indCompShort, BandIndLogic indLogic) { double sigma = Sigma(); switch (indLogic) { case BandIndLogic.The_bar_opens_below_the_Upper_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Open[bar] < adUpperBand[bar - previous] - sigma ? 1 : 0; indCompShort.Value[bar] = Open[bar] > adLowerBand[bar - previous] + sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_above_the_Upper_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Open[bar] > adUpperBand[bar - previous] + sigma ? 1 : 0; indCompShort.Value[bar] = Open[bar] < adLowerBand[bar - previous] - sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_below_the_Lower_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Open[bar] < adLowerBand[bar - previous] - sigma ? 1 : 0; indCompShort.Value[bar] = Open[bar] > adUpperBand[bar - previous] + sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_above_the_Lower_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Open[bar] > adLowerBand[bar - previous] + sigma ? 1 : 0; indCompShort.Value[bar] = Open[bar] < adUpperBand[bar - previous] - sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_below_the_Upper_Band_after_opening_above_it: for (int bar = firstBar; bar < Bars; bar++) { int baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adUpperBand[baseBar - previous]) < sigma && baseBar > firstBar) { baseBar--; } indCompLong.Value[bar] = Open[bar] < adUpperBand[bar - previous] - sigma && Open[baseBar] > adUpperBand[baseBar - previous] + sigma ? 1 : 0; baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adLowerBand[baseBar - previous]) < sigma && baseBar > firstBar) { baseBar--; } indCompShort.Value[bar] = Open[bar] > adLowerBand[bar - previous] + sigma && Open[baseBar] < adLowerBand[baseBar - previous] - sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_above_the_Upper_Band_after_opening_below_it: for (int bar = firstBar; bar < Bars; bar++) { int baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adUpperBand[baseBar - previous]) < sigma && baseBar > firstBar) { baseBar--; } indCompLong.Value[bar] = Open[bar] > adUpperBand[bar - previous] + sigma && Open[baseBar] < adUpperBand[baseBar - previous] - sigma ? 1 : 0; baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adLowerBand[baseBar - previous]) < sigma && baseBar > firstBar) { baseBar--; } indCompShort.Value[bar] = Open[bar] < adLowerBand[bar - previous] - sigma && Open[baseBar] > adLowerBand[baseBar - previous] + sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_below_the_Lower_Band_after_opening_above_it: for (int bar = firstBar; bar < Bars; bar++) { int baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adLowerBand[baseBar - previous]) < sigma && baseBar > firstBar) { baseBar--; } indCompLong.Value[bar] = Open[bar] < adLowerBand[bar - previous] - sigma && Open[baseBar] > adLowerBand[baseBar - previous] + sigma ? 1 : 0; baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adUpperBand[baseBar - previous]) < sigma && baseBar > firstBar) { baseBar--; } indCompShort.Value[bar] = Open[bar] > adUpperBand[bar - previous] + sigma && Open[baseBar] < adUpperBand[baseBar - previous] - sigma ? 1 : 0; } break; case BandIndLogic.The_bar_opens_above_the_Lower_Band_after_opening_below_it: for (int bar = firstBar; bar < Bars; bar++) { int baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adLowerBand[baseBar - previous]) < sigma && baseBar > firstBar) { baseBar--; } indCompLong.Value[bar] = Open[bar] > adLowerBand[bar - previous] + sigma && Open[baseBar] < adLowerBand[baseBar - previous] - sigma ? 1 : 0; baseBar = bar - 1; while (Math.Abs(Open[baseBar] - adUpperBand[baseBar - previous]) < sigma && baseBar > firstBar) { baseBar--; } indCompShort.Value[bar] = Open[bar] < adUpperBand[bar - previous] - sigma && Open[baseBar] > adUpperBand[baseBar - previous] + sigma ? 1 : 0; } break; case BandIndLogic.The_bar_closes_below_the_Upper_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Close[bar] < adUpperBand[bar - previous] - sigma ? 1 : 0; indCompShort.Value[bar] = Close[bar] > adLowerBand[bar - previous] + sigma ? 1 : 0; } break; case BandIndLogic.The_bar_closes_above_the_Upper_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Close[bar] > adUpperBand[bar - previous] + sigma ? 1 : 0; indCompShort.Value[bar] = Close[bar] < adLowerBand[bar - previous] - sigma ? 1 : 0; } break; case BandIndLogic.The_bar_closes_below_the_Lower_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Close[bar] < adLowerBand[bar - previous] - sigma ? 1 : 0; indCompShort.Value[bar] = Close[bar] > adUpperBand[bar - previous] + sigma ? 1 : 0; } break; case BandIndLogic.The_bar_closes_above_the_Lower_Band: for (int bar = firstBar; bar < Bars; bar++) { indCompLong.Value[bar] = Close[bar] > adLowerBand[bar - previous] + sigma ? 1 : 0; indCompShort.Value[bar] = Close[bar] < adUpperBand[bar - previous] - sigma ? 1 : 0; } break; default: return false; } return true; }