_TradesCounter Ninjatrader

https://forum.ninjatrader.com/forum/ninjatrader-8/add-on-development/1167848-trade-counter?p=1317711#post1317711
 avatar
unknown
csharp
8 months ago
10 kB
5
No Index
// https://forum.ninjatrader.com/forum/ninjatrader-8/add-on-development/1167848-trade-counter?p=1317711#post1317711
// Copyright (C) 2024, NinjaTrader LLC <www.ninjatrader.com>.
// NinjaTrader reserves the right to modify or overwrite this NinjaScript component with each release.
//
#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

//This namespace holds strategies in this folder and is required. Do not change it.
namespace NinjaTrader.NinjaScript.Strategies
{
	public class _TradesCounter : Strategy
	{
		#region Class Variables
		
		private SMA smaFast;
		private SMA smaSlow;

		private int DailyTrades;
		private int SessionStartTradeCount;
		
		private int	lossesCount, winsCount, bottomLineTrades;
		private int SessionStartLosingTradesCount, SessionStartWinningTradesCount;
		
		private double	SessionStartNetProfitTrades;
		private double	tradesProfits;
			
		NinjaTrader.Gui.Tools.SimpleFont tradesstats = 
		new NinjaTrader.Gui.Tools.SimpleFont("Agency Fb", 16) { Size = 17, Bold = true };
		
		#endregion
		
		protected override void OnStateChange()
		{
			if (State == State.SetDefaults)
			{
				Description	= NinjaTrader.Custom.Resource.NinjaScriptStrategyDescriptionSampleMACrossOver;
				Name		= "_TradesCounter";
				Fast		= 3;
				Slow		= 8;
				// This strategy has been designed to take advantage of performance gains in Strategy Analyzer optimizations
				// See the Help Guide for additional information
				IsInstantiatedOnEachOptimizationIteration = false;
						
				#region 00. Day and Hours Time Filters
				
					DayFrom  							= DayOfWeek.Monday;
					DayTo								= DayOfWeek.Friday;
					
					HourFrom  							= DateTime.Parse("09:00");
					HourTo								= DateTime.Parse("18:00");
				
				#endregion
			}
			else if (State == State.DataLoaded)
			{
				smaFast = SMA(Fast);
				smaSlow = SMA(Slow);

				smaFast.Plots[0].Brush = Brushes.Goldenrod;
				smaSlow.Plots[0].Brush = Brushes.SeaGreen;

				AddChartIndicator(smaFast);
				AddChartIndicator(smaSlow);
			}
		}

