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]; }