no i got it from standard indicators RMI = Relative Momentum Indicator
but here are the guts of the code
protected override void Initialize()
{
Add(new Plot(Color.Lime, "RMI"));
Add(new Line(System.Drawing.Color.Green, 30, "Lower"));
Add(new Line(System.Drawing.Color.Black, 50, "Center"));
Add(new Line(System.Drawing.Color.Red, 70, "Upper"));
avgUp = new DataSeries(this);
avgDown = new DataSeries(this);
PriceTypeSupported = true;
}
/// <summary>
/// Calculates the indicator value(s) at the current index.
/// </summary>
protected override void OnBarUpdate()
{
double amountUp = 0;
double amountDown = 0;
double rmi = 0;
if (CurrentBar ==0)
{
avgUp.Set(0);
avgDown.Set(0);
return;
}
if (CurrentBar < (Period + Shift))
{
return;
}
else if (CurrentBar == (Period + Shift))
{
double sumUp = 0;
double sumDown = 0;
for (int barsAgo = 0; barsAgo < Period; barsAgo++)
{
amountUp = Input[barsAgo] - Input[barsAgo + Shift];
if (amountUp >= 0)
{
amountDown = 0;
}
else
{
amountDown = -amountUp;
amountUp = 0;
}
sumUp = sumUp + amountUp;
sumDown = sumDown + amountDown;
}
avgUp.Set( sumUp / Period);
avgDown.Set( sumDown / Period);
}
else
{
amountUp = Input[0] - Input[Shift];
if (amountUp >= 0)
{
amountDown = 0;
}
else
{
amountDown = -amountUp;
amountUp = 0;
}
avgUp.Set((avgUp[1] * (Period - 1) + amountUp) / Period);
avgDown.Set((avgDown[1] * (Period - 1) + amountDown) / Period);
}
if ((avgUp[0] + avgDown[0]) != 0)
{
rmi = 100 * avgUp[0] / (avgUp[0] + avgDown[0]);
}
else rmi = 0;
Value.Set(rmi);
}
#region Properties
Comment