		protected override void OnBarUpdate()
		{
			if (CurrentBar < BarsRequiredToTrade)
				return;
			
			bool dayTimeFilter		=	(	
											Time[0].DayOfWeek		>=	DayFrom
											&& Time[0].DayOfWeek	<=  DayTo
									  	);
			bool hoursTimeFilter	=	(
											( 
												ToTime(Time[0])		>=	ToTime(HourFrom) 
												&& ToTime(Time[0])	<  ToTime(HourTo) 
											)
										);
			
	        lossesCount			= SystemPerformance.AllTrades.LosingTrades.Count;
	       	winsCount			= SystemPerformance.AllTrades.WinningTrades.Count;
	        tradesProfits		= SystemPerformance.AllTrades.TradesPerformance.NetProfit;
			bottomLineTrades	= (-1 * lossesCount) + winsCount;
			
				Print(" ");
				Print("0. ");
				
				Print(Times[0][0] + " DailyTradesCounter: " + DailyTrades);
				Print(Times[0][0] + " lossesCount: " + lossesCount);
				Print(Times[0][0] + " winsCount: " + winsCount);
				Print(Times[0][0] + " tradesProfits: " + tradesProfits);
				Print(Times[0][0] + " bottomLineTrades: " + bottomLineTrades);
				
				Print(Times[0][0] + " SessionStartTradeCount: " + SessionStartTradeCount);
				Print(Times[0][0] + " SessionStartLosingTradesCount: " + SessionStartLosingTradesCount);
				Print(Times[0][0] + " SessionStartWinningTradesCount: " + SessionStartWinningTradesCount);
				Print(Times[0][0] + " SessionStartNetProfitTrades: " + SessionStartNetProfitTrades);
			
			if(
			    ToTime(Time[0])	<=	ToTime(HourFrom)
				|| ToTime(Time[0])	>=  ToTime(HourTo)
				)
			{
				DailyTrades = 0;
				
				lossesCount			= 0;
				winsCount			= 0;
				tradesProfits 		= 0;
				bottomLineTrades 	= 0;
				
				SessionStartTradeCount = SystemPerformance.AllTrades.TradesCount;
				
				SessionStartLosingTradesCount    = SystemPerformance.AllTrades.LosingTrades.Count;
				SessionStartWinningTradesCount   = SystemPerformance.AllTrades.WinningTrades.Count;
				SessionStartNetProfitTrades      = SystemPerformance.AllTrades.TradesPerformance.NetProfit;
			
				Print(" ");
				Print("1. ");
				
				Print(Times[0][0] + " DailyTradesCounter: " + DailyTrades);
				Print(Times[0][0] + " lossesCount: " + lossesCount);
				Print(Times[0][0] + " winsCount: " + winsCount);
				Print(Times[0][0] + " tradesProfits: " + tradesProfits);
				Print(Times[0][0] + " bottomLineTrades: " + bottomLineTrades);
				
				Print(Times[0][0] + " SessionStartTradeCount: " + SessionStartTradeCount);
				Print(Times[0][0] + " SessionStartLosingTradesCount: " + SessionStartLosingTradesCount);
				Print(Times[0][0] + " SessionStartWinningTradesCount: " + SessionStartWinningTradesCount);
				Print(Times[0][0] + " SessionStartNetProfitTrades: " + SessionStartNetProfitTrades);
			}
			
			//calculate DailyTrades value
			DailyTrades         = SystemPerformance.AllTrades.TradesCount - SessionStartTradeCount;
			lossesCount         = SystemPerformance.AllTrades.LosingTrades.Count - SessionStartLosingTradesCount;
			winsCount           = SystemPerformance.AllTrades.WinningTrades.Count - SessionStartWinningTradesCount;
			tradesProfits       = SystemPerformance.AllTrades.TradesPerformance.NetProfit - SessionStartNetProfitTrades;
			bottomLineTrades    =  (-1 * lossesCount) + winsCount;
			
				Print(" ");
				Print("2. ");
				
				Print(Times[0][0] + " DailyTradesCounter: " + DailyTrades);
				Print(Times[0][0] + " lossesCount: " + lossesCount);
				Print(Times[0][0] + " winsCount: " + winsCount);
				Print(Times[0][0] + " tradesProfits: " + tradesProfits);
				Print(Times[0][0] + " bottomLineTrades: " + bottomLineTrades);
				
				Print(Times[0][0] + " SessionStartTradeCount: " + SessionStartTradeCount);
				Print(Times[0][0] + " SessionStartLosingTradesCount: " + SessionStartLosingTradesCount);
				Print(Times[0][0] + " SessionStartWinningTradesCount: " + SessionStartWinningTradesCount);
				Print(Times[0][0] + " SessionStartNetProfitTrades: " + SessionStartNetProfitTrades);
			
		    if (	   SystemPerformance.AllTrades.LosingTrades.Count > 0
					|| SystemPerformance.AllTrades.WinningTrades.Count > 0
				)
		    {
			
				Print(" ");
				Print("3. ");
				
				Print(Times[0][0] + " DailyTradesCounter: " + DailyTrades);
				Print(Times[0][0] + " lossesCount: " + lossesCount);
				Print(Times[0][0] + " winsCount: " + winsCount);
				Print(Times[0][0] + " tradesProfits: " + tradesProfits);
				Print(Times[0][0] + " bottomLineTrades: " + bottomLineTrades);
				
				Print(Times[0][0] + " SessionStartTradeCount: " + SessionStartTradeCount);
				Print(Times[0][0] + " SessionStartLosingTradesCount: " + SessionStartLosingTradesCount);
				Print(Times[0][0] + " SessionStartWinningTradesCount: " + SessionStartWinningTradesCount);
				Print(Times[0][0] + " SessionStartNetProfitTrades: " + SessionStartNetProfitTrades);
				
				Draw.TextFixed(this, "tradesstats", 
											"\n"+"Up/Down Trades Count: "+bottomLineTrades.ToString()+"\n"+
											"Total Profits: "+tradesProfits.ToString(), 
											TextPosition.TopRight, Brushes.Magenta, 
											tradesstats, Brushes.Transparent,Brushes.Black,100);
			
				Print(" ");
				Print("4. ");
				
				Print(Times[0][0] + " DailyTradesCounter: " + DailyTrades);
				Print(Times[0][0] + " lossesCount: " + lossesCount);
				Print(Times[0][0] + " winsCount: " + winsCount);
				Print(Times[0][0] + " tradesProfits: " + tradesProfits);
				Print(Times[0][0] + " bottomLineTrades: " + bottomLineTrades);
				
				Print(Times[0][0] + " SessionStartTradeCount: " + SessionStartTradeCount);
				Print(Times[0][0] + " SessionStartLosingTradesCount: " + SessionStartLosingTradesCount);
				Print(Times[0][0] + " SessionStartWinningTradesCount: " + SessionStartWinningTradesCount);
				Print(Times[0][0] + " SessionStartNetProfitTrades: " + SessionStartNetProfitTrades);
		    }
				
			if (
						dayTimeFilter
					&& hoursTimeFilter
				)
			{
				//logic to enter and exit trades, just so we can see our counter update
				if (CrossAbove(smaFast, smaSlow, 1))
					EnterLong();
				else if (CrossBelow(smaFast, smaSlow, 1))
					EnterShort();
			}
		}

