#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; using NinjaTrader.NinjaScript.Indicators; using NinjaTrader.NinjaScript.DrawingTools; #endregion namespace StrategyTypes { public enum stratstyle { FixeCtBreakEven, VariableCt } } namespace NinjaTrader.NinjaScript.Strategies { public class Ares : Strategy { private double volumeMultiple = 1.500; // Default setting for VolumeMultiple private string upwardBreakout = "YES"; // Default setting for Upward Price Breakout private EMA EMA1; // Trend designer private int nbre; // Contract iteration factor private Order MyEntry; // Entry management private int contractlive; // Live contract number private PPO PPO1; // PPO filter protected override void OnStateChange() { if (State == State.SetDefaults) { Description = @"Identify chart breakout pattern coupled with volume"; Name = "Ares"; Calculate = Calculate.OnBarClose; EntriesPerDirection = 1; EntryHandling = EntryHandling.AllEntries; 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; TP = 50; SL = 30; contract = 1; BE = 20; BEprice = 5; DotGap = 0.5; } if (State == State.Configure) { EMA1 = EMA(Close, 200); contractlive = contract; PPO1 = PPO(Close, 233, 610, 55); } } protected override void OnBarUpdate() { switch (stratstyle1) { case(StrategyTypes.stratstyle.VariableCt): if (Close[0] > EMA1[0]) { upwardBreakout = "YES"; // Condition set 1 - Upward Price Breakout if (AresPriceBreakout(upwardBreakout,VolumeMultiple).Plot0[0] == 1 && Position.MarketPosition == MarketPosition.Flat && (BarsSinceExitExecution() > 2 || BarsSinceExitExecution() == -1) ) { Draw.Region(this, "Long" + CurrentBar.ToString(), 3, 0, High, Low, Brushes.Black, Brushes.DodgerBlue, 80, 0); Draw.Dot(this, "Entry" + CurrentBar.ToString(), true, 0, Low[0] - DotGap, Brushes.Green); MyEntry = EnterLong(Convert.ToInt32(contractlive), "Long"); nbre = contractlive; SetProfitTarget("", CalculationMode.Ticks, TP); SetStopLoss("", CalculationMode.Ticks, SL, false); } } if (Low[0] < EMA1[0]) { upwardBreakout = "NO"; // Condition set 2 - Downward Price Breakout if (AresPriceBreakout(upwardBreakout,VolumeMultiple).Plot0[0] == -1 && Position.MarketPosition == MarketPosition.Flat && (BarsSinceExitExecution() > 2 || BarsSinceExitExecution() == -1) ) { Draw.Region(this, "Short" + CurrentBar.ToString(), 3, 0, High, Low, Brushes.Black, Brushes.HotPink, 80, 0); Draw.Dot(this, "Entry" + CurrentBar.ToString(), true, 0, High[0] + DotGap, Brushes.Red); MyEntry = EnterShort(Convert.ToInt32(contractlive), "Short"); nbre = contractlive; SetProfitTarget("", CalculationMode.Ticks, TP); SetStopLoss("", CalculationMode.Ticks, SL, false); } } if (SystemPerformance.RealTimeTrades.Count > 0) { // Check to make sure there is at least one trade in the collection Trade lastTrade = SystemPerformance.RealTimeTrades[SystemPerformance.RealTimeTrades.Count - 1]; // Calculate the PnL for the last completed real-time trade double lastProfitCurrency = lastTrade.ProfitCurrency; // Store the quantity of the last completed real-time trade double lastTradeQty = lastTrade.Quantity; if (lastTrade.ProfitCurrency < 0) { contractlive = nbre *2 ; } if (lastTrade.ProfitCurrency > 0) { contractlive = contract ; nbre = 1 ; } } break; case(StrategyTypes.stratstyle.FixeCtBreakEven): if (Close[0] > EMA1[0]) { upwardBreakout = "YES"; // Condition set 1 - Upward Price Breakout if (AresPriceBreakout(upwardBreakout,VolumeMultiple).Plot0[0] == 1 && Position.MarketPosition == MarketPosition.Flat && (BarsSinceExitExecution() > 2 || BarsSinceExitExecution() == -1) ) { Draw.Region(this, "Long" + CurrentBar.ToString(), 3, 0, High, Low, Brushes.Black, Brushes.LimeGreen, 80, 0); Draw.Dot(this, "Entry" + CurrentBar.ToString(), true, 0, Low[0] - DotGap, Brushes.Green); MyEntry = EnterLong(Convert.ToInt32(contract), "Long"); SetProfitTarget("", CalculationMode.Ticks, TP); } } if (Low[0] < EMA1[0]) { upwardBreakout = "NO"; // Condition set 2 - Downward Price Breakout if (AresPriceBreakout(upwardBreakout,VolumeMultiple).Plot0[0] == -1 && Position.MarketPosition == MarketPosition.Flat && (BarsSinceExitExecution() > 2 || BarsSinceExitExecution() == -1) ) {Draw.Region(this, "Short" + CurrentBar.ToString(), 3, 0, High, Low, Brushes.Black, Brushes.HotPink, 80, 0); Draw.Dot(this, "Entry" + CurrentBar.ToString(), true, 0, High[0] + DotGap, Brushes.Red); MyEntry = EnterShort(Convert.ToInt32(contract), "Short"); SetProfitTarget("", CalculationMode.Ticks, TP); } } // Break Even system // Resets the stop loss to the original value when all positions are closed if (Position.MarketPosition == MarketPosition.Flat) { SetStopLoss(CalculationMode.Ticks, SL); } // If a long position is open, allow for stop loss modification to breakeven else if (Position.MarketPosition == MarketPosition.Long) { // Once the price is greater than entry price+BE ticks, set stop loss to breakeven if (Close[0] > Position.AveragePrice + BE * TickSize) { SetStopLoss(CalculationMode.Price, Position.AveragePrice + BEprice * TickSize); } } else if (Position.MarketPosition == MarketPosition.Short) { // Once the price is less than price+BE ticks, set stop loss to breakeven if (Close[0] < Position.AveragePrice - BE * TickSize) { SetStopLoss(CalculationMode.Price, Position.AveragePrice - BEprice * TickSize); }} break; } } #region Properties [NinjaScriptProperty] [Display(Name="Strategy Style", Description="Choose BE with fix contract or variable contract with fix TP/SL", Order=1, GroupName="A/ Strategie mode")] public StrategyTypes.stratstyle stratstyle1 { get; set; } [Range(1, double.MaxValue)] [NinjaScriptProperty] [Display(Name="VolumeMultiple", Description="Define how big the volume should be on breakout", Order=5, GroupName="B/ General Parameters")] public double VolumeMultiple { get { return volumeMultiple; } set { volumeMultiple = Math.Max(1, value); } } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name="TP", Order=1, GroupName="B/ General Parameters")] public int TP { get; set; } [NinjaScriptProperty] [Range(double.MinValue, double.MaxValue)] [Display(Name="Order dot gap", Description="Entry dot distance from the bar", Order=4, GroupName="B/ General Parameters")] public double DotGap { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name="SL", Order=2, GroupName="B/ General Parameters")] public int SL { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name="contract", Order=3, GroupName="B/ General Parameters")] public int contract { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name="Price limit", Order=2, GroupName="C/ Break Even parameters")] public int BE { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name="BE position", Order=3, GroupName="C/ Break Even parameters")] public int BEprice { get; set; } #endregion } }