public override void Calculate(SlotTypes slotType)
{
// Reading the parameters
double dShift = IndParam.NumParam[0].Value * Point;
int iFirstBar = 1;
// Calculation
double[] adTopPrice = new double[Bars];
double[] adBottomPrice = new double[Bars];
adTopPrice[0] = 0;
adBottomPrice[0] = 0;
double dTop = double.MinValue;
double dBottom = double.MaxValue;
for (int iBar = 1; iBar < Bars; iBar++)
{
if (High[iBar - 1] > dTop)
dTop = High[iBar - 1];
if (Low[iBar - 1] < dBottom)
dBottom = Low[iBar - 1];
if (IsPeriodChanged(iBar))
{
adTopPrice[iBar] = dTop;
adBottomPrice[iBar] = dBottom;
dTop = double.MinValue;
dBottom = double.MaxValue;
}
else
{
adTopPrice[iBar] = adTopPrice[iBar - 1];
adBottomPrice[iBar] = adBottomPrice[iBar - 1];
}
}
double[] adUpperBand = new double[Bars];
double[] adLowerBand = new double[Bars];
for (int iBar = iFirstBar; iBar < Bars; iBar++)
{
adUpperBand[iBar] = adTopPrice[iBar] + dShift;
adLowerBand[iBar] = adBottomPrice[iBar] - dShift;
}
// Saving the components
Component = new IndicatorComp[4];
Component[0] = new IndicatorComp();
Component[0].CompName = "Top price";
Component[0].DataType = IndComponentType.IndicatorValue;
Component[0].ChartType = IndChartType.Level;
Component[0].ChartColor = Color.DarkGreen;
Component[0].FirstBar = iFirstBar;
Component[0].Value = adTopPrice;
Component[1] = new IndicatorComp();
Component[1].CompName = "Bottom price";
Component[1].DataType = IndComponentType.IndicatorValue;
Component[1].ChartType = IndChartType.Level;
Component[1].ChartColor = Color.DarkRed;
Component[1].FirstBar = iFirstBar;
Component[1].Value = adBottomPrice;
Component[2] = new IndicatorComp();
Component[2].ChartType = IndChartType.NoChart;
Component[2].FirstBar = iFirstBar;
Component[2].Value = new double[Bars];
Component[3] = new IndicatorComp();
Component[3].ChartType = IndChartType.NoChart;
Component[3].FirstBar = iFirstBar;
Component[3].Value = new double[Bars];
// Sets the Component's type
if (slotType == SlotTypes.Open)
{
Component[2].CompName = "Long position entry price";
Component[2].DataType = IndComponentType.OpenLongPrice;
Component[3].CompName = "Short position entry price";
Component[3].DataType = IndComponentType.OpenShortPrice;
}
else if (slotType == SlotTypes.OpenFilter)
{
Component[2].CompName = "Is long entry allowed";
Component[2].DataType = IndComponentType.AllowOpenLong;
Component[3].CompName = "Is short entry allowed";
Component[3].DataType = IndComponentType.AllowOpenShort;
}
else if (slotType == SlotTypes.Close)
{
Component[2].CompName = "Long position closing price";
Component[2].DataType = IndComponentType.CloseLongPrice;
Component[3].CompName = "Short position closing price";
Component[3].DataType = IndComponentType.CloseShortPrice;
}
else if (slotType == SlotTypes.CloseFilter)
{
Component[2].CompName = "Close out long position";
Component[2].DataType = IndComponentType.ForceCloseLong;
Component[3].CompName = "Close out short position";
Component[3].DataType = IndComponentType.ForceCloseShort;
}
switch (IndParam.ListParam[0].Text)
{
case "Enter long at the top price":
case "Exit long at the top price":
Component[2].Value = adUpperBand;
Component[3].Value = adLowerBand;
break;
case "Enter long at the bottom price":
case "Exit long at the bottom price":
Component[2].Value = adLowerBand;
Component[3].Value = adUpperBand;
break;
case "The bar opens below the top price":
BandIndicatorLogic(iFirstBar, 0, adUpperBand, adLowerBand, ref Component[2], ref Component[3], BandIndLogic.The_bar_opens_below_the_Upper_Band);
break;
case "The bar opens above the top price":
BandIndicatorLogic(iFirstBar, 0, adUpperBand, adLowerBand, ref Component[2], ref Component[3], BandIndLogic.The_bar_opens_above_the_Upper_Band);
break;
case "The bar opens below the bottom price":
BandIndicatorLogic(iFirstBar, 0, adUpperBand, adLowerBand, ref Component[2], ref Component[3], BandIndLogic.The_bar_opens_below_the_Lower_Band);
break;
case "The bar opens above the bottom price":
BandIndicatorLogic(iFirstBar, 0, adUpperBand, adLowerBand, ref Component[2], ref Component[3], BandIndLogic.The_bar_opens_above_the_Lower_Band);
break;
case "The bar closes below the top price":
BandIndicatorLogic(iFirstBar, 0, adUpperBand, adLowerBand, ref Component[2], ref Component[3], BandIndLogic.The_bar_opens_below_the_Upper_Band);
break;
case "The bar closes above the top price":
BandIndicatorLogic(iFirstBar, 0, adUpperBand, adLowerBand, ref Component[2], ref Component[3], BandIndLogic.The_bar_closes_above_the_Upper_Band);
break;
case "The bar closes below the bottom price":
BandIndicatorLogic(iFirstBar, 0, adUpperBand, adLowerBand, ref Component[2], ref Component[3], BandIndLogic.The_bar_closes_below_the_Lower_Band);
break;
case "The bar closes above the bottom price":
BandIndicatorLogic(iFirstBar, 0, adUpperBand, adLowerBand, ref Component[2], ref Component[3], BandIndLogic.The_bar_closes_above_the_Lower_Band);
break;
case "The position opens above the top price":
Component[0].DataType = IndComponentType.Other;
Component[1].DataType = IndComponentType.Other;
Component[2].CompName = "Shifted top price";
Component[2].DataType = IndComponentType.OpenLongPrice;
Component[2].PosPriceDependence = PositionPriceDependence.PriceBuyHigher;
Component[3].CompName = "Shifted bottom price";
Component[3].DataType = IndComponentType.OpenShortPrice;
Component[3].PosPriceDependence = PositionPriceDependence.PriceSellLower;
Component[2].Value = adUpperBand;
Component[3].Value = adLowerBand;
break;
case "The position opens below the top price":
Component[0].DataType = IndComponentType.Other;
Component[1].DataType = IndComponentType.Other;
Component[2].CompName = "Shifted top price";
Component[2].DataType = IndComponentType.OpenLongPrice;
Component[2].PosPriceDependence = PositionPriceDependence.PriceBuyLower;
Component[3].CompName = "Shifted bottom price";
Component[3].DataType = IndComponentType.OpenShortPrice;
Component[3].PosPriceDependence = PositionPriceDependence.PriceSellHigher;
Component[2].Value = adUpperBand;
Component[3].Value = adLowerBand;
break;
case "The position opens above the bottom price":
Component[0].DataType = IndComponentType.Other;
Component[1].DataType = IndComponentType.Other;
Component[2].CompName = "Shifted bottom price";
Component[2].DataType = IndComponentType.OpenLongPrice;
Component[2].PosPriceDependence = PositionPriceDependence.PriceBuyHigher;
Component[3].CompName = "Shifted top price";
Component[3].DataType = IndComponentType.OpenShortPrice;
Component[3].PosPriceDependence = PositionPriceDependence.PriceSellLower;
Component[2].Value = adLowerBand;
Component[3].Value = adUpperBand;
break;
case "The position opens below the bottom price":
Component[0].DataType = IndComponentType.Other;
Component[1].DataType = IndComponentType.Other;
Component[2].CompName = "Shifted bottom price";
Component[2].DataType = IndComponentType.OpenLongPrice;
Component[2].PosPriceDependence = PositionPriceDependence.PriceBuyLower;
Component[3].CompName = "Shifted top price";
Component[3].DataType = IndComponentType.OpenShortPrice;
Component[3].PosPriceDependence = PositionPriceDependence.PriceSellHigher;
Component[2].Value = adLowerBand;
Component[3].Value = adUpperBand;
break;
default:
break;
}
return;
}