Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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
- //This namespace holds Indicators in this folder and is required. Do not change it.
- namespace NinjaTrader.NinjaScript.Indicators
- {
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")]
- public class BarTimerFlashFusion : Indicator
- {
- private string timeLeft = string.Empty;
- private DateTime now = Core.Globals.Now;
- private bool connected,
- hasRealtimeData;
- private SessionIterator sessionIterator;
- private System.Windows.Threading.DispatcherTimer timer;
- private DisplayType dType = DisplayType.All;
- private FlashType fType = FlashType.WholePanel;
- private int var1 = 0;
- private int var2 = 0;
- private TimeSpan barTimeLeft;
- private System.Windows.Media.Brush textBrush;
- private SimpleFont textFont;
- protected override void OnStateChange()
- {
- if (State == State.SetDefaults)
- {
- Description = @"Displays time countdown of interval based bar series.";
- Name = "BarTimerFlashFusion";
- Calculate = Calculate.OnEachTick;
- DrawOnPricePanel = false;
- IsChartOnly = true;
- IsOverlay = true;
- DisplayInDataBox = false;
- Sound = true;
- AlertDuration = 10;
- Alert = 12;
- TextBrush = System.Windows.Media.Brushes.DodgerBlue;
- TextFont = new SimpleFont("Arial", 12);
- }
- else if (State == State.DataLoaded)
- {
- if (BarsPeriod.BarsPeriodType == BarsPeriodType.Minute)
- var2 = (BarsPeriod.Value*60) - Alert;
- else if (BarsPeriod.BarsPeriodType == BarsPeriodType.Second)
- var2 = BarsPeriod.Value - Alert;
- var1 = var2 - AlertDuration;
- }
- else if (State == State.Historical)
- {
- SetZOrder(-1);
- }
- else if (State == State.Realtime)
- {
- if (timer == null)
- {
- if (Bars.BarsType.IsTimeBased && Bars.BarsType.IsIntraday)
- {
- lock (Connection.Connections)
- {
- if (Connection.Connections.ToList().FirstOrDefault(c => c.Status == ConnectionStatus.Connected && c.InstrumentTypes.Contains(Instrument.MasterInstrument.InstrumentType)) == null)
- Draw.TextFixed(this, "NinjaScriptInfo", NinjaTrader.Custom.Resource.BarTimerDisconnectedError, TextPosition.BottomRight);
- else
- {
- if (!SessionIterator.IsInSession(Now, false, true))
- Draw.TextFixed(this, "NinjaScriptInfo", NinjaTrader.Custom.Resource.BarTimerSessionTimeError, TextPosition.BottomRight);
- else
- Draw.TextFixed(this, "NinjaScriptInfo", NinjaTrader.Custom.Resource.BarTimerWaitingOnDataError, TextPosition.BottomRight);
- }
- }
- }
- else
- Draw.TextFixed(this, "NinjaScriptInfo", NinjaTrader.Custom.Resource.BarTimerTimeBasedError, TextPosition.BottomRight);
- }
- }
- else if (State == State.Terminated)
- {
- if (timer == null)
- return;
- timer.IsEnabled = false;
- timer = null;
- }
- }
- protected override void OnBarUpdate()
- {
- if (State == State.Realtime)
- {
- hasRealtimeData = true;
- connected = true;
- if (IsFirstTickOfBar && Sound)
- {
- PlaySound(NinjaTrader.Core.Globals.InstallDir + @"\sounds\Alert1.wav");
- }
- }
- }
- protected override void OnConnectionStatusUpdate(ConnectionStatusEventArgs connectionStatusUpdate)
- {
- if (connectionStatusUpdate.PriceStatus == ConnectionStatus.Connected
- && connectionStatusUpdate.Connection.InstrumentTypes.Contains(Instrument.MasterInstrument.InstrumentType)
- && Bars.BarsType.IsTimeBased
- && Bars.BarsType.IsIntraday)
- {
- connected = true;
- if (DisplayTime() && timer == null)
- {
- ChartControl.Dispatcher.InvokeAsync(() =>
- {
- timer = new System.Windows.Threading.DispatcherTimer { Interval = new TimeSpan(0, 0, 1), IsEnabled = true };
- timer.Tick += OnTimerTick;
- });
- }
- }
- else if (connectionStatusUpdate.PriceStatus == ConnectionStatus.Disconnected)
- connected = false;
- }
- protected override void OnRender(ChartControl chartControl, ChartScale chartScale)
- {
- SharpDX.Direct2D1.Brush textBrushDx = textBrush.ToDxBrush(RenderTarget);
- NinjaTrader.Gui.Tools.SimpleFont simpleFont = TextFont;
- SharpDX.DirectWrite.TextFormat textFormat1 = simpleFont.ToDirectWriteTextFormat();
- SharpDX.Vector2 upperTextPoint = new SharpDX.Vector2(ChartPanel.X + 10, ChartPanel.Y + (float)(simpleFont.Size * 1.5));
- SharpDX.DirectWrite.TextLayout textLayout1 = new SharpDX.DirectWrite.TextLayout(NinjaTrader.Core.Globals.DirectWriteFactory, timeLeft, textFormat1, ChartPanel.X + ChartPanel.W, textFormat1.FontSize);
- RenderTarget.DrawTextLayout(upperTextPoint, textLayout1, textBrushDx, SharpDX.Direct2D1.DrawTextOptions.NoSnap);
- SharpDX.Vector2 startPoint = new SharpDX.Vector2(ChartPanel.X, ChartPanel.Y);
- SharpDX.Vector2 endPoint = new SharpDX.Vector2(ChartPanel.X + ChartPanel.W, ChartPanel.Y + ChartPanel.H);
- SharpDX.Direct2D1.LinearGradientBrush linearGradientBrush = new SharpDX.Direct2D1.LinearGradientBrush(RenderTarget, new SharpDX.Direct2D1.LinearGradientBrushProperties()
- {
- StartPoint = new SharpDX.Vector2(0, startPoint.Y),
- EndPoint = new SharpDX.Vector2(0, endPoint.Y),
- },
- new SharpDX.Direct2D1.GradientStopCollection(RenderTarget, new SharpDX.Direct2D1.GradientStop[]
- {
- new SharpDX.Direct2D1. GradientStop()
- {
- Color = SharpDX.Color.DarkGray,
- Position = 0,
- },
- new SharpDX.Direct2D1. GradientStop()
- {
- Color = SharpDX.Color.AntiqueWhite,
- Position = 1,
- }
- }));
- if(fType != FlashType.None && (int)barTimeLeft.TotalSeconds < var2 && (int)barTimeLeft.TotalSeconds > var1)
- {
- if((int)barTimeLeft.TotalSeconds % 2 < 1 )//alternate colors every second
- {
- if(fType == FlashType.WholePanel)
- {
- SharpDX.RectangleF rect = new SharpDX.RectangleF(startPoint.X, startPoint.Y, endPoint.X - startPoint.X, endPoint.Y - startPoint.Y);
- RenderTarget.FillRectangle(rect, linearGradientBrush);
- }
- else if(fType == FlashType.ClockFaceOnly)
- {
- SharpDX.Vector2 lowerTextPoint = new SharpDX.Vector2(ChartPanel.X + 5, ChartPanel.Y + (ChartPanel.H - textLayout1.Metrics.Height));
- SharpDX.RectangleF rect = new SharpDX.RectangleF(upperTextPoint.X, upperTextPoint.Y, textLayout1.Metrics.Width, textLayout1.Metrics.Height);
- RenderTarget.FillRectangle(rect, linearGradientBrush);
- RenderTarget.DrawTextLayout(upperTextPoint, textLayout1, textBrushDx, SharpDX.Direct2D1.DrawTextOptions.NoSnap);
- }
- else if(fType == FlashType.TextOnly)
- {
- RenderTarget.DrawTextLayout(upperTextPoint, textLayout1, linearGradientBrush, SharpDX.Direct2D1.DrawTextOptions.NoSnap);
- }
- }
- }
- linearGradientBrush.Dispose();
- textBrushDx.Dispose();
- textFormat1.Dispose();
- textLayout1.Dispose();
- }
- private bool DisplayTime()
- {
- return ChartControl != null
- && Bars != null
- && Bars.Instrument.MarketData != null;
- }
- private void OnTimerTick(object sender, EventArgs e)
- {
- ForceRefresh();
- if (DisplayTime())
- {
- if (timer != null && !timer.IsEnabled)
- timer.IsEnabled = true;
- if (connected)
- {
- if (SessionIterator.IsInSession(Now, false, true))
- {
- if (hasRealtimeData)
- {
- barTimeLeft = Bars.GetTime(Bars.Count - 1).Subtract(Now);
- if (dType == DisplayType.LapsedTimeOnly)
- timeLeft = (barTimeLeft.Ticks < 0
- ? "00:00:00"
- : barTimeLeft.Hours.ToString("00") + ":" + barTimeLeft.Minutes.ToString("00") + ":" + barTimeLeft.Seconds.ToString("00"));
- if (dType == DisplayType.ClockOnly)
- timeLeft = Now.ToString("T");
- if (dType == DisplayType.All)
- timeLeft = Now.ToString("T")+ "\n[" + (barTimeLeft.Ticks < 0
- ? "00:00:00"
- : barTimeLeft.Hours.ToString("00") + ":" + barTimeLeft.Minutes.ToString("00") + ":" + barTimeLeft.Seconds.ToString("00")+"]");
- RemoveDrawObject("NinjaScriptInfo");
- }
- else
- Draw.TextFixed(this, "NinjaScriptInfo", NinjaTrader.Custom.Resource.BarTimerWaitingOnDataError, TextPosition.BottomRight);
- }
- else
- Draw.TextFixed(this, "NinjaScriptInfo", NinjaTrader.Custom.Resource.BarTimerSessionTimeError, TextPosition.BottomRight);
- }
- else
- {
- Draw.TextFixed(this, "NinjaScriptInfo", NinjaTrader.Custom.Resource.BarTimerDisconnectedError, TextPosition.BottomRight);
- if (timer != null)
- timer.IsEnabled = false;
- }
- if(fType != FlashType.None && (int)barTimeLeft.TotalSeconds < var2 && (int)barTimeLeft.TotalSeconds > var1)
- {
- ForceRefresh();
- }
- }
- }
- private SessionIterator SessionIterator
- {
- get
- {
- if (sessionIterator == null)
- sessionIterator = new SessionIterator(Bars);
- return sessionIterator;
- }
- }
- private DateTime Now
- {
- get
- {
- now = (Cbi.Connection.PlaybackConnection != null ? Cbi.Connection.PlaybackConnection.Now : Core.Globals.Now);
- if (now.Millisecond > 0)
- now = Core.Globals.MinDate.AddSeconds((long)Math.Floor(now.Subtract(Core.Globals.MinDate).TotalSeconds));
- return now;
- }
- }
- #region Properties
- [Range(1, int.MaxValue), NinjaScriptProperty]
- [Display(GroupName = "Parameters", Description="Duration of alert.")]
- public int AlertDuration
- { get; set; }
- [Range(1, int.MaxValue), NinjaScriptProperty]
- [Display(GroupName = "Parameters", Description="Alert start.")]
- public int Alert
- { get; set; }
- [Display(GroupName = "Parameters", Description="Clock and Timer Font.")]
- public SimpleFont TextFont
- {
- get { return textFont; }
- set { textFont = value; }
- }
- [Display(GroupName = "Parameters", Description="Show lapsed time only or with Actual time.")]
- public DisplayType DType
- {
- get { return dType; }
- set { dType = value; }
- }
- [Display(GroupName = "Parameters", Description="Select Clock Face or Whole Panel.\nNone disables flashing.")]
- public FlashType FType
- {
- get { return fType; }
- set { fType = value; }
- }
- [NinjaScriptProperty]
- [Display(Name="Sound", Order=1, GroupName="Parameters")]
- public bool Sound
- { get; set; }
- [XmlIgnore]
- [Display(ResourceType = typeof(Custom.Resource), Name = "TextColor", GroupName = "Parameters")]
- public System.Windows.Media.Brush TextBrush
- {
- get { return textBrush; }
- set { textBrush = value; }
- }
- [Browsable(false)]
- public string TextBrushSerialize
- {
- get { return Serialize.BrushToString(TextBrush); }
- set { TextBrush = Serialize.StringToBrush(value); }
- }
- #endregion
- }
- }
- public enum DisplayType
- {
- All,LapsedTimeOnly,ClockOnly
- }
- public enum FlashType
- {
- None,
- WholePanel,
- ClockFaceOnly,
- TextOnly
- }
- #region NinjaScript generated code. Neither change nor remove.
- namespace NinjaTrader.NinjaScript.Indicators
- {
- public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
- {
- private BarTimerFlashFusion[] cacheBarTimerFlashFusion;
- public BarTimerFlashFusion BarTimerFlashFusion(int alertDuration, int alert, bool sound)
- {
- return BarTimerFlashFusion(Input, alertDuration, alert, sound);
- }
- public BarTimerFlashFusion BarTimerFlashFusion(ISeries<double> input, int alertDuration, int alert, bool sound)
- {
- if (cacheBarTimerFlashFusion != null)
- for (int idx = 0; idx < cacheBarTimerFlashFusion.Length; idx++)
- if (cacheBarTimerFlashFusion[idx] != null && cacheBarTimerFlashFusion[idx].AlertDuration == alertDuration && cacheBarTimerFlashFusion[idx].Alert == alert && cacheBarTimerFlashFusion[idx].Sound == sound && cacheBarTimerFlashFusion[idx].EqualsInput(input))
- return cacheBarTimerFlashFusion[idx];
- return CacheIndicator<BarTimerFlashFusion>(new BarTimerFlashFusion(){ AlertDuration = alertDuration, Alert = alert, Sound = sound }, input, ref cacheBarTimerFlashFusion);
- }
- }
- }
- namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
- {
- public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
- {
- public Indicators.BarTimerFlashFusion BarTimerFlashFusion(int alertDuration, int alert, bool sound)
- {
- return indicator.BarTimerFlashFusion(Input, alertDuration, alert, sound);
- }
- public Indicators.BarTimerFlashFusion BarTimerFlashFusion(ISeries<double> input , int alertDuration, int alert, bool sound)
- {
- return indicator.BarTimerFlashFusion(input, alertDuration, alert, sound);
- }
- }
- }
- namespace NinjaTrader.NinjaScript.Strategies
- {
- public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
- {
- public Indicators.BarTimerFlashFusion BarTimerFlashFusion(int alertDuration, int alert, bool sound)
- {
- return indicator.BarTimerFlashFusion(Input, alertDuration, alert, sound);
- }
- public Indicators.BarTimerFlashFusion BarTimerFlashFusion(ISeries<double> input , int alertDuration, int alert, bool sound)
- {
- return indicator.BarTimerFlashFusion(input, alertDuration, alert, sound);
- }
- }
- }
- #endregion
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement