The converted code compiles and plots on charts without throwing up an error in the log but it is definitely NOT looking like it should.
Could someone please take a read through my code and see where I have gone wrong?
Many thanks
namespace NinjaTrader.NinjaScript.Indicators
{
public class PRC : Indicator
{
private double[,] ai = new double[10, 10];
private double[] b = new double[10];
private double[] x = new double[10];
private double[] sx = new double[10];
private double sum;
private int ip;
private int p;
private int n;
private int f;
private double qq;
private double mm;
private double tt;
private int ii;
private int jj;
private int kk;
private int ll;
private int nn;
private double sq;
private double sq2;
private int i0 = 0;
private int mi;
private Series <double> median;
private Series <double> sqh;
private Series <double> sqh2;
private Series <double> sql;
private Series <double> sql2;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"PRC";
Name = "PRC";
Calculate = Calculate.OnEachTick;
IsOverlay = true;
DisplayInDataBox = true;
DrawOnPricePanel = true;
DrawHorizontalGridLines = true;
DrawVerticalGridLines = true;
PaintPriceMarkers = true;
ScaleJustification = NinjaTrader.Gui.Chart.ScaleJustification.Right;
//Disable this property if your indicator requires custom values that cumulate with each new market data event.
//See Help Guide for additional information.
IsSuspendedWhileInactive = true;
Degree = 3;
Period = 120;
StrdDev = 1.62;
StrdDev2 = 2;
AddPlot(new Stroke(Brushes.DarkGray), PlotStyle.Line, "Median");
AddPlot(new Stroke(Brushes.Red), PlotStyle.Line, "SQH");
AddPlot(new Stroke(Brushes.Red), PlotStyle.Line, "SQH2");
AddPlot(new Stroke(Brushes.Blue), PlotStyle.Line, "SQL");
AddPlot(new Stroke(Brushes.Blue), PlotStyle.Line, "SQL2");
}
else if (State == State.DataLoaded)
{
median = new Series<double>(this);
sqh = new Series<double>(this);
sqh2 = new Series<double>(this);
sql = new Series<double>(this);
sql2 = new Series<double>(this);
}
}
protected override void OnBarUpdate()
{
if( CurrentBar < Period) return;
ip = Period;
p = ip;
sx[1] = p + 1;
nn = Degree + 1;
//----------------------sx-------------------------------------------------------------------
//
for (mi = 1; mi <= nn * 2 - 2; mi++)
{
sum = 0;
for (n = i0; n <= i0 + p; n++)
{
sum += Math.Pow(n, mi);
}
sx[mi + 1] = sum;
}
//----------------------syx-----------
for (mi = 1; mi <= nn; mi++)
{
sum = 0.0;
for (n = i0; n <= i0 + p; n++)
{
if (mi == 1)
sum += Close[n];
else
sum += Close[n] * Math.Pow(n, mi - 1);
}
b[mi] = sum;
}
//===============Matrix============================= ================================================== ========================
for (jj = 1; jj <= nn; jj++)
{
for (ii = 1; ii <= nn; ii++)
{
kk = ii + jj - 1;
ai[ii, jj] = sx[kk];
}
}
//===============Gauss============================== ================================================== ========================
for (kk = 1; kk <= nn - 1; kk++)
{
ll = 0;
mm = 0;
for (ii = kk; ii <= nn; ii++)
{
if (Math.Abs(ai[ii, kk]) > mm)
{
mm = Math.Abs(ai[ii, kk]);
ll = ii;
}
}
if (ll == 0)
return;
if (ll != kk)
{
for (jj = 1; jj <= nn; jj++)
{
tt = ai[kk, jj];
ai[kk, jj] = ai[ll, jj];
ai[ll, jj] = tt;
}
tt = b[kk];
b[kk] = b[ll];
b[ll] = tt;
}
for (ii = kk + 1; ii <= nn; ii++)
{
qq = ai[ii, kk] / ai[kk, kk];
for (jj = 1; jj <= nn; jj++)
{
if (jj == kk)
ai[ii, jj] = 0;
else
ai[ii, jj] = ai[ii, jj] - qq * ai[kk, jj];
}
b[ii] = b[ii] - qq * b[kk];
}
}
x[nn] = b[nn] / ai[nn, nn];
for (ii = nn - 1; ii >= 1; ii--)
{
tt = 0;
for (jj = 1; jj <= nn - ii; jj++)
{
tt = tt + ai[ii, ii + jj] * x[ii + jj];
x[ii] = (1 / ai[ii, ii]) * (b[ii] - tt);
}
}
sq = 0.0;
sq2 = 0.0;
for (n = i0; n <= i0 + p; n++)
{
sum = 0;
for (kk = 1; kk <= Degree; kk++)
{
sum += x[kk + 1] * Math.Pow(n, kk);
}
median[n] = (x[1] + sum);
sq += Math.Pow(Close[n] - Median[n], 2);
sq2 += Math.Pow(Close[n] - Median[n], 2);
}
sq = Math.Sqrt(sq / (p + 1)) * StrdDev;
sq2 = Math.Sqrt(sq2 / (p + 1)) * StrdDev2;
for (n = i0; n <= i0 + p; n++)
{
sqh[n] = median[n] + sq;
sql[n] = (median[n] - sq);
sqh2[n] = (median[n] + sq2);
sql2[n] = (median[n] - sq2);
}
Median[0] = median[0];
SQH[0] = sqh[0];
SQH2[0] = sqh2[0];
SQL[0] = sql[0];
SQL2[0] = sql2[0];
}
#region Properties
[NinjaScriptProperty]
[Range(1, int.MaxValue)]
[Display(Name="Degree", Description="Degree", Order=1, GroupName="Parameters")]
public int Degree
{ get; set; }
[NinjaScriptProperty]
[Range(1, int.MaxValue)]
[Display(Name="Period", Description="Period", Order=2, GroupName="Parameters")]
public int Period
{ get; set; }
[NinjaScriptProperty]
[Range(0.1, double.MaxValue)]
[Display(Name="StrdDev", Description="StrdDev", Order=3, GroupName="Parameters")]
public double StrdDev
{ get; set; }
[NinjaScriptProperty]
[Range(0.1, double.MaxValue)]
[Display(Name="StrdDev2", Description="StrdDev2", Order=4, GroupName="Parameters")]
public double StrdDev2
{ get; set; }
[Browsable(false)]
[XmlIgnore]
public Series<double> Median
{
get { return Values[0]; }
}
[Browsable(false)]
[XmlIgnore]
public Series<double> SQH
{
get { return Values[1]; }
}
[Browsable(false)]
[XmlIgnore]
public Series<double> SQH2
{
get { return Values[2]; }
}
[Browsable(false)]
[XmlIgnore]
public Series<double> SQL
{
get { return Values[3]; }
}
[Browsable(false)]
[XmlIgnore]
public Series<double> SQL2
{
get { return Values[4]; }
}
#endregion
}
}
Comment