/*********************************Provided By: eSignal (Copyright c eSignal), a division of Interactive Data Corporation. 2016. All rights reserved. This sample eSignal Formula Script (EFS) is for educational purposes only and may be modified and saved under a new file name. eSignal is not responsiblefor the functionality once modified. eSignal reserves the right to modify and overwrite this EFS file with each new release.Description: Measuring Market Cycles by John F. EhlersVersion: 1.00 07/12/2016Formula Parameters: Default:Enhance Resolution falseNotes:The related article is copyrighted material. If you are not a subscriberof Stocks & Commodities, please visit www.traders.com.**********************************/var fpArray = new Array()function preMain(){ setPriceStudy(false); setShowCursorLabel(false); for (var i = 0; i < 41; i++) setDefaultBarThickness(4,i); var x = 0; fpArray[x] = new FunctionParameter("EnhanceRes", FunctionParameter.BOOLEAN) with(fpArray[x++]){ setName("Enhance Resolution"); setDefault(false); } }var bInit = false;var bVersion = null;var nAvgLength = 3;var HP = 0;var HP_1 = 0;var a1 = 0;var b1 = 0;var c1 = 0;var c2 = 0;var c3 = 0;var Period = null;var DominantCycle = null;var DominantCycle_1 = 0;var ColorR = 0;var ColorG = 0;var ColorB = 0;var xClose = null;var xRoof = null;var R = new Array(41);var Pwr = new Array(41);var retVal = new Array(41);var Corr = new Array(48);function main(EnhanceRes){ if (bVersion == null) bVersion = verify(); if (bVersion == false) return; if (getCurrentBarCount() <= 48) return; if (getBarState() == BARSTATE_ALLBARS){ bInit = false; } if(!bInit){ _vars_Reset(); _init_Array(); xClose = close(); xRoof = efsInternal("Calc_Roof", xClose); bInit = true; } Calc_Spectrum(xRoof, Corr); var MaxPwr = 0.0001; for (Period = 1; Period <= 41; Period++){ if (R[Period] > MaxPwr) MaxPwr = R[Period]; } for (Period = 1; Period <= 41; Period++){ Pwr[Period] = R[Period] / MaxPwr; } if(EnhanceRes){ for (Period = 1; Period <= 41; Period++) Pwr[Period] = Math.pow(Pwr[Period],3); } DominantCycle = 0; var PeakPwr = 0; for (Period = 1; Period <= 41; Period++){ if (Pwr[Period] > PeakPwr) PeakPwr = Pwr[Period]; } var Spx = 0; var Sp = 0; for (Period = 1; Period <= 41; Period++){ if (PeakPwr >= 0.25 && Pwr[Period] >= 0.25){ Spx += Period * Pwr[Period]; Sp += Pwr[Period]; } } if (Sp != 0) DominantCycle = Spx / Sp; if (Sp < 0.25) DominantCycle = DominantCycle_1; DominantCycle_1 = DominantCycle; for (Period = 0; Period <= 40; Period++){ if (Pwr[Period] > 0.5){ ColorR = 255; ColorG = Math.floor(255 * ((2 * Pwr[Period]) - 1)); } else{ ColorR = Math.floor(2 * 255 * Pwr[Period]); ColorG = 0; } setBarFgColor(Color.RGB(ColorR, ColorG, ColorB), Period); } return retVal;}var alpha1 = 0;var bSecondInit = false;function Calc_Roof(xClose){ if (xClose.getValue(-1) == null) return; var Filt_1 = ref(-1); var Filt_2 = ref(-2); if(Filt_2 == null) Filt_2 = 0; if(Filt_1 == null) Filt_1 = 0; if (getBarState() == BARSTATE_NEWBAR){ HP_1 = HP; } if (!bSecondInit){ alpha1 = (1 - Math.sin(Math.PI/180*(360/48)))/Math.cos(Math.PI/180*(360/48)); bSecondInit = true; } HP = 0.5 * (1 + alpha1) * (xClose.getValue(0) - xClose.getValue(-1)) + alpha1 * HP_1; a1 = Math.exp((-Math.SQRT2) * Math.PI / 8); b1 = 2 * a1 * Math.cos(Math.PI/180*Math.SQRT2 *180/8); c2 = b1; c3 = (- a1) * a1; c1 = 1 - c2 - c3; var Filt = (c1 * (HP + HP_1) / 2) + c2 * Filt_1 + c3 * Filt_2; return Filt;}function Calc_Spectrum(xRoof,Corr){ var SqSum = new Array(41); var Sx = 0; var Sy = 0; var Sxx = 0; var Syy = 0; var Sxy = 0; var X = 0; var Y = 0; var M = 0; var N = 0; var temp = 0; for (var i = 0; i < 41; i++){ SqSum[i] = 0; } var Lag = 0; var count = 0; for(Lag = 0; Lag <= 48; Lag++){ M = nAvgLength; if(nAvgLength == 0) M = Lag; Sx = 0; Sy = 0; Sxx = 0; Syy = 0; Sxy = 0; for(count = 0; count < M; count++){ X = xRoof.getValue(-count); Y = xRoof.getValue(-(Lag+count)); Sx += X; Sy += Y; Sxx += X * X; Sxy += X * Y ; Syy += Y * Y; } temp =(M * Sxx - Sx * Sx) * (M * Syy - Sy * Sy); if (temp > 0.0001) Corr[Lag] = (M * Sxy - Sx * Sy)/(Math.sqrt(temp)); } var CosinePart = 0; var SinePart = 0; for (Period = 8; Period <= 48; Period++){ CosinePart = 0; SinePart = 0; for (N = 3; N <= 48; N++){ CosinePart += Corr[N] * Math.cos(Math.PI/180*(360 * N / Period)); SinePart += Corr[N] * Math.sin(Math.PI/180*(360 * N / Period)); } SqSum[Period-8] = (CosinePart * CosinePart) + (SinePart * SinePart); } AMA(SqSum); }function AMA(SqSum){ for (Period = 0; Period <= 40; Period++){ R[Period] = 0.2 * SqSum[Period] * SqSum[Period] + 0.8 * R[Period]; }}function _init_Array(){ var i = 0; for (i = 0; i < 41; i++){ Pwr[i] = 0; R[i] = 0; } for (i = 0; i < 49; i++) Corr[i] = 0; for (i = 0; i<41; i++) retVal[i] = i + 8;}function _vars_Reset(){ alpha1 = 0; HP = 0; HP_1 = 0; a1 = 0; b1 = 0; c1 = 0; c2 = 0; c3 = 0; Period = null; DominantCycle = null; DominantCycle_1 = 0; ColorR = 0; ColorG = 0; ColorB = 0; xClose = null; xRoof = null; R = new Array(41); Pwr = new Array(41); retVal = new Array(41); Corr = new Array(48);}function verify(){ var b = false; if (getBuildNumber() < 779){ drawTextAbsolute(5, 35, "This study requires version 10.6 or later.", Color.white, Color.blue, Text.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT, null, 13, "error"); drawTextAbsolute(5, 20, "Click HERE to upgrade.@URL=http://www.esignal.com/download/default.asp", Color.white, Color.blue, Text.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT, null, 13, "upgrade"); return b; } else b = true; return b;} |