//
// Copyright (C) 2019, 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.DrawingTools;
#endregion
// This namespace holds indicators in this folder and is required. Do not change it.
namespace NinjaTrader.NinjaScript.Indicators
{
/// <summary>
/// Volume is simply the number of shares (or contracts) traded during a specified time frame (e.g. hour, day, week, month, etc).
/// </summary>
public class VolLoBo : Indicator
{
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = Custom.Resource.NinjaScriptIndicatorDescriptionVOL;
Name = "VolLoBo";
BarsRequiredToPlot = 0;
Calculate = Calculate.OnEachTick;
DrawOnPricePanel = false;
IsSuspendedWhileInactive = true;
AddPlot(new Stroke(Brushes.DodgerBlue, 2), PlotStyle.Bar, Custom.Resource.VOLVolume);
AddLine(Brushes.DarkGray, 0, Custom.Resource.NinjaScriptIndicatorZeroLine);
VolRelev1 = 100; // added
ColorVolRel1 = Brushes.Green; // added
VolRelev2 = 200; // added
ColorVolRel2 = Brushes.Red; // added
}
else if (State == State.Historical)
{
if (Calculate == Calculate.OnPriceChange)
{
Draw.TextFixed(this, "NinjaScriptInfo", string.Format(Custom.Resource.NinjaScriptOnPriceChangeError, Name), TextPosition.BottomRight);
Log(string.Format(Custom.Resource.NinjaScriptOnPriceChangeError, Name), LogLevel.Error);
}
}
}
protected override void OnBarUpdate()
{
Value[0] = Instrument.MasterInstrument.InstrumentType == InstrumentType.CryptoCurrency ? Core.Globals.ToCryptocurrencyVolume((long)Volume[0]) : Volume[0];
if (Value[0] >= VolRelev1) // added
{
PlotBrushes[0][0] = ColorVolRel1; // added
}
if (Value[0] >= VolRelev2) // added
{
PlotBrushes[0][0] = ColorVolRel2; // added
}
}
[NinjaScriptProperty] // added
[Range(1, int.MaxValue)]
[Display(Name="Volumen Relevante", Description="Set the trigger level for color change", Order=1, GroupName="Detection")]
public int VolRelev1
{ get; set; }
[Display(Name="Super Volumen", Description="Set the trigger level for color change", Order=3, GroupName="Detection")]
public int VolRelev2
{ get; set; }
[Display(Name="Color V. Relevante", Description="Color of the triggered volume", Order=2, GroupName="Detection")]
public Brush ColorVolRel1
{ get; set; }
[Browsable(false)]
public string ColorVolRel1Serializable
{
get { return Serialize.BrushToString(ColorVolRel1); }
set { ColorVolRel1 = Serialize.StringToBrush(value); }
}
[Display(Name="Color Super Volumen", Description="Color of the triggered volume", Order=4, GroupName="Detection")]
public Brush ColorVolRel2
{ get; set; }
[Browsable(false)]
public string ColorVolRel2Serializable
{
get { return Serialize.BrushToString(ColorVolRel2); }
set { ColorVolRel2 = Serialize.StringToBrush(value); }
}
}
}
#region NinjaScript generated code. Neither change nor remove.
namespace NinjaTrader.NinjaScript.Indicators
{
public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
{
private VolLoBo[] cacheVolLoBo;
public VolLoBo VolLoBo(int volRelev1)
{
return VolLoBo(Input, volRelev1);
}
public VolLoBo VolLoBo(ISeries<double> input, int volRelev1)
{
if (cacheVolLoBo != null)
for (int idx = 0; idx < cacheVolLoBo.Length; idx++)
if (cacheVolLoBo[idx] != null && cacheVolLoBo[idx].VolRelev1 == volRelev1 && cacheVolLoBo[idx].EqualsInput(input))
return cacheVolLoBo[idx];
return CacheIndicator<VolLoBo>(new VolLoBo(){ VolRelev1 = volRelev1 }, input, ref cacheVolLoBo);
}
}
}
namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
{
public Indicators.VolLoBo VolLoBo(int volRelev1)
{
return indicator.VolLoBo(Input, volRelev1);
}
public Indicators.VolLoBo VolLoBo(ISeries<double> input , int volRelev1)
{
return indicator.VolLoBo(input, volRelev1);
}
}
}
namespace NinjaTrader.NinjaScript.Strategies
{
public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
{
public Indicators.VolLoBo VolLoBo(int volRelev1)
{
return indicator.VolLoBo(Input, volRelev1);
}
public Indicators.VolLoBo VolLoBo(ISeries<double> input , int volRelev1)
{
return indicator.VolLoBo(input, volRelev1);
}
}
}
#endregion
As in the picture I'm trying to draw rectangles in candle wicks where volume bars (in green) have the variable conditions, in ther red candle the rectangle will be in lowest and close price, and in the green candle the rectangle will be in the highest and close price.
Thanks in advance.

Comment