		#region Properties
		[Range(1, int.MaxValue), NinjaScriptProperty]
		[Display(ResourceType = typeof(Custom.Resource), Name = "Fast", GroupName = "NinjaScriptStrategyParameters", Order = 0)]
		public int Fast
		{ get; set; }

		[Range(1, int.MaxValue), NinjaScriptProperty]
		[Display(ResourceType = typeof(Custom.Resource), Name = "Slow", GroupName = "NinjaScriptStrategyParameters", Order = 1)]
		public int Slow
		{ get; set; }
		#endregion
		
		#region Properties
		
		
		[Display(Name="Day of Week From:", Description="", Order=0, GroupName="00. Day and Hours \n Time Filters")]
		[RefreshProperties(RefreshProperties.All)]
		public DayOfWeek DayFrom
		{ get; set; }
		
		[Display(Name="Day of Week To:", Description="", Order=1, GroupName="00. Day and Hours \n Time Filters")]
		[RefreshProperties(RefreshProperties.All)]
		public DayOfWeek DayTo
		{ get; set; }
			
		[NinjaScriptProperty]
		[PropertyEditor("NinjaTrader.Gui.Tools.TimeEditorKey")]
		[Display(Name="Hour From:", Description="Start time", Order=2, GroupName="00. Day and Hours \n Time Filters")]
		public DateTime HourFrom
		{ get; set; }
			
		[NinjaScriptProperty]
		[PropertyEditor("NinjaTrader.Gui.Tools.TimeEditorKey")]
		[Display(Name="Hour To:", Description="End time", Order=3, GroupName="00. Day and Hours \n Time Filters")]
		public DateTime HourTo
		{ get; set; }
		
		#endregion
	}
}
Editor is loading...
Leave a Comment