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.Indicators;
using NinjaTrader.NinjaScript.DrawingTools;
#endregion
//This namespace holds Strategies in this folder and is required. Do not change it.
namespace NinjaTrader.NinjaScript.Strategies
{
public class RenkoOBVSMA : Strategy
{
private double StopPriceLong;
private double StopPriceShort;
private double BETarget;
private bool BEBool;
private SMA SMA1;
private OBV OBV1;
private Momentum Momentum1;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Enter the description for your new custom Strategy here.";
Name = "RenkoOBVSMA";
Calculate = Calculate.OnBarClose;
EntriesPerDirection = 3;
EntryHandling = EntryHandling.UniqueEntries;
IsExitOnSessionCloseStrategy = true;
ExitOnSessionCloseSeconds = 30;
IsFillLimitOnTouch = false;
MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix;
OrderFillResolution = OrderFillResolution.Standard;
Slippage = 0;
StartBehavior = StartBehavior.WaitUntilFlat;
TimeInForce = TimeInForce.Gtc;
TraceOrders = false;
RealtimeErrorHandling = RealtimeErrorHandling.StopCancelClose;
StopTargetHandling = StopTargetHandling.PerEntryExecution;
BarsRequiredToTrade = 20;
// Disable this property for performance gains in Strategy Analyzer optimizations
// See the Help Guide for additional information
IsInstantiatedOnEachOptimizationIteration = true;
Breakeven = 4;
BreakOffset = 0;
StopPriceLong = 1;
StopPriceShort = 1;
BETarget = 1;
BEBool = false;
}
else if (State == State.Configure)
{
}
else if (State == State.DataLoaded)
{
SMA1 = SMA(Close, 10);
OBV1 = OBV(Close);
Momentum1 = Momentum(OBV1, 10);
}
}
protected override void OnBarUpdate()
{
if (BarsInProgress != 0)
return;
if (CurrentBars[0] < 1)
return;
// Set 1
if ((Position.MarketPosition == MarketPosition.Flat)
&& (Close[0] > SMA1[0])
&& (Momentum1[0] > 0))
{
EnterLong(Convert.ToInt32(DefaultQuantity), @"Long");
StopPriceLong = SMA1[1];
BEBool = false;
}
// Set 2
if ((Position.MarketPosition == MarketPosition.Long)
&& (BEBool == false))
{
ExitLongStopMarket(Convert.ToInt32(DefaultQuantity ), StopPriceLong, @"ExitLong", @"Long");
BETarget = (Position.AveragePrice + (Breakeven * TickSize)) ;
}
// Set 3
if ((Position.MarketPosition == MarketPosition.Long)
&& (Close[0] >= BETarget))
{
BEBool = true;
}
// Set 4
if ((Position.MarketPosition == MarketPosition.Long)
&& (BEBool == true))
{
ExitLongStopMarket(Convert.ToInt32(DefaultQuantity ), (Position.AveragePrice + (BreakOffset * TickSize)) , @"ExitLong", @"Long");
}
// Set 5
if (Position.MarketPosition == MarketPosition.Long)
{
StopPriceLong = SMA1[1];
}
// Set 6
if ((Position.MarketPosition == MarketPosition.Long)
&& (BEBool == true)
&& (StopPriceLong > (Position.AveragePrice + (BreakOffset * TickSize)) ))
{
ExitLongStopMarket(Convert.ToInt32(DefaultQuantity ), StopPriceLong, @"ExitLong", @"Long");
}
// Set 7
if ((Position.MarketPosition == MarketPosition.Flat)
&& (Close[0] < SMA1[0])
&& (Momentum1[0] < 0))
{
EnterShort(Convert.ToInt32(DefaultQuantity), @"Short");
StopPriceShort = SMA1[1];
}
// Set 8
if (Position.MarketPosition == MarketPosition.Short)
{
ExitShortStopMarket(Convert.ToInt32(DefaultQuantit y), StopPriceShort, @"ExitShort", @"Short");
}
// Set 9
if (Position.MarketPosition == MarketPosition.Short)
{
StopPriceShort = SMA1[1];
}
}
region Properties
[NinjaScriptProperty]
[Range(1, int.MaxValue)]
[Display(Name="Breakeven", Order=1, GroupName="Parameters")]
public int Breakeven
{ get; set; }
[NinjaScriptProperty]
[Range(0, int.MaxValue)]
[Display(Name="BreakOffset", Order=2, GroupName="Parameters")]
public int BreakOffset
{ get; set; }
#endregion
}
}

Comment