ConnorsRSI NinjaTrader8 Indicator

追記:ninjatraderecosystemのサイトを検索したら普通に公開されてました。
https://ninjatraderecosystem.com/user-app-share-download/connorsrsi-2/

~~~~~~~~~~~~~~~~~~~~~

トレードステーション終わってしまいましたね。とても残念です。

しかし、新たなシストレ用ソフトは必須なのでフォーラムでオススメされていたニンジャトレーダーを触ってみました。

最新版のほうがいいだろうとニンジャトレーダー8をインストールしたんですが、公式ホームページで公開されているConnorsRSIは前のバージョンしかないんですね・・・

しょうがないので、デフォルトで入っているインジケーターのソースを見比べながら、ニンジャトレーダー8用のConnorsRSIを作ってみました。

言語はまったく理解していませんので、後々ストラテジーで使えるのか、これでいいのか分かりません。

数値自体はTradingmarketsからダウンロードしたeasylanguage版と一緒なので良しとします。

#region Using declarations
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Xml.Serialization;
using NinjaTrader.Cbi;
using NinjaTrader.Gui;
using NinjaTrader.Gui.Chart;
using NinjaTrader.Gui.SuperDom;
using NinjaTrader.Gui.Tools;
using NinjaTrader.Data;
using NinjaTrader.NinjaScript;
using NinjaTrader.Core.FloatingPoint;
using NinjaTrader.NinjaScript.DrawingTools;
#endregion

//This namespace holds Indicators in this folder and is required. Do not change it. 
namespace NinjaTrader.NinjaScript.Indicators
{
	public class ConnorRSI : Indicator
	{
		private int					rankLookBack		= 100; 
		private int					clbPeriod			= 2;
		private int					rsiPeriod			= 3;
		private int					barsAgo				= 0;
		private double				rank				= 0.0;
		private double				percentRank			= 0.0;
		
		
		private ROC			rateOfChange;
		private RSI			clbRSI;
		private RSI			defaultRSI;
		
		private Series<double>	ids_Consecutive;
		
		public override string ToString() 	{return "ConnorRSI (" +  rankLookBack.ToString()+", "+rsiPeriod.ToString()+", "+clbPeriod.ToString()+")"	;}   
		
		protected override void OnStateChange()
		{
			if (State == State.SetDefaults)
			{
				Description									= @"CRSI";
				Name										= "CRSI";
				Calculate									= Calculate.OnPriceChange;
				IsOverlay									= false;
				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;
				
				AddPlot(Brushes.DodgerBlue,		"ConnorsRSI");

				AddLine(Brushes.DarkCyan,	30,	"Lower");
				AddLine(Brushes.DarkCyan,	70,	"Upper");
				
				
				BarsRequiredToPlot = rankLookBack/2;
				ids_Consecutive = new Series<double>(this);
			}
			else if (State == State.Configure)
			{
				rateOfChange = ROC(Input, 1);
				clbRSI = RSI(ids_Consecutive, clbPeriod, 3);
				defaultRSI = RSI(Input, rsiPeriod, 3);
			}
		}

		protected override void OnBarUpdate()
		{
			//Add your custom indicator logic here.
			if(CurrentBar < 1)
			{
				ids_Consecutive[0] = 0;
				ConnorsRSI[0] = 50.0;
				return;
			}	
			
			barsAgo = Math.Min(rankLookBack, CurrentBar);
			rank = 0.0;
			for (int i = 1; i <= barsAgo; i++)
				if(rateOfChange[0] > rateOfChange[i])
					rank = rank + 1.0;
			percentRank = 100*rank/barsAgo;
			if(Input[0] > Input[1])
				ids_Consecutive[0] = ids_Consecutive[1] < 0.5 ? 1.0 : ids_Consecutive[1] + 1.0;
			else if (Input[0] < Input[1])
				ids_Consecutive[0] = ids_Consecutive[1] > -0.5 ? -1.0 : ids_Consecutive[1] - 1.0;
			else
				ids_Consecutive[0] = 0.0;
			ConnorsRSI[0] = (percentRank + clbRSI[0] + defaultRSI[0])/3.0;
			
		}
		#region Properties
		[Browsable(false)]
		[XmlIgnore()]
		public Series<double> ConnorsRSI
		{
			get { return Values[0]; }
		}
		#endregion
	}
}

#region NinjaScript generated code. Neither change nor remove.

namespace NinjaTrader.NinjaScript.Indicators
{
	public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
	{
		private ConnorRSI[] cacheConnorRSI;
		public ConnorRSI ConnorRSI()
		{
			return ConnorRSI(Input);
		}

		public ConnorRSI ConnorRSI(ISeries<double> input)
		{
			if (cacheConnorRSI != null)
				for (int idx = 0; idx < cacheConnorRSI.Length; idx++)
					if (cacheConnorRSI[idx] != null &&  cacheConnorRSI[idx].EqualsInput(input))
						return cacheConnorRSI[idx];
			return CacheIndicator<ConnorRSI>(new ConnorRSI(), input, ref cacheConnorRSI);
		}
	}
}

namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
	public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
	{
		public Indicators.ConnorRSI ConnorRSI()
		{
			return indicator.ConnorRSI(Input);
		}

		public Indicators.ConnorRSI ConnorRSI(ISeries<double> input )
		{
			return indicator.ConnorRSI(input);
		}
	}
}

namespace NinjaTrader.NinjaScript.Strategies
{
	public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
	{
		public Indicators.ConnorRSI ConnorRSI()
		{
			return indicator.ConnorRSI(Input);
		}

		public Indicators.ConnorRSI ConnorRSI(ISeries<double> input )
		{
			return indicator.ConnorRSI(input);
		}
	}
}

#endregion

タグ: ,