Esta seção visa apresentar trechos de códigos com funcionalidades relativas à localização temporal da estratégia. Por exemplo, identificar se a atual barra é a primeira barra do dia para verificar gap diário.
Você pode acessar os Snippets diretamente pelo menu lateral direito, ou fazendo CTRL+F (CTRL+L) para localizar algum texto específico na página, uma vez que o conteúdo tende a crescer ao longo do tempo, dificultando a navegação pelo menu.
Caso tenham sugestões de código para acrescentar à lista, gentileza deixar o código nos comentários com o link para seu perfil em rede social (para devido crédito de autoria).
Snippets
Identificação de primeira barra da sessão ou do dia
Algumas estratégias necessitam da identificação da primeira barra do dia ou da primeira barra da sessão de negociação atual para executar determinada ação ou calcular o gap em relação ao fechamento da sessão anterior. Segue abaixo um trecho de código para identificar essas barras.
namespace NinjaTrader.NinjaScript.Indicators
{
public class NTB_Ex_FirstSessionBar : Indicator
{
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"NeoTraderBot Example: How to locate first bar of Session or Day";
Name = "NTB_Ex_FirstSessionBar";
Calculate = Calculate.OnBarClose;
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;
}
}
protected override void OnBarUpdate()
{
// Uncomment line below if you want to locate the first bar of the day
//if (Time[0].Date != Time[1].Date)
// Uncomment line below if you want to locate the first bar of the session
if (Bars.IsFirstBarOfSession)
{
DateTime datahora = Time[0];
NinjaTrader.Code.Output.Process("[" + datahora.ToString() + "] - The bar was located!", PrintTo.OutputTab1);
BackBrushes[0] = Brushes.Blue;
}
}
}
}
Identificação do primeiro tick de uma barra
Algumas estratégias podem necessitar de uma atuação mais tempestiva, porém, o programador gostaria de selecionar quais ações seria executadas no tick e quais seriam no fechamento da barra. Para isso, podemos criar um NinjaScript com a propriedade de cálculo configurada em Calculate.OnEachTick, e filtrar nas chamadas ao método OnBarUpdate o primeiro tick da barra, sinalizando o fechamento da barra anterior.
Assim temos liberdade para programar o NinjaScript para executar ações tanto no fechamento da barra quanto durante a formação de uma barra. Veja o código de exemplo abaixo:
namespace NinjaTrader.NinjaScript.Indicators
{
public class NTB_Ex_FirstTickOfBar : Indicator
{
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"NeoTraderBot Example: How to locate first bar of Session or Day";
Name = "NTB_Ex_FirstTickOfBar";
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;
}
}
protected override void OnBarUpdate()
{
if ( IsFirstTickOfBar)
{
Draw.Text(this,"teste","Primeiro Tick!",0,Close[0]);
}
else Draw.Text(this,"teste","Outros Ticks!",0,Close[0]);
}
}
}
Identificação de barra por data e hora específicos
Este código localiza a barra (candle ou box) por uma data e hora desejados. Onde a hora é referente ao horário de abertura do candle desejado.
Observe que criamos um parâmetro no qual o usuário pode inserir um horário para facilitar os testes. O código pode tanto colorir o fundo da barra no horário especificado no dia atual ou nesse mesmo horário em todos os dias de negociação.
namespace NinjaTrader.NinjaScript.Indicators
{
public class NTB_Ex_DateTime : Indicator
{
public TimeSpan TimeOfDay;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"NeoTraderBot Example: How to find bars at specific Time or DateTime";
Name = "NTB_Ex_DateTime";
Calculate = Calculate.OnBarClose;
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;
DesiredDateTime = DateTime.Parse("10:31", System.Globalization.CultureInfo.InvariantCulture);
}
else if (State == State.Configure)
{
TimeOfDay = new TimeSpan(DesiredDateTime.Hour, DesiredDateTime.Minute, 0);
}
}
protected override void OnBarUpdate()
{
// Uncomment line below if you want to sign the bar at a specific time just for the current date
//if (Time[0] == DesiredDateTime)
// Uncomment line below if you want to sign the bar at a specific time each day
if (Time[0].TimeOfDay == TimeOfDay)
{
DateTime datahora = Time[0];
NinjaTrader.Code.Output.Process("[" + datahora.ToString() + "] - This is the desired bar!", PrintTo.OutputTab1);
BackBrushes[0] = Brushes.Blue;
}
}
#region Properties
[NinjaScriptProperty]
[PropertyEditor("NinjaTrader.Gui.Tools.TimeEditorKey")]
[Display(Name="DesiredDateTime", Order=1, GroupName="Parameters")]
public DateTime DesiredDateTime
{ get; set; }
#endregion
}
}