Hi Nicolas,
Was wondering if you could convert a Ninjatrader script to PRT?
I like using this Renko indicator on Ninjatrader when I trade futures.
I have attached the code below that I obtained from the CS file and also a Pic as to how it looks like.
Thanks, I appreciate your help.
Regards
#region Using declarations
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
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.Data;
using NinjaTrader.NinjaScript;
using NinjaTrader.Core.FloatingPoint;
#endregion
//
// BetterRenkoBarsType
//
// written by aslan
//
// 20100807 - created BetterRenko to address issues with other types of Renko bars
// 20101118 - changed initial brick alignment to brick size
// 20150719 - DaleBru converted to NT8
// 20160508 - antonma fixed the SessionIterator compiler error NJ8 8.0.0.9
//
//This namespace holds Bars types in this folder and is required. Do not change it.
namespace NinjaTrader.NinjaScript.BarsTypes
{
public class BetterRenkoBarsType : BarsType
{
private enum RenkoState { BarComplete, BarAccumulating };
private RenkoState barRenkoState = RenkoState.BarComplete;
private double renkoHigh;
private double renkoLow;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"NT8 translation of BetterRenko by aslan";
Name = "BetterRenko";
BarsPeriod = new BarsPeriod { BarsPeriodType = (BarsPeriodType) 17, BarsPeriodTypeName = "BetterRenko(17)", Value = 1 };
BuiltFrom = BarsPeriodType.Tick;
DaysToLoad = 3;
IsIntraday = true;
DefaultChartStyle = Gui.Chart.ChartStyleType.CandleStick;
}
else if (State == State.Configure)
{
Name = string.Format(Core.Globals.GeneralOptions.CurrentCulture, "{0} BetterRenko{1}", BarsPeriod.Value, (BarsPeriod.MarketDataType != MarketDataType.Last ? string.Format(" - {0}", Core.Globals.ToLocalizedObject(BarsPeriod.MarketDataType, Core.Globals.GeneralOptions.CurrentUICulture)) : string.Empty));
Properties.Remove(Properties.Find("BaseBarsPeriodType", true));
Properties.Remove(Properties.Find("BaseBarsPeriodValue", true));
Properties.Remove(Properties.Find("PointAndFigurePriceType", true));
Properties.Remove(Properties.Find("ReversalType", true));
Properties.Remove(Properties.Find("Value2", true));
SetPropertyName("Value", "BrickSize");
}
}
public override int GetInitialLookBackDays(BarsPeriod barsPeriod, TradingHours tradingHours, int barsBack)
{
return 3;
}
protected override void OnDataPoint(Bars bars, double open, double high, double low, double close, DateTime time, long volume, bool isBar, double bid, double ask)
{
var brickSize = bars.Instrument.MasterInstrument.RoundToTickSize(bars.BarsPeriod.Value * bars.Instrument.MasterInstrument.TickSize); // #ticks per brick * tickSize
// build a session iterator from the bars object being updated
if (SessionIterator == null)
SessionIterator = new SessionIterator(bars);
if (SessionIterator.IsNewSession(time, isBar))
{
SessionIterator.GetNextSession(time, isBar);
}
if (bars.Count == 0 || bars.IsResetOnNewTradingDay && SessionIterator.IsNewSession(time, isBar))
{
if (bars.Count > 0)
{
// Close out last bar in session and set open == close
double lastBarClose = bars.GetClose(bars.Count - 1);
DateTime lastBarTime = bars.GetTime(bars.Count - 1);
long lastBarVolume = bars.GetVolume(bars.Count - 1);
bars.RemoveLastBar();
AddBar(bars, lastBarClose, lastBarClose, lastBarClose, lastBarClose, lastBarTime, lastBarVolume);
}
barRenkoState = RenkoState.BarAccumulating;
double mod = bars.Instrument.MasterInstrument.RoundToTickSize(close % brickSize);
double mid = bars.Instrument.MasterInstrument.Compare(mod, brickSize) == 0 ? close : close - mod;
renkoHigh = mid + brickSize;
renkoLow = mid - brickSize;
AddBar(bars, close, close, close, close, time, volume);
bars.LastPrice = close;
return;
}
if (barRenkoState == RenkoState.BarComplete)
{
// this tick creates a new bar
AddBar(bars, close, close, close, close, time, volume);
if (RangeExceeded(bars.Instrument.MasterInstrument, close))
{
MoveLimits(bars.Instrument.MasterInstrument, close, brickSize);
}
}
else
{
if (RangeExceeded(bars.Instrument.MasterInstrument, close))
{
AddBar(bars, close, close, close, close, time, volume);
MoveLimits(bars.Instrument.MasterInstrument, close, brickSize);
}
else
{
var barHigh = bars.GetHigh(bars.Count - 1);
var barLow = bars.GetLow(bars.Count - 1);
UpdateBar(bars, (close > barHigh ? close : barHigh), (close < barLow ? close : barLow), close, time, volume);
}
}
CheckBarComplete(bars.Instrument.MasterInstrument, close, brickSize);
bars.LastPrice = close;
}
public override void ApplyDefaultBasePeriodValue(BarsPeriod period)
{
}
public override void ApplyDefaultValue(BarsPeriod period)
{
period.BarsPeriodTypeName = "BetterRenko";
period.Value = 2;
}
public override string ChartLabel(DateTime dateTime)
{
return dateTime.ToString("T", Core.Globals.GeneralOptions.CurrentCulture);
}
public override double GetPercentComplete(Bars bars, DateTime now)
{
return 1.0d; //replace with your bar percent logic
}
private void MoveLimits(MasterInstrument masterInstrument, double price, double brickSize)
{
if (masterInstrument.Compare(price, renkoHigh) >= 0)
{
do
{
renkoHigh += brickSize;
renkoLow = renkoHigh - 3.0 * brickSize;
} while (masterInstrument.Compare(price, renkoHigh) > 0); // stops if price in range, including edge
}
else
{
do
{
renkoLow -= brickSize;
renkoHigh = renkoLow + 3.0 * brickSize;
} while (masterInstrument.Compare(price, renkoLow) < 0);
}
}
private void CheckBarComplete(MasterInstrument masterInstrument, double price, double brickSize)
{
int cmpHi = masterInstrument.Compare(price, renkoHigh);
int cmpLo = masterInstrument.Compare(price, renkoLow);
if (cmpHi == 0 || cmpLo == 0)
{
barRenkoState = RenkoState.BarComplete;
MoveLimits(masterInstrument, price, brickSize); // will move limits once since equal
}
else barRenkoState = RenkoState.BarAccumulating;
}
private bool RangeExceeded(MasterInstrument masterInstrument, double price)
{
int cmpHi = masterInstrument.Compare(price, renkoHigh);
int cmpLo = masterInstrument.Compare(price, renkoLow);
return (cmpHi > 0 || cmpLo < 0);
}
}
}