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