# Projection Oscillator

ICE Data Services -

ProjectionOsc.efs
EFSLibrary - Discussion Board

File Name: ProjectionOsc.efs

Description:
Projection Oscillator

Formula Parameters:

• Length : 14
• Smoothing : 3

Notes:
Projection bands, a new method using trading bands, projects market data forward along the data trend with the maxima and minima of the projections defining the band. The method provides another means of signaling potential changes for market direction relative to the trend.
This is the second component of this method, the Projection Oscillator indicator.
In fact, the projection oscillator might be thought of as being analogous to the stochastics indicator with a trend correction.
This indicator is calculated according to the next formula:

`POC = 100 x (C - PLC) / (PUC - PLC)`

Actually this indicator plots 2 indicators: Projection Oscillator itself and smoothed Projection Oscillator, which is simply the n day exponential moving average (EMA) of Projection oscillator

ProjectionOsc.efs

EFS Code:

```/*********************************
Provided By:
eSignal (Copyright c eSignal), a division of Interactive Data
Formula Script (EFS) is for educational purposes only and may be
modified and saved under a new file name.  eSignal is not responsible
for the functionality once modified.  eSignal reserves the right
to modify and overwrite this EFS file with each new release.

Description:
Projection Oscillator

Version:            1.0  04/27/2009

Formula Parameters:                     Default:
Length                              14
Smoothing                           3

Notes:
Projection bands, a new method using trading bands, projects market data
forward along the data trend with the maxima and minima of the projections
defining the band. The method provides another means of signaling potential
changes for market direction relative to the trend.
This is the second component of this method, the Projection Oscillator indicator.
In fact, the projection oscillator might be thought of as being analogous to the
stochastics indicator with a trend correction.
This indicator is calculated according to the next formula:
POC = 100 x (C - PLC) / (PUC - PLC)
Actually this indicator plots 2 indicators: Projection Oscillator itself and smoothed
Projection Oscillator, which is simply the n day exponential moving average (EMA) of
Projection oscillator

**********************************/
var fpArray = new Array();
var bInit = false;

function preMain() {
setStudyTitle("Projection Oscillator");
setCursorLabelName("PO", 0);
setCursorLabelName("SlowPO", 1);
setDefaultBarFgColor(Color.red, 0);
setDefaultBarFgColor(Color.aqua, 1);
var x = 0;
fpArray[x] = new FunctionParameter("Length", FunctionParameter.NUMBER);
with(fpArray[x++]) {
setLowerLimit(1);
setDefault(14);
}
fpArray[x] = new FunctionParameter("Smoothing", FunctionParameter.NUMBER);
with(fpArray[x++]) {
setLowerLimit(1);
setDefault(3);
}
}

var xPOC = null;
var xSlowPO = null;

function main(Length, Smoothing) {
var nBarState = getBarState();
if (nBarState == BARSTATE_ALLBARS) {
if (Length == null) Length = 14;
if (Smoothing == null) Smoothing = 3;
}
if (bInit == false) {
xPOC = efsInternal("Calc_Value", Length);
xSlowPO = ema(Smoothing, xPOC);
bInit = true;
}
var PO = xPOC.getValue(0);
var SlowPO = xSlowPO.getValue(0);
if (SlowPO == null) return;
return new Array(PO, SlowPO);
}

var bSecondInit = false;
var xHigh = null;
var xLow = null;

function Calc_Value(Length) {
var SL = 0;
var SH = 0;
var Sum1_1 = 0;
var Sum1_2 = 0;
var SumY1 = 0;
var SumY2 = 0;
var i = 0;
var Value2 = 0;
var Value3 = 0;
var PL = 0;
var PU = 0;
var SlowPO = 0;
if (bSecondInit == false) {
xHigh = high();
xLow = low();
bSecondInit = true;
}
if (xHigh.getValue(-Length) == null) return;
var SumBars = Length * (Length - 1) * .5;
var SumSqrBars = (Length - 1) * Length * (2 * Length - 1) / 6;
for (i = 0; i < Length; i++) {
Sum1_1 += i * xLow.getValue( - i);
Sum1_2 += i * xHigh.getValue( - i);
SumY1 += xLow.getValue( - i);
SumY2 += xHigh.getValue( - i);
}
var Sum2_1 = SumBars * SumY1;
var Sum2_2 = SumBars * SumY2;
var Num1_1 = Length * Sum1_1 - Sum2_1;
var Num1_2 = Length * Sum1_2 - Sum2_2;
var Num2 = SumBars * SumBars - Length * SumSqrBars;
SL = Num1_1 / Num2;
SH = Num1_2 / Num2;
for (i = 1; i <= Length; i++) {
Value2 = xLow.getValue( - (i - 1)) + (SL * i - 1);
Value3 = xHigh.getValue( - (i - 1)) + (SH * i - 1);
if (i == 1) {
PL = Value2;
PU = Value3;
}
if (Value2 < PL) PL = Value2;
if (Value3 > PU) PU = Value3;
}
var PO = 100 * (close(0) - PL) / (PU - PL);
return PO;
}```