#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.Gui.Tools;
using NinjaTrader.Data;
using NinjaTrader.NinjaScript;
using NinjaTrader.Core.FloatingPoint;
using NinjaTrader.NinjaScript.DrawingTools;
#endregion
//////////////////////////////////////////////////////////////////////////////////
// TPandSLdrawing - by BERN ALGOS - January 2023 - Rev01
//
// This indicator draws TP and SL lines over the chart, calculated as below:
// - Take Profit as per ATR values, period programmable by a parameter (default: 5)
// - Risk/Reward ratio, programmable by a parameter from 1/10 to 10 (default: 2)
//////////////////////////////////////////////////////////////////////////////////
namespace NinjaTrader.NinjaScript.Indicators
{
public class TPandSLdrawing : Indicator
{
private ATR MyATR;
private double actual_ATRsqrt;
private double _TP;
private double _SL;
private double actual_TP;
private double actual_SL;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"TPandSLdrawing";
Name = "TPandSLdrawing";
Calculate = Calculate.OnBarClose;
IsOverlay = true;
DisplayInDataBox = false;
DrawOnPricePanel = true;
DrawHorizontalGridLines = true;
DrawVerticalGridLines = true;
PaintPriceMarkers = false;
IsAutoScale = false;
IsSuspendedWhileInactive = true;
P_ATR_Period = 5; // default ATR period
P_RiskRewardRatio = 2; // default Risk/Reward Ratio
}
else if (State == State.Configure)
{
}
else if (State == State.DataLoaded)
{
MyATR = ATR(Input, P_ATR_Period);
}
}
protected override void OnBarUpdate()
{
if (CurrentBars[0] < P_ATR_Period) return;
DrawOnPricePanel = true;
_TP = (int)(MyATR[0]/TickSize); // Take Profit Ticks
_SL = (int)(_TP*P_RiskRewardRatio); // Stop Loss Ticks
actual_TP = Close[0]+_TP*TickSize;
actual_SL = Close[0]-_SL*TickSize;
Draw.Line(this, "TP_line1", false, 0, Close[0], -2, actual_TP, Brushes.Green, DashStyleHelper.Solid, 1);
Draw.Line(this, "TP_line2", false, -2, actual_TP, -4, actual_TP, Brushes.Green, DashStyleHelper.Solid, 1);
Draw.Line(this, "TP_line3", false, -2, actual_TP, P_ATR_Period, actual_TP, Brushes.Green, DashStyleHelper.DashDotDot,1);
Draw.Text(this, "TP_text1", "TP ticks= " + _TP.ToString(), -6, actual_TP, Brushes.White);
Draw.Line(this, "SL_line1", false, 0, Close[0], -2, actual_SL, Brushes.Red, DashStyleHelper.Solid, 1);
Draw.Line(this, "SL_line2", false, -2, actual_SL, -4, actual_SL, Brushes.Red, DashStyleHelper.Solid, 1);
Draw.Line(this, "SL_line3", false, -2, actual_SL, P_ATR_Period, actual_SL, Brushes.Red, DashStyleHelper.DashDotDot,1);
Draw.Text(this, "SL_text1", "SL ticks= " + _SL.ToString(), -6, actual_SL, Brushes.White);
}
#region Properties
[NinjaScriptProperty]
[Range(1, 25)]
[Display(Name="P_ATR_Period", Order=1, GroupName="Parameters")]
public int P_ATR_Period
{ get; set; }
[NinjaScriptProperty]
[Range(0.1, 10)]
[Display(Name="P_RiskRewardRatio", Order=2, GroupName="Parameters")]
public double P_RiskRewardRatio
{ get; set; }
#endregion
}
}
|