Announcement

Collapse

Looking for a User App or Add-On built by the NinjaTrader community?

Visit NinjaTrader EcoSystem and our free User App Share!

Have a question for the NinjaScript developer community? Open a new thread in our NinjaScript File Sharing Discussion Forum!
See more
See less

Partner 728x90

Collapse

Get the index of the bar under the cursor

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Get the index of the bar under the cursor

    Hi, How do I obtain the index of the bar under the mouse cursor, from within the MouseMove event? I've tried using the code below, but the results have been consistently wrong:

    Code:
    using System;
    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;
    using System.Windows.Input;
    
    namespace NinjaTrader.NinjaScript.Indicators
    {
    	public class MouseBarIndex : Indicator
    	{
    		protected override void OnStateChange()
    		{
    			switch (State) { 
    
    				case State.SetDefaults:
    					Description = @"MouseBarIndex";
    					Name = "MouseBarIndex";
    					IsChartOnly = true;
    					Calculate = Calculate.OnBarClose;
    					IsOverlay = true;
    					break;
    					
    				case State.DataLoaded:
                        ChartControl.MouseMove += OnMouseMove;
    					break;
    					
    				case State.Terminated:
                        ChartControl.MouseMove -= OnMouseMove;
    					break;
    			}
    		}
    
            void OnMouseMove(object sender, MouseEventArgs e) {
    			ChartControl.Dispatcher.Invoke(() => {
    				TriggerCustomEvent((state) => {
    					var x = (int)e.GetPosition(ChartControl).X;
    		            var barIndex = ChartBars.GetBarIdxByX(ChartControl, x);
    		            Print(string.Format("X: {0}, BarIndex: {1}", x, barIndex));
    				}, 0, null);
    			});
            }
    	}
    }
    
    #region NinjaScript generated code. Neither change nor remove.
    
    namespace NinjaTrader.NinjaScript.Indicators
    {
    	public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
    	{
    		private MouseBarIndex[] cacheMouseBarIndex;
    		public MouseBarIndex MouseBarIndex()
    		{
    			return MouseBarIndex(Input);
    		}
    
    		public MouseBarIndex MouseBarIndex(ISeries<double> input)
    		{
    			if (cacheMouseBarIndex != null)
    				for (int idx = 0; idx < cacheMouseBarIndex.Length; idx++)
    					if (cacheMouseBarIndex[idx] != null &&  cacheMouseBarIndex[idx].EqualsInput(input))
    						return cacheMouseBarIndex[idx];
    			return CacheIndicator<MouseBarIndex>(new MouseBarIndex(), input, ref cacheMouseBarIndex);
    		}
    	}
    }
    
    namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
    {
    	public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
    	{
    		public Indicators.MouseBarIndex MouseBarIndex()
    		{
    			return indicator.MouseBarIndex(Input);
    		}
    
    		public Indicators.MouseBarIndex MouseBarIndex(ISeries<double> input )
    		{
    			return indicator.MouseBarIndex(input);
    		}
    	}
    }
    
    namespace NinjaTrader.NinjaScript.Strategies
    {
    	public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
    	{
    		public Indicators.MouseBarIndex MouseBarIndex()
    		{
    			return indicator.MouseBarIndex(Input);
    		}
    
    		public Indicators.MouseBarIndex MouseBarIndex(ISeries<double> input )
    		{
    			return indicator.MouseBarIndex(input);
    		}
    	}
    }
    
    #endregion
    Last edited by bboyle1234; 12-04-2016, 06:41 PM.

    #2
    Hello bboyle1234,

    I've got a similar script that could likely be adapted very easily.

    Below is a link to the forum thread where I have posted this example.


    This logic is added to the MouseLeftButtonDown event, you could likely change the method to OnMouseMove.
    Last edited by NinjaTrader_ChelseaB; 12-06-2016, 09:15 AM.
    Chelsea B.NinjaTrader Customer Service

    Comment


      #3
      Thanks ChelseaB,

      Your suggestion helped. For the benefit of other readers, here is code I came up with:

      Extension methods for MouseEventArgs:

      Code:
      using NinjaTrader.Gui.Chart;
      using SharpDX;
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows.Input;
      
      namespace MyNamespace {
          public static class MouseEventArgsExtensions {
      
              public static Vector2 GetChartControlPixelsCoordinates(this MouseEventArgs e, ChartControl chartControl) {
                  var position = e.GetPosition(chartControl);
                  return new Vector2(ChartingExtensions.ConvertToHorizontalPixels(position.X, chartControl.PresentationSource), ChartingExtensions.ConvertToVerticalPixels(position.Y, chartControl.PresentationSource));
              }
      
              public static int GetBarIndex(this MouseEventArgs e, ChartControl chartControl, ChartBars chartBars) {
                  return chartBars.GetBarIdxByX(chartControl, (int)e.GetChartControlPixelsCoordinates(chartControl).X);
              }
      
              public static void GetChartClickData(this MouseEventArgs e, ChartControl chartControl, ChartBars chartBars, ChartScale chartScale, out int barIndex, out DateTime timeLocal, out double price) {
                  var position = e.GetChartControlPixelsCoordinates(chartControl);
                  barIndex = chartBars.GetBarIdxByX(chartControl, (int)position.X);
                  timeLocal = chartControl.GetTimeByX((int)position.X);
                  price = chartScale.GetValueByY(position.Y);
              }
          }
      }

      Comment

      Latest Posts

      Collapse

      Topics Statistics Last Post
      Started by wzgy0920, 04-20-2024, 06:09 PM
      2 responses
      27 views
      0 likes
      Last Post wzgy0920  
      Started by wzgy0920, 02-22-2024, 01:11 AM
      5 responses
      32 views
      0 likes
      Last Post wzgy0920  
      Started by wzgy0920, 04-23-2024, 09:53 PM
      2 responses
      49 views
      0 likes
      Last Post wzgy0920  
      Started by Kensonprib, 04-28-2021, 10:11 AM
      5 responses
      193 views
      0 likes
      Last Post Hasadafa  
      Started by GussJ, 03-04-2020, 03:11 PM
      11 responses
      3,235 views
      0 likes
      Last Post xiinteractive  
      Working...
      X