Код: Выделить всё
function Initialize()
{
IndicatorName = "Cyber_Cycle_Period_OlNi"; // Задайте название индикатора и сохраните с данным именем
PriceStudy = false; // Рисовать в области цены (true – да, false – нет)
AddInput("Input", Inputs.Candle); // Input - входной ряд (Inputs.Price) или свечи (Inputs.Candle)
AddParameter("alfa",0.07);
AddSeries("Period", DrawAs.Line, Color.Green);
AddSeries("Price", DrawAs.Line, Color.Red, false);
AddSeries("h", DrawAs.Line, Color.Red, false );
AddSeries("l", DrawAs.Line, Color.Red, false );
AddSeries("Cycle", DrawAs.Line, Color.Red );
AddSeries("Smootch", DrawAs.Line, Color.Gray, false );
AddSeries("Q1", DrawAs.Line, Color.Red, false );
AddSeries("I1", DrawAs.Line, Color.Red, false );
AddSeries("DeltaPhase", DrawAs.Line, Color.Red, false );
AddSeries("Median", DrawAs.Line, Color.Red, false );
AddSeries("InstPeriod", DrawAs.Line, Color.Red, false );
AddSeries("DC", DrawAs.Line, Color.Red , false );
AddSeries("L0", DrawAs.Line, Color.Green, false );
AddSeries("L1", DrawAs.Line, Color.Green, false );
AddSeries("L2", DrawAs.Line, Color.Green, false );
AddSeries("L3", DrawAs.Line, Color.Green, false );
AddSeries("L4", DrawAs.Line, Color.Green, false );
}
function Evaluate()
{
if (CurrentIndex <7)
Cycle=(Price[0]-2*Price[1]+Price[2])/4;
else
{ h=Input.High[0];
l=Input.Low[0];
Price=(h+l)/2;
//Применение Элерсом фильтра НЧ(КИХ) для устранения шумов:
Smootch=(Price[0]+2*Price[1]+2*Price[2]+Price[3])/6;
Cycle=(1-0.5*alfa)*(1-0.5*alfa)*(Smootch[0]-2*Smootch[1]+Smootch[2])+2*(1-alfa)*Cycle[1]-(1-alfa)*(1-alfa)*Cycle[2];
}
//Вычисление реальной части:
Q1 = (0.0962*Cycle[0] + 0.5769*Cycle[2] - 0.5769*Cycle[4]-0.0962*Cycle[6])*(0.5 + 0.08*InstPeriod[1]);
//Мнимая часть:
I1 = Cycle[3];
if (Q1[0] != 0 && Q1[1] != 0)
DeltaPhase = (I1/Q1-I1[1]/Q1[1]) / (1 + I1*I1[1]/(Q1*Q1[1]));
if (DeltaPhase < 0.1)
DeltaPhase = 0.1;
if (DeltaPhase > 1.1)
DeltaPhase = 1.1;
//////////////////////////////______SORT_______________///////////////////////////////////////////
double [] inputArray = {DeltaPhase[0], DeltaPhase[1],DeltaPhase[2],DeltaPhase[3],DeltaPhase[4]};
Array.Sort(inputArray);
double MedianDelta =inputArray[2];
if (inputArray[2]==0)
DC = 15;
else
{ DC = 6.28318 / MedianDelta + 0.5;
}
InstPeriod = 0.33*DC + 0.67*InstPeriod[1];
Period =0.15*InstPeriod + 0.85*Period[1];
}