indiTraders - Forum for the Active Indian Trader  

Go Back   indiTraders - Forum for the Active Indian Trader > Tools > Software > NinjaTrader

Reply
 
Bookmark and Share LinkBack Thread Tools Display Modes
  #1 (permalink)  
Old 12-09-2015, 02:21 PM
nTP's Avatar
nTP nTP is offline
Flash Crash
 
Join Date: Dec 2013
Location: kolkata
Posts: 2,079
Thanks: 7,888
Thanked 2,296 Times in 1,372 Posts
nTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud of
Default TASC092015 MFO

coming up soon with errors
__________________
thx
nTuple

Disclaimer: I am not a Research Analyst and not registered with any regulating authority. All posts are for educational purpose only.

Consider us a dumb -dumble guy in this analysis, any type of real time example will be quick-learn approach.

Last edited by nTP; 12-09-2015 at 02:26 PM.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
The Following 2 Users Say Thank You to nTP For This Useful Post:
  #2 (permalink)  
Old 12-09-2015, 02:26 PM
nTP's Avatar
nTP nTP is offline
Flash Crash
 
Join Date: Dec 2013
Location: kolkata
Posts: 2,079
Thanks: 7,888
Thanked 2,296 Times in 1,372 Posts
nTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud of
Default

Metastock:

LL := Security(“.DJI”,L);
HH:= Security(“.DJI”,H);
{avoid division by zero}
Dvs:=If((HH-Ref(LL ,-1))+(Ref(HH,-1)-LL )=0,.00001,(HHRef(
LL ,-1)+(Ref(HH,-1)-LL )));
MLT P:=If(HH<Ref(LL ,-1),-1,If(LL >Ref(HH,-1),1,((HHRef(LL ,-1))-(Ref(HH,-1)-LL ))/dvs));
{avoid division by zero}
Dvsv:=If(V=0,.00001,V);
Sum((MLT P*V),20)/Sum(Dvsv,20);


1. Multiplier = [(High – previous low) –
(Previous high – low)] / [(High – previous
low) + (Previous high – low)]
2. Money flow volume = Multiplier × volume
for the period
3. 20-period MFO = 20-period sum of money
flow volume / 20-period sum of volume
Note: Steps 2 and 3 above are similar to the calculation
of the Chaikin money flow (CMF) indicator


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

// This namespace holds all indicators and is required. Do not change it.
namespace NinjaTrader.Indicator
{
    /// <summary>
    /// TASC proposed a good MFO ie. money flow oscciilator
    /// </summary>
    [Description("TASC proposed a good MFO ie. money flow oscciilator")]
    public class MFO12092015TASC : Indicator
    {
		
		
		#region MFO UTIl 
		
		public IDataSeries MFOfunction(IDataSeries VOL, IDataSeries HH, IDataSeries LL,int period)
		{
			/*
			average1 = WMA(input, cycle_Period_n1);
			average2 = WMA(average1, cycle_Period_n2);
			MA1.Set(average1[0]);
			MA2.Set(average2[0]);
			NMA.Set((1 +alpha)* (MA1[0]) -( alpha )* (MA2[0]));
			*/

			Dvs.Set(((HH[0]-Low[1])+(High[1]-LL[0]))==0 ? .001 : ((HH[0]-Low[1])+(High[1]-LL[0])));
			Print(Dvs[0]);
			MUlTI.Set((HH[0]<LL[1] ? -1 : ((LL[0]>=HH[1]))? 1:(((HH[0]-Low[1])-(High[0]-LL[0]))/Dvs[0])) );
			Dvsvol.Set(Volume[0]==0 ? .001 : Volume[0]);
			summation_MUlti_vol.Set(MUlTI[0]*Volume[0]);
			MFOver.Set(SUM(summation_MUlti_vol,period)[0]/SUM(Dvsvol,period)[0]);
			return MFOver ;
		}
		#endregion // MFO Calculations
		
