Announcement

Collapse

Looking for a User App or Add-On built by the NinjaTrader community?

Visit NinjaTrader EcoSystem and our free User App Share!

Have a question for the NinjaScript developer community? Open a new thread in our NinjaScript File Sharing Discussion Forum!
See more
See less

Partner 728x90

Collapse

Polynomial Regression Indicator conversion from NT7 to NT8

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Polynomial Regression Indicator conversion from NT7 to NT8

    I need to convert the Polynomial Regression Indicator from NT7 to NT8. I am also adding a second set of PRC bands which is not included in the original version of the indicator. I have attached the original NT7 version of the Polynomial Regression Channel. (A big thank you to fxcanada who made this indicator available for free!)
    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

    }
    }

    Attached Files

    #2
    Hello JulieV,
    Thanks for your post.

    The first thing that I see that would effect the way things look is your Calculate setting.

    For the NT7 version this is set to CalculateOnBarClose = true

    For the NT8 version this is set to Calculate = Calculate.OnEachTick

    If you want these settings to be the same you should use Calculate = Calculate.OnBarClose for your converted script.

    Please see the following help guide documentation on Calculate for more information: https://ninjatrader.com/support/help...?calculate.htm
    Josh G.NinjaTrader Customer Service

    Comment


      #3
      Hi _JoshG
      Thanks for your response. I am in the process of moving all my algos from cTrader to NinjaTrader hence why there is some minor code changes that does not exactly reflect the NT7 PRC indicator such as the choice of calculating OnTick rather than on BarClose.
      I did find a series assignment issue in my code that seem to have fixed the plotting on the chart. The only difference now that I see is that on cTrader the PRC indicator plots with what appears to be "smoothed" lines whereas in NinjaTrader the lines are not. I can't seem to explain this change. I did look again at the code from cTrader and the indicator is definitely being plotted as a line with no smoothing factor included.

      Comment


        #4
        Originally posted by JulieV View Post
        Hi _JoshG
        Thanks for your response. I am in the process of moving all my algos from cTrader to NinjaTrader hence why there is some minor code changes that does not exactly reflect the NT7 PRC indicator such as the choice of calculating OnTick rather than on BarClose.
        I did find a series assignment issue in my code that seem to have fixed the plotting on the chart. The only difference now that I see is that on cTrader the PRC indicator plots with what appears to be "smoothed" lines whereas in NinjaTrader the lines are not. I can't seem to explain this change. I did look again at the code from cTrader and the indicator is definitely being plotted as a line with no smoothing factor included.
        If you do a search on Ninja or Futures.IO you will find NT8 versions of this indicator.

        Hopefully you are aware that this indicator "constantly recalculates and adjusts as price progresses" badly and only seems to project the highs and lows perfectly after the fact. In real time, it is a mouse trap and untradeable.

        Unfortunately, because it looks so good when charted it is popular with the Forex sim traders, thanks to a certain Egyptian snake oil salesman that popularized this "pig with lipstick on."

        Not recommended for trading.

        Cheers!

        Comment


          #5
          Hi aligator

          Thanks for your response. I have searched on Ninja and Futures.IO and could not find an NT8 version. No point recreating something if it is already freely available, right?! If you happen to stumble across the link again, I would appreciate if you could pass it on.

          I am aware that this version of the PRC indicator repaints. My current trading strategy only looks at the final values.

          Thanks for your advice on using this particular indicator. I will definitely keep it in mind as I develop strategies for futures contracts. What, in your opinion, is a better alternative?

          Many thanks

          Comment


            #6
            Hallo JulieV, gibt es diesen Indikator für die Version 8.0.26.1 64-bit de NT 8? Habe es bereits versucht zu aktualisieren aber bekomme die Meldung dass das Skript für eine frühere Version gemacht wurde. Gruss Chidiroglou

            Comment


              #7
              Hello Chidiroglou,

              Thank you for your inquiry.

              I'm translating your reply into English so perhaps JulieV may better respond:

              Hi JulieV, does this indicator exist for version 8.0.26.1 64-bit NT 8? Already tried to update it but get the message that the script was made for an earlier version. Greetings Chidiroglou
              Kate W.NinjaTrader Customer Service

              Comment


                #8
                Das wäre super Kate W. aber ich könnte es auch ins Deutsche übersetzen.

                Comment


                  #9
                  Hey guys this is the Belkhayate COG (Center of Gravity) indicator. Or also known as a polynomial regression channel with 3 std deviations. I transported this code directly from here. If anybody has any useful information regarding the usability of the indicator I&#8217;d appreciate the feedback. The fact that it repaints takes a lot away [&#8230;]


                  there you go

                  Comment


                    #10
                    Danke vielmals

                    Comment

                    Latest Posts

                    Collapse

                    Topics Statistics Last Post
                    Started by alifarahani, Today, 09:40 AM
                    2 responses
                    12 views
                    0 likes
                    Last Post alifarahani  
                    Started by junkone, Today, 11:37 AM
                    3 responses
                    15 views
                    0 likes
                    Last Post NinjaTrader_ChelseaB  
                    Started by pickmyonlineclass, Today, 12:23 PM
                    0 responses
                    1 view
                    0 likes
                    Last Post pickmyonlineclass  
                    Started by frankthearm, Yesterday, 09:08 AM
                    12 responses
                    44 views
                    0 likes
                    Last Post NinjaTrader_Clayton  
                    Started by quantismo, 04-17-2024, 05:13 PM
                    5 responses
                    35 views
                    0 likes
                    Last Post NinjaTrader_Gaby  
                    Working...
                    X