• If this is your first visit, you will have to register before you can post. To view messages, please scroll below and select the forum that you would like to visits. Questions? Be sure to check out the Forum FAQ.

Announcement

Collapse
No announcement yet.

Partner 728x90

Collapse

Sine Weighted MA (SWMA)

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

    Sine Weighted MA (SWMA)

    /************************************************** ******************
    Hello,

    I could not locate Sine Weighted MA indicator for NT. I have used it in eSignal and it is normalized and is very smooth. Below is code in esignal. Can someone help code this in NT 6.5?
    _______________________________________


    Title: Sine Weighted MA for eSignal 7.x
    By: Chris D. Kryza (Divergence Software, Inc.)
    Email: [email protected]
    Incept: 02/17/2004
    Version: 1.0.0


    ================================================== ===================
    Fix History:

    02/17/2004 - Initial Release
    1.0.0

    ================================================== ===================
    Project Description:

    Sine Weighted Moving Average plot.

    Dislaimer: For educational purposes only! Obviously, no guarantees
    whatsoever and use at your own risk.

    ************************************************** ********************/


    //External Variables
    var nBarCounter = 0;
    var nFac = null;
    var nVal2 = null;
    var aFPArray = new Array();
    var bInitialized = false;

    //== PreMain function required by eSignal to set things up
    function preMain() {
    var x;

    setPriceStudy(true);
    setStudyTitle("Sine Weighted MA");
    setCursorLabelName("SineMA", 0);
    setDefaultBarFgColor( Color.blue, 0 );
    setShowTitleParameters( false );


    //initialize formula parameters
    x=0;
    aFPArray[x] = new FunctionParameter( "Period", FunctionParameter.NUMBER);
    with( aFPArray[x] ) {
    setLowerLimit( 2 );
    setUpperLimit( 125 );
    setDefault( 15 );
    }
    x++;
    aFPArray[x] = new FunctionParameter( "Price", FunctionParameter.STRING);
    with( aFPArray[x] ) {
    addOption( "Close" );
    addOption( "HL/2" );
    addOption( "HLC/3" );
    addOption( "OHLC/4" );
    addOption( "High" );
    addOption( "Low" );
    setDefault( "Close" );
    }
    x++;
    aFPArray[x] = new FunctionParameter( "Color", FunctionParameter.COLOR);
    with( aFPArray[x] ) {
    setDefault( Color.blue );
    }
    x++;
    aFPArray[x] = new FunctionParameter( "Thickness", FunctionParameter.NUMBER);
    with( aFPArray[x] ) {
    setLowerLimit( 1 );
    setUpperLimit( 10 );
    setDefault( 2 );
    }

    }

    //== Main processing function
    function main( Period, Price, Color, Thickness ) {
    var x;

    //script is initializing
    if ( getBarState() == BARSTATE_ALLBARS ) {
    return null;
    }

    if ( bInitialized == false ) {

    setDefaultBarFgColor( Color, 0 );
    setDefaultBarThickness( Math.round( Thickness ), 0 );

    nFac = Math.PI / ( Period+1 );

    nVal2 = 0;
    //calculate the denominator. This won't change
    for ( x=0; x<Math.round(Period); x++ ) {
    nVal2 += Math.sin( (x+1) * nFac );
    }

    bInitialized = true;
    }

    //called on each new bar
    if ( getBarState() == BARSTATE_NEWBAR ) {
    nBarCounter++;
    }

    nVal1 = 0;
    nMax = Math.round( Period );
    for ( x=0; x<nMax; x++ ) {
    nVal1 += Math.sin( (x+1) * nFac ) * getPrice( Price, x );
    }

    nPlot = nVal1/nVal2;

    return( nPlot );

    }


    /*************************************************
    SUPPORT FUNCTIONS
    **************************************************/

    //== gID function assigns unique identifier to graphic/text routines
    function gID() {
    grID ++;
    return( grID );
    }


    //== return price type selected by user
    function getPrice( Price, nOffset ) {

    if ( Price == "Close" ) {
    return( close(-nOffset ) );
    }
    else if ( Price == "HL/2" ) {
    return( (high(-nOffset)+low(-nOffset)) / 2 );
    }
    else if ( Price == "HLC/3" ) {
    return( (high(-nOffset)+low(-nOffset)+close(-nOffset)) / 3 );
    }
    else if ( Price == "OHLC/4" ) {
    return( (open(-nOffset)+high(-nOffset)+low(-nOffset)+close(-nOffset)) / 4 );
    }
    else if ( Price == "Low" ) {
    return( low(-nOffset) );
    }
    else if ( Price == "High" ) {
    return( high(-nOffset) );
    }
    }
    __________________________

    Thanks much

    Sam

    #2
    hi,

    if (CurrentBar < Period+1) return;
    double nFac = Math.PI / ( Period+1 );
    double nVal2 = 0;
    for ( int x=0; x<Period; x++ )
    {
    nVal2 += Math.Sin( (x+1) * nFac );
    }
    double nVal1 = 0;
    for ( int x=0; x<Period; x++ )
    {
    nVal1 += Math.Sin( (x+1) * nFac ) * Close[x];
    }
    SWMA.Set(nVal1/nVal2);

    Comment


      #3
      Thank you Hegh2000. I am getting error...here is the code I am trying to..I am not sure what could be error. Any advice?



      #region Using declarations
      using System;
      using System.Diagnostics;
      using System.Drawing;
      using System.Drawing.Drawing2D;
      using System.ComponentModel;
      using System.Xml.Serialization;
      using NinjaTrader.Data;
      using NinjaTrader.Gui.Chart;
      #endregion

      // This namespace holds all indicators and is required. Do not change it.
      namespace NinjaTrader.Indicator
      {
      /// <summary>
      /// The SWMA is an indicator
      /// </summary>
      [Description("The SWMA is an indicator that shows the average value of a security's price over a period of time.")]
      public class SWMA : Indicator
      {
      #region Variables
      private int period = 14;
      #endregion

      /// <summary>
      /// This method is used to configure the indicator and is called once before any bar data is loaded.
      /// </summary>
      protected override void Initialize()
      {
      Add(new Plot(Color.Orange, "SWMA"));

      Overlay = true;
      PriceTypeSupported = true;
      }

      /// <summary>
      /// Called on each bar update event (incoming tick).
      /// </summary>
      protected override void OnBarUpdate()
      {
      if (CurrentBar < Period+1) return;
      double nFac = Math.PI / ( Period+1 );
      double nVal2 = 0;
      for ( int x=0; x<Period; x++ )
      {
      nVal2 += Math.Sin( (x+1) * nFac );
      }
      double nVal1 = 0;
      for ( int x=0; x<Period; x++ )
      {
      nVal1 += Math.Sin( (x+1) * nFac ) * Close[x];
      }
      SWMA.Set(nVal1/nVal2);
      }
      #endregion

      Comment


        #4
        Please give the file attached a try, works well for me.
        Attached Files
        BertrandNinjaTrader Customer Service

        Comment


          #5
          Originally posted by NinjaTrader_Bertrand View Post
          Please give the file attached a try, works well for me.
          Thank you Bertrand.

          Is it for NT 7? it says import failed. "Version required to extract....(45)"

          I am using NT 6.5

          Pl advice.

          Comment


            #6
            Originally posted by Sam7768 View Post
            Thank you Bertrand.

            Is it for NT 7? it says import failed. "Version required to extract....(45)"

            I am using NT 6.5

            Pl advice.
            Some assist to help ...

            http://www.bigmiketrading.com/ninjat...-strategy.html

            BTW, SWMA tracks very closely with WMA

            Comment


              #7
              Thank You Trader Jon. I did as per the instructions, and when compiled, the error code says..

              "type or namespace name 'GridCategory' could not be found (are you missing a using directive or an assembly reference?)"

              Code CS0246, line 60, column 4

              Also, in the zip file, under info file...

              <NinjaTrader>
              - <Export>
              <Version>7.0.0.24</Version>
              </Export>
              </NinjaTrader>

              So, I guess the code is correct, but not compatible with NT 6.5. And I am using NT 6.5.

              So, How to convert this code to NT 6.5 compatibility?.

              Comment


                #8
                change the lines 'grid category ' in the code ..

                [GridCategory("Parameters")]

                . you might have to change them to '[category "parameters" ] ' sorry

                [Category("Parameters")]

                .. I havent used 6.5 for a while but that should get you to see what has to be done ..

                Have a good night
                Jon
                Last edited by Trader.Jon; 11-27-2010, 09:00 PM.

                Comment


                  #9
                  Ok. Working now. Thank you very much...

                  Posting the code here for the benefit of others...

                  Sine Wave Moving Average (SWMA) for NT 6.5.
                  ____________________________


                  #region Using declarations
                  using System;
                  using System.Diagnostics;
                  using System.Drawing;
                  using System.Drawing.Drawing2D;
                  using System.ComponentModel;
                  using System.Xml.Serialization;
                  using NinjaTrader.Data;
                  using NinjaTrader.Gui.Chart;
                  #endregion

                  // This namespace holds all indicators and is required. Do not change it.
                  namespace NinjaTrader.Indicator
                  {
                  /// <summary>
                  /// The SWMA is an indicator
                  /// </summary>
                  [Description("The SWMA is an indicator that shows the average value of a security's price over a period of time.")]
                  public class SWMA : Indicator
                  {
                  #region Variables
                  private int period = 14;
                  #endregion

                  /// <summary>
                  /// This method is used to configure the indicator and is called once before any bar data is loaded.
                  /// </summary>
                  protected override void Initialize()
                  {
                  Add(new Plot(Color.Orange, "SWMA"));

                  Overlay = true;
                  PriceTypeSupported = true;
                  }

                  /// <summary>
                  /// Called on each bar update event (incoming tick).
                  /// </summary>
                  protected override void OnBarUpdate()
                  {
                  if (CurrentBar < Period+1) return;
                  double nFac = Math.PI / ( Period+1 );
                  double nVal2 = 0;
                  for ( int x=0; x<Period; x++ )
                  {
                  nVal2 += Math.Sin( (x+1) * nFac );
                  }
                  double nVal1 = 0;
                  for ( int x=0; x<Period; x++ )
                  {
                  nVal1 += Math.Sin( (x+1) * nFac ) * Close[x];
                  }
                  Value.Set(nVal1/nVal2);
                  }

                  #region Properties
                  /// <summary>
                  /// </summary>
                  [Description("Numbers of bars used for calculations")]
                  [Category("Parameters")]
                  public int Period
                  {
                  get { return period; }
                  set { period = Math.Max(1, value); }
                  }
                  #endregion
                  }
                  }


                  #region NinjaScript generated code. Neither change nor remove.
                  // This namespace holds all indicators and is required. Do not change it.
                  namespace NinjaTrader.Indicator
                  {
                  public partial class Indicator : IndicatorBase
                  {
                  private SWMA[] cacheSWMA = null;

                  private static SWMA checkSWMA = new SWMA();

                  /// <summary>
                  /// The SWMA is an indicator that shows the average value of a security's price over a period of time.
                  /// </summary>
                  /// <returns></returns>
                  public SWMA SWMA(int period)
                  {
                  return SWMA(Input, period);
                  }

                  /// <summary>
                  /// The SWMA is an indicator that shows the average value of a security's price over a period of time.
                  /// </summary>
                  /// <returns></returns>
                  public SWMA SWMA(Data.IDataSeries input, int period)
                  {
                  checkSWMA.Period = period;
                  period = checkSWMA.Period;

                  if (cacheSWMA != null)
                  for (int idx = 0; idx < cacheSWMA.Length; idx++)
                  if (cacheSWMA[idx].Period == period && cacheSWMA[idx].EqualsInput(input))
                  return cacheSWMA[idx];

                  SWMA indicator = new SWMA();
                  indicator.BarsRequired = BarsRequired;
                  indicator.CalculateOnBarClose = CalculateOnBarClose;
                  indicator.Input = input;
                  indicator.Period = period;
                  indicator.SetUp();

                  SWMA[] tmp = new SWMA[cacheSWMA == null ? 1 : cacheSWMA.Length + 1];
                  if (cacheSWMA != null)
                  cacheSWMA.CopyTo(tmp, 0);
                  tmp[tmp.Length - 1] = indicator;
                  cacheSWMA = tmp;
                  Indicators.Add(indicator);

                  return indicator;
                  }

                  }
                  }

                  // This namespace holds all market analyzer column definitions and is required. Do not change it.
                  namespace NinjaTrader.MarketAnalyzer
                  {
                  public partial class Column : ColumnBase
                  {
                  /// <summary>
                  /// The SWMA is an indicator that shows the average value of a security's price over a period of time.
                  /// </summary>
                  /// <returns></returns>
                  [Gui.Design.WizardCondition("Indicator")]
                  public Indicator.SWMA SWMA(int period)
                  {
                  return _indicator.SWMA(Input, period);
                  }

                  /// <summary>
                  /// The SWMA is an indicator that shows the average value of a security's price over a period of time.
                  /// </summary>
                  /// <returns></returns>
                  public Indicator.SWMA SWMA(Data.IDataSeries input, int period)
                  {
                  return _indicator.SWMA(input, period);
                  }

                  }
                  }

                  // This namespace holds all strategies and is required. Do not change it.
                  namespace NinjaTrader.Strategy
                  {
                  public partial class Strategy : StrategyBase
                  {
                  /// <summary>
                  /// The SWMA is an indicator that shows the average value of a security's price over a period of time.
                  /// </summary>
                  /// <returns></returns>
                  [Gui.Design.WizardCondition("Indicator")]
                  public Indicator.SWMA SWMA(int period)
                  {
                  return _indicator.SWMA(Input, period);
                  }

                  /// <summary>
                  /// The SWMA is an indicator that shows the average value of a security's price over a period of time.
                  /// </summary>
                  /// <returns></returns>
                  public Indicator.SWMA SWMA(Data.IDataSeries input, int period)
                  {
                  if (InInitialize && input == null)
                  throw new ArgumentException("You only can access an indicator with the default input/bar series from within the 'Initialize()' method");

                  return _indicator.SWMA(input, period);
                  }

                  }
                  }
                  #endregion

                  Comment


                    #10
                    NT8 version

                    Here is a code-optimized NT8 version......
                    Attached Files

                    Comment


                      #11
                      Just a little suggestion: I do not think that the indicator code is already optimized.

                      There is no point to perform the calculation below for every single bar.

                      Code:
                      _nVal2 = 0;
                      
                        for (int x = 1; x < Period; x++)
                        {
                           _nVal2 += Math.Sin((x + 1) * _nFac);
                        }
                      The result is always the same and it is sufficient to do it once in State == State.Historical.

                      Furthermore the coefficients

                      Code:
                      Math.Sin((x + 1) * _nFac)
                      should also be calculated in State == State.HIstorical, where they can be written to an array. Again, no need to perform this calculation for every bar.

                      Comment

                      Latest Posts

                      Collapse

                      Topics Statistics Last Post
                      Started by dariuszszyc, Today, 12:07 AM
                      1 response
                      6 views
                      0 likes
                      Last Post login_dejavu  
                      Started by KennyK, Yesterday, 09:28 PM
                      1 response
                      10 views
                      0 likes
                      Last Post NinjaTrader_ChelseaB  
                      Started by vindiou, Yesterday, 02:37 AM
                      1 response
                      24 views
                      0 likes
                      Last Post NinjaTrader_ChelseaB  
                      Started by login_dejavu, Yesterday, 10:55 AM
                      2 responses
                      27 views
                      0 likes
                      Last Post NinjaTrader_ChelseaB  
                      Started by joemiller, Yesterday, 03:30 AM
                      3 responses
                      11 views
                      0 likes
                      Last Post joemiller  
                      Working...
                      X