Time Category Message
5/13/2016 11:04:58 AM Default Market analyzer column 'MyStates': Error on calling 'OnMarketData' method on bar 49: Write lock may not be acquired with read lock held. This pattern is prone to deadlocks. Please ensure that read locks are released before taking a write lock. If an upgrade is necessary, use an upgrade lock in place of the read lock.
Time Category Message
5/13/2016 11:04:58 AM Default A hosted indicator tried to load additional data. All data must first be loaded by the hosting NinjaScript in its configure state.
#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;
#endregion
//This namespace holds MarketAnalyzerColumns in this folder and is required. Do not change it.
namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
public class MyStates : MarketAnalyzerColumn
{
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Enter the description for your new custom Market Analyzer Column here.";
Name = "MyStates";
Calculate = Calculate.OnEachTick;
}
else if (State == State.Configure)
{
}
}
protected override void OnMarketData(Data.MarketDataEventArgs marketDataUpdate)
{
if (marketDataUpdate.IsReset)
CurrentText = "NO DATA";
else if (marketDataUpdate.MarketDataType == Data.MarketDataType.Ask)
CurrentValue = STSVer2().currentState[0];
}
}
}
#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
{
static class bounceStates
{
public const string wait4longpullback="wait4longpullback";
public const string watch4longbounce="watch4longbounce";
public const string wait4shortpullback="wait4shortpullback";
public const string watchforshortbounce="watchforshortbounce";
}
public class STSVer2 : Indicator
{
private DateTime first100barhigh,first100barlow,previouslast100barhigh,previouslast100barlow;
private bool firstLongBO, firstShortBO=false;
public string currentState="STARTED";
private Series<string> direction;
private Series<string> bouncestate;
private const string DIR_LONG ="LONG";
private const string DIR_SHORT ="SHORT";
//const enum bounceStates{wait4longpullback=1,watch4longbounce=2, wait4shortpullback=3,watchforshortbounce};
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Enter the description for your new custom Indicator here.";
Name = "STSVer2";
Calculate = Calculate.OnEachTick;
IsOverlay = false;
DisplayInDataBox = true;
DrawOnPricePanel = true;
DrawHorizontalGridLines = true;
DrawVerticalGridLines = true;
PaintPriceMarkers = true;
ScaleJustification = NinjaTrader.Gui.Chart.ScaleJustification.Right;
//Disable this property if your indicator requires custom values that cumulate with each new market data event.
//See Help Guide for additional information.
IsSuspendedWhileInactive = true;
MaximumBarsLookBack = MaximumBarsLookBack.Infinite;
}
else if (State == State.Historical)
{
// Syncs a Series object to the primary bar object
}
else if (State == State.Configure)
{
// Add a 5 minute Bars object - BarsInProgress index = 1
AddDataSeries(BarsPeriodType.Minute, 30);
AddDataSeries(BarsPeriodType.Tick, 1);
direction = new Series<string>(BarsArray[0]);
bouncestate = new Series<string>(BarsArray[0]);
}
}
protected override void OnBarUpdate()
{
//Add your custom indicator logic here
if (BarsInProgress > 0)
return;
if(CurrentBar<200)
return;
try
{
//Print("Got here1");
if((CrossAbove(High,DonchianChannel(100).Upper[1],1)) && direction[0] !=DIR_LONG)
{
direction[0] =DIR_LONG;
bouncestate[0]=bounceStates.wait4longpullback;
Print(Instrument.FullName + "Got first Donchian high BO" + Times[0].ToString()+ CurrentBar);
}
if((CrossBelow(Low,DonchianChannel(100).Lower[1],1)) && direction[0] !=DIR_SHORT)
{
direction[0] =DIR_SHORT;
Print(Instrument.FullName + "Got first Donchian low BO" + Times[0].ToString() + CurrentBar );
bouncestate[0]=bounceStates.wait4shortpullback;
}
Print(DateTime.Now + direction[0]);
if(IsFirstTickOfBar){
direction[0]=direction[1];
bouncestate[0]=bouncestate[1];
}
switch(bouncestate[0]){
case bounceStates.wait4longpullback:
if(Closes[2][0]<Closes[1][1])
{
bouncestate[0]=bounceStates.watch4longbounce;
}
break;
case bounceStates.wait4shortpullback:
if(Closes[2][0]>Closes[1][1])
{
bouncestate[0]=bounceStates.watchforshortbounce;
}
break;
case bounceStates.watch4longbounce:
// if(Closes[2][0]>Closes[1][1])
// {
// bouncestate[0]=bounceStates.watchforshortbounce.ToString();
// }
break;
case bounceStates.watchforshortbounce:
break;
}
switch (State)
{
case State.Historical:
break;
case State.Realtime:
break;
}
}
catch (Exception eX)
{
PrintTo = PrintTo.OutputTab1;
Print("Exception " + eX.StackTrace);
}
}
#region Properties
[Browsable(true)]
[XmlIgnore]
public Series<string> MarketDirection
{
get { return direction; }
}
public Series<string> BounceState
{
get { return bouncestate; }
}
#endregion
}
}
#region NinjaScript generated code. Neither change nor remove.
namespace NinjaTrader.NinjaScript.Indicators
{
public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
{
private STSVer2[] cacheSTSVer2;
public STSVer2 STSVer2()
{
return STSVer2(Input);
}
public STSVer2 STSVer2(ISeries<double> input)
{
if (cacheSTSVer2 != null)
for (int idx = 0; idx < cacheSTSVer2.Length; idx++)
if (cacheSTSVer2[idx] != null && cacheSTSVer2[idx].EqualsInput(input))
return cacheSTSVer2[idx];
return CacheIndicator<STSVer2>(new STSVer2(), input, ref cacheSTSVer2);
}
}
}
namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
{
public Indicators.STSVer2 STSVer2()
{
return indicator.STSVer2(Input);
}
public Indicators.STSVer2 STSVer2(ISeries<double> input )
{
return indicator.STSVer2(input);
}
}
}
namespace NinjaTrader.NinjaScript.Strategies
{
public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
{
public Indicators.STSVer2 STSVer2()
{
return indicator.STSVer2(Input);
}
public Indicators.STSVer2 STSVer2(ISeries<double> input )
{
return indicator.STSVer2(input);
}
}
}
#endregion

Comment