Код: Выделить всё
function Initialize()
{
IndicatorName = "WVF"; // Задайте название индикатора и сохраните с данным именем
PriceStudy = false; // Рисовать в области цены (true – да, false – нет)
AddInput("Input", Inputs.Candle); // Input - входной ряд (Inputs.Price) или свечи (Inputs.Candle)
AddSeries("WVF", DrawAs.Custom, Color.Lime ,AxisType.ZeroBased); // Задаем вид линии индикатора
AddSeries("High", DrawAs.Line, Color.Green,false);
AddSeries("Low",DrawAs.Line, Color.Red,false);
AddSeries("sDev", DrawAs.Line, Color.Red,false);
AddSeries("sSMA", DrawAs.Line, Color.Gray,false);
AddSeries("upperBand", DrawAs.Line, Color.Blue);
AddSeries("lowerBand", DrawAs.Line, Color.Red);
AddParameter("mult",2);
AddParameter("Period", 22); // Задаем имя изменяемого параметра и его значение
AddParameter("PeriodBB", 20);
AddGlobalVariable("SUM", Types.Double, 0.0);
AddGlobalVariable("sSUM", Types.Double, 0.0);
AddLevel(0, Color.Gray,"WVF");
}
function Evaluate()
{
High=Input.Close[0];
if ( CurrentIndex >= Period )
{
int i = 0;
for (i = 0; i < Period; i++)
High = Math.Max(Input.Close[i], High[0]);
}
Low = Input.Low[0];
WVF = ((High[0]-Low[0])/High[0])*100;
//WVF.DrawHistogram();
if ( CurrentIndex < PeriodBB )
{
sSUM = sSUM + WVF[0];
sSMA = sSUM / (CurrentIndex + 1);
}
else
{
sSUM = sSUM + WVF[0] - WVF[(int)(-PeriodBB)] ;
sSMA = sSUM/ Period;
}
//sSMA.DrawLine();
if ( CurrentIndex < PeriodBB )
{
SUM = SUM + WVF[0];
var sma = SUM / (CurrentIndex + 1);
sDev = 0.0;
}
else
{
SUM = SUM + WVF[0] - WVF[0-PeriodBB];
var sma = SUM/ PeriodBB;
var sigma = 0.0;
for (var i = 0; i < PeriodBB; i++ )
sigma = sigma + Math.Pow(WVF[-i]-sma, 2.0);
sDev = Math.Sqrt(sigma/PeriodBB);
}
//sDev.DrawLine();
lowerBand[0] = sSMA[0] - mult*sDev[0];
lowerBand.DrawLine();
upperBand[0] = sSMA[0] + mult*sDev[0];
upperBand.DrawLine();
if (WVF[0] > upperBand[0])
{
WVF.DrawHistogram(Color.Lime);
}
else
{
WVF.DrawHistogram(Color.Gray);
}
}
Буду рад, если профессионалы оптимизируют код. У меня пока с преобразованием типов не получается.