A paintbar can create a new "indicator" based on an existing indicator. For example, one of our users asked how he can apply a moving average to the Aroon Oscillator indicator.
This is how you would do it with a paintbar (the following code creates an EMA(10) of Aroon Oscillator and plots it. You use the paintbar's state-keeping mechanism to do it. In the code, the Aroon variable is the Pre-Defined Indicator Variable for the chart's Aroon Oscillator indicator.
double fEMAMult; // EMA Multiplier
///<summary> /// Is called at start of paintbar calculation, should be used to initialize anything needed for the paintbar ///</summary> private void PaintbarInitialize() { fEMAMult = 2.0D/(10+1.0D); }
///<summary> /// Holds paintbar state - fill with variables needed to be preserved for next paintbar calc ///</summary> private struct PaintbarState { public double NowEMA; }
///<summary> /// Holds current PB state - use to calc PB, changes to it carry over to next PB calc ///</summary> private PaintbarState CurrentState;
///<summary> /// Holds saved PB state - internal ///</summary> private PaintbarState SavedState;
///<summary> /// Is called at start of paintbar calculation, should be used to clear the paintbar state ///</summary> private void PaintbarClearState() { CurrentState = new PaintbarState(); CurrentState.NowEMA = double.MinValue; }
///<summary> /// Saves paintbar state (called internally). ///</summary> private void PaintbarSaveState() { SavedState = CurrentState; }
///<summary> /// Restores paintbar state (called internally). ///</summary> private void PaintbarRestoreState() { CurrentState = SavedState; }
public void MainCalculation() { // calculate the EMA of the EMA if (CurrentState.NowEMA == double.MinValue) CurrentState.NowEMA = Aroon; else CurrentState.NowEMA += fEMAMult * (Aroon - CurrentState.NowEMA);
SetColorAndShape("Line", PBShape.Rectangle, SysColor.MainIndicator2); SetYValue(CurrentState.NowEMA);
}
|