        #region Variables
        // Wizard generated variables
		private const string		_versionText		= "V0.1Beta";
		private	const string 		_copyrightText	= "All rights reserved to nTuple And KKS.And All credit goes to G. Dürschner for research";
        // Wizard generated variables
        //    private int cycle_Period_n1 = 21;
						// Default setting for Cycle_Period_n1
        //    private int cycle_Period_n2 = 5; 
						// Default setting for Cycle_Period_n2
		private DataSeries MFOver;
		private DataSeries VOL;
		private DataSeries Dvs;
		private DataSeries MUlTI;
		private DataSeries LL;
		private DataSeries HH;
		private DataSeries Dvsvol;
		private DataSeries summation_MUlti_vol;
            private int period = 20; // Default setting for Period
        // User defined variables (add any user defined variables below)
        #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.FromKnownColor(KnownColor.Orange), PlotStyle.Line, "MFOPlot0"));
            Overlay				= false;
			
			MUlTI =new DataSeries(this);
			MFOver =new DataSeries(this);
			VOL =new DataSeries(this);
			Dvs =new DataSeries(this);
			LL =new DataSeries(this);
			HH =new DataSeries(this);
			Dvsvol=new DataSeries(this);
			summation_MUlti_vol=new DataSeries(this);
        }
		
		/*
		LL := Security(“.DJI”,L);
HH:= Security(“.DJI”,H);
{avoid division by zero}
Dvs:=If((HH-Ref(LL ,-1))+(Ref(HH,-1)-LL )=0,.00001,(HHRef(
LL ,-1)+(Ref(HH,-1)-LL )));
MLT P:=If(HH<Ref(LL ,-1),-1,If(LL >Ref(HH,-1),1,((HHRef(LL ,-1))-(Ref(HH,-1)-LL ))/dvs));
{avoid division by zero}
Dvsv:=If(V=0,.00001,V);
Sum((MLT P*V),20)/Sum(Dvsv,20);
		
		
		1. Multiplier = [(High – previous low) –
(Previous high – low)] / [(High – previous
low) + (Previous high – low)]
2. Money flow volume = Multiplier × volume
for the period
3. 20-period MFO = 20-period sum of money
flow volume / 20-period sum of volume
Note: Steps 2 and 3 above are similar to the calculation
of the Chaikin money flow (CMF) indicator
		
		*/
		
		
        /// <summary>
        /// Called on each bar update event (incoming tick)
        /// </summary>
        protected override void OnBarUpdate()
        {
            // Use this method for calculating your indicator values. Assign a value to each
            // plot below by replacing 'Close[0]' with your own formula.
			VOL.Set(Volume[0]);
			HH.Set(High[0]);
			LL.Set(Low[0]);
            MFOPlot0.Set(MFOfunction(VOL,HH,LL,period)[0]);
        }

        #region Properties
        [Browsable(false)]	// this line prevents the data series from being displayed in the indicator properties dialog, do not remove
        [XmlIgnore()]		// this line ensures that the indicator can be saved/recovered as part of a chart template, do not remove
        public DataSeries MFOPlot0
        {
            get { return Values[0]; }
        }

        [Description("period for volume l")]
        [GridCategory("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 MFO12092015TASC[] cacheMFO12092015TASC = null;

        private static MFO12092015TASC checkMFO12092015TASC = new MFO12092015TASC();

        /// <summary>
        /// TASC proposed a good MFO ie. money flow oscciilator
        /// </summary>
        /// <returns></returns>
        public MFO12092015TASC MFO12092015TASC(int period)
        {
            return MFO12092015TASC(Input, period);
        }

        /// <summary>
        /// TASC proposed a good MFO ie. money flow oscciilator
        /// </summary>
        /// <returns></returns>
        public MFO12092015TASC MFO12092015TASC(Data.IDataSeries input, int period)
        {
            if (cacheMFO12092015TASC != null)
                for (int idx = 0; idx < cacheMFO12092015TASC.Length; idx++)
                    if (cacheMFO12092015TASC[idx].Period == period && cacheMFO12092015TASC[idx].EqualsInput(input))
                        return cacheMFO12092015TASC[idx];

            lock (checkMFO12092015TASC)
            {
                checkMFO12092015TASC.Period = period;
                period = checkMFO12092015TASC.Period;

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

                MFO12092015TASC indicator = new MFO12092015TASC();
                indicator.BarsRequired = BarsRequired;
                indicator.CalculateOnBarClose = CalculateOnBarClose;
#if NT7
                indicator.ForceMaximumBarsLookBack256 = ForceMaximumBarsLookBack256;
                indicator.MaximumBarsLookBack = MaximumBarsLookBack;
#endif
                indicator.Input = input;
                indicator.Period = period;
                Indicators.Add(indicator);
                indicator.SetUp();

                MFO12092015TASC[] tmp = new MFO12092015TASC[cacheMFO12092015TASC == null ? 1 : cacheMFO12092015TASC.Length + 1];
                if (cacheMFO12092015TASC != null)
                    cacheMFO12092015TASC.CopyTo(tmp, 0);
                tmp[tmp.Length - 1] = indicator;
                cacheMFO12092015TASC = tmp;
                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>
        /// TASC proposed a good MFO ie. money flow oscciilator
        /// </summary>
        /// <returns></returns>
        [Gui.Design.WizardCondition("Indicator")]
        public Indicator.MFO12092015TASC MFO12092015TASC(int period)
        {
            return _indicator.MFO12092015TASC(Input, period);
        }

        /// <summary>
        /// TASC proposed a good MFO ie. money flow oscciilator
        /// </summary>
        /// <returns></returns>
        public Indicator.MFO12092015TASC MFO12092015TASC(Data.IDataSeries input, int period)
        {
            return _indicator.MFO12092015TASC(input, period);
        }
    }
}

// This namespace holds all strategies and is required. Do not change it.
namespace NinjaTrader.Strategy
{
    public partial class Strategy : StrategyBase
    {
        /// <summary>
        /// TASC proposed a good MFO ie. money flow oscciilator
        /// </summary>
        /// <returns></returns>
        [Gui.Design.WizardCondition("Indicator")]
        public Indicator.MFO12092015TASC MFO12092015TASC(int period)
        {
            return _indicator.MFO12092015TASC(Input, period);
        }

        /// <summary>
        /// TASC proposed a good MFO ie. money flow oscciilator
        /// </summary>
        /// <returns></returns>
        public Indicator.MFO12092015TASC MFO12092015TASC(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.MFO12092015TASC(input, period);
        }
    }
}
#endregion
Error on calling 'OnBarUpdate' method for indicator 'MFO12092015TASC' on bar 0: You are accessing an index with a value that is invalid since its out of range. I.E. accessing a series [barsAgo] with a value of 5 when there are only 4 bars on the chart.
Attached Files
File Type: zip exMFOTASC092015vbeta2.zip (4.4 KB, 0 views)
__________________
thx
nTuple

Disclaimer: I am not a Research Analyst and not registered with any regulating authority. All posts are for educational purpose only.

Consider us a dumb -dumble guy in this analysis, any type of real time example will be quick-learn approach.

Last edited by nTP; 12-09-2015 at 03:49 PM.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
The Following 2 Users Say Thank You to nTP For This Useful Post:
  #3 (permalink)  
Old 12-09-2015, 04:05 PM
nTP's Avatar
nTP nTP is offline
Flash Crash
 
Join Date: Dec 2013
Location: kolkata
Posts: 2,079
Thanks: 7,888
Thanked 2,296 Times in 1,372 Posts
nTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud ofnTP has much to be proud of
Default

Hi





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

// This namespace holds all indicators and is required. Do not change it.
namespace NinjaTrader.Indicator
{
    /// <summary>
    /// TASC proposed a good MFO ie. money flow oscciilator
    /// </summary>
    [Description("TASC proposed a good MFO ie. money flow oscciilator")]
    public class MFO12092015TASC : Indicator
    {
		
		
		#region MFO UTIl 
		
		public IDataSeries MFOfunction(IDataSeries VOL, IDataSeries HH, IDataSeries LL,int period)
		{
			/*
			average1 = WMA(input, cycle_Period_n1);
			average2 = WMA(average1, cycle_Period_n2);
			MA1.Set(average1[0]);
			MA2.Set(average2[0]);
			NMA.Set((1 +alpha)* (MA1[0]) -( alpha )* (MA2[0]));
			*/

			Dvs.Set(((HH[0]-Low[1])+(High[1]-LL[0]))==0 ? .001 : ((HH[0]-Low[1])+(High[1]-LL[0])));
			Print(Dvs[0]);
			MUlTI.Set((HH[0]<LL[1] ? -1 : ((LL[0]>=HH[1]))? 1:(((HH[0]-Low[1])-(High[0]-LL[0]))/Dvs[0])) );
			Dvsvol.Set(Volume[0]==0 ? .001 : Volume[0]);
			summation_MUlti_vol.Set(MUlTI[0]*Volume[0]);
			MFOver.Set(SUM(summation_MUlti_vol,period)[0]/SUM(Dvsvol,period)[0]);
			return MFOver ;
		}
		#endregion // MFO Calculations
		
        #region Variables
        // Wizard generated variables
		private const string		_versionText		= "V0.1Beta";
		private	const string 		_copyrightText	= "All rights reserved to nTuple And KKS.And All credit goes to G. Dürschner for research";
        // Wizard generated variables
        //    private int cycle_Period_n1 = 21;
						// Default setting for Cycle_Period_n1
        //    private int cycle_Period_n2 = 5; 
						// Default setting for Cycle_Period_n2
		private DataSeries MFOver;
		private DataSeries VOL;
		private DataSeries Dvs;
		private DataSeries MUlTI;
		private DataSeries LL;
		private DataSeries HH;
		private DataSeries Dvsvol;
		private DataSeries summation_MUlti_vol;
            private int period = 20; // Default setting for Period
        // User defined variables (add any user defined variables below)
        #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.FromKnownColor(KnownColor.Orange), PlotStyle.Line, "MFOPlot0"));
            Overlay				= false;
			
			MUlTI =new DataSeries(this);
			MFOver =new DataSeries(this);
			VOL =new DataSeries(this);
			Dvs =new DataSeries(this);
			LL =new DataSeries(this);
			HH =new DataSeries(this);
			Dvsvol=new DataSeries(this);
			summation_MUlti_vol=new DataSeries(this);
        }
		
		/*
		LL := Security(“.DJI”,L);
HH:= Security(“.DJI”,H);
{avoid division by zero}
Dvs:=If((HH-Ref(LL ,-1))+(Ref(HH,-1)-LL )=0,.00001,(HHRef(
LL ,-1)+(Ref(HH,-1)-LL )));
MLT P:=If(HH<Ref(LL ,-1),-1,If(LL >Ref(HH,-1),1,((HHRef(LL ,-1))-(Ref(HH,-1)-LL ))/dvs));
{avoid division by zero}
Dvsv:=If(V=0,.00001,V);
Sum((MLT P*V),20)/Sum(Dvsv,20);
		
		
		1. Multiplier = [(High – previous low) –
(Previous high – low)] / [(High – previous
low) + (Previous high – low)]
2. Money flow volume = Multiplier × volume
for the period
3. 20-period MFO = 20-period sum of money
flow volume / 20-period sum of volume
Note: Steps 2 and 3 above are similar to the calculation
of the Chaikin money flow (CMF) indicator
		
		*/
		
		
        /// <summary>
        /// Called on each bar update event (incoming tick)
        /// </summary>
        protected override void OnBarUpdate()
        {
            // Use this method for calculating your indicator values. Assign a value to each
            // plot below by replacing 'Close[0]' with your own formula.
			VOL.Set(Volume[0]);
			HH.Set(High[0]);
			LL.Set(Low[0]);
	if(CurrentBar >= period) 
		MFOPlot0.Set(MFOfunction(VOL,HH,LL,period)[0]);
		else
		Print("Not In Range");
        }

        #region Properties
        [Browsable(false)]	// this line prevents the data series from being displayed in the indicator properties dialog, do not remove
        [XmlIgnore()]		// this line ensures that the indicator can be saved/recovered as part of a chart template, do not remove
        public DataSeries MFOPlot0
        {
            get { return Values[0]; }
        }

        [Description("period for volume l")]
        [GridCategory("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 MFO12092015TASC[] cacheMFO12092015TASC = null;

        private static MFO12092015TASC checkMFO12092015TASC = new MFO12092015TASC();

        /// <summary>
        /// TASC proposed a good MFO ie. money flow oscciilator
        /// </summary>
        /// <returns></returns>
        public MFO12092015TASC MFO12092015TASC(int period)
        {
            return MFO12092015TASC(Input, period);
        }

        /// <summary>
        /// TASC proposed a good MFO ie. money flow oscciilator
        /// </summary>
        /// <returns></returns>
        public MFO12092015TASC MFO12092015TASC(Data.IDataSeries input, int period)
        {
            if (cacheMFO12092015TASC != null)
                for (int idx = 0; idx < cacheMFO12092015TASC.Length; idx++)
                    if (cacheMFO12092015TASC[idx].Period == period && cacheMFO12092015TASC[idx].EqualsInput(input))
                        return cacheMFO12092015TASC[idx];

            lock (checkMFO12092015TASC)
            {
                checkMFO12092015TASC.Period = period;
                period = checkMFO12092015TASC.Period;

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

                MFO12092015TASC indicator = new MFO12092015TASC();
                indicator.BarsRequired = BarsRequired;
                indicator.CalculateOnBarClose = CalculateOnBarClose;
#if NT7
                indicator.ForceMaximumBarsLookBack256 = ForceMaximumBarsLookBack256;
                indicator.MaximumBarsLookBack = MaximumBarsLookBack;
#endif
                indicator.Input = input;
                indicator.Period = period;
                Indicators.Add(indicator);
                indicator.SetUp();

                MFO12092015TASC[] tmp = new MFO12092015TASC[cacheMFO12092015TASC == null ? 1 : cacheMFO12092015TASC.Length + 1];
                if (cacheMFO12092015TASC != null)
                    cacheMFO12092015TASC.CopyTo(tmp, 0);
                tmp[tmp.Length - 1] = indicator;
                cacheMFO12092015TASC = tmp;
                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>
        /// TASC proposed a good MFO ie. money flow oscciilator
        /// </summary>
        /// <returns></returns>
        [Gui.Design.WizardCondition("Indicator")]
        public Indicator.MFO12092015TASC MFO12092015TASC(int period)
        {
            return _indicator.MFO12092015TASC(Input, period);
        }

        /// <summary>
        /// TASC proposed a good MFO ie. money flow oscciilator
        /// </summary>
        /// <returns></returns>
        public Indicator.MFO12092015TASC MFO12092015TASC(Data.IDataSeries input, int period)
        {
            return _indicator.MFO12092015TASC(input, period);
        }
    }
}

// This namespace holds all strategies and is required. Do not change it.
namespace NinjaTrader.Strategy
{
    public partial class Strategy : StrategyBase
    {
        /// <summary>
        /// TASC proposed a good MFO ie. money flow oscciilator
        /// </summary>
        /// <returns></returns>
        [Gui.Design.WizardCondition("Indicator")]
        public Indicator.MFO12092015TASC MFO12092015TASC(int period)
        {
            return _indicator.MFO12092015TASC(Input, period);
        }

        /// <summary>
        /// TASC proposed a good MFO ie. money flow oscciilator
        /// </summary>
        /// <returns></returns>
        public Indicator.MFO12092015TASC MFO12092015TASC(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.MFO12092015TASC(input, period);
        }
    }
}
#endregion
MFO092015TASCbeta3.02.zip
MFO.zip



FYI:

PHP Code:
Error on calling 'OnBarUpdate' method for indicator 'MFO12092015TASC' on bar 0You are accessing an index with a value that is invalid since its out of rangeI.Eaccessing a series [barsAgowith a value of 5 when there are only 4 bars on the chart

PHP Code:
if(CurrentBar >= period
        
MFOPlot0.Set(MFOfunction(VOL,HH,LL,period)[0]);
        else
        Print(
"Not In Range"); 
DONE
Attached Files
File Type: zip MFOTASC092015.zip (2.7 KB, 0 views)
__________________
thx
nTuple

Disclaimer: I am not a Research Analyst and not registered with any regulating authority. All posts are for educational purpose only.

Consider us a dumb -dumble guy in this analysis, any type of real time example will be quick-learn approach.

Last edited by nTP; 13-09-2015 at 03:06 PM.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
The Following User Says Thank You to nTP For This Useful Post:
Reply

indiTraders - Forum for the Active Indian Trader > Tools > Software > NinjaTrader


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are On
Refbacks are On



All times are GMT +5.5. The time now is 10:07 PM.


vBulletin Copyright by vBulletin

Content Relevant URLs by vBSEO 3.3.2