Neo traderBot

Neo traderBot

Você sabia?

Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!

Snippets e How-to

Tutoriais sobre Estrutura de Código

Leitura estimada: 11 minutos 184 views

Introdução

Esta seção visa apresentar trechos de códigos com funcionalidades relativas à estrutura do código de indicadores e estratégias. Por exemplo, como criar parâmetros de entrada.

Você pode acessar os Snippets/Tutoriais 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/Tutoriais

Como criar parâmetros no meu indicador/estratégia?

Reproduzir vídeo

Os parâmetros de uma estratégia ou indicador são declarados como atributos da classe.

O que diferencia esses atributos dos demais atributos são as anotações (em C# chama-se Annotations e são contidas entre [ ]) que realizamos imediatamente antes da definição dos atributos. Vamos ver abaixo como criar diferentes tipos de parâmetros, como definir seu valor padrão, qual texto será exibido na interface de configuração da estratégia/indicador e pré-validações.

Os tipos de parâmetros possíveis em NinjaScript são: bool, int, double, string, DateTime e Brush. Ainda é possível utilizar eNum renderizando em formato de dropdown na GUI (veremos mais detalhes no exemplo completo).

A primeira anotação que realizamos é [NinjaScriptProperty]. Esta anotação irá informar ao pré-processador que no momento da compilação que o atributo deve ser exibido na interface de configuração do Indicador ou estratégia como parâmetro.

 

A segunda anotação que pode ser utilizada é um validador [Range()]. A função Range permite definir o valor mínimo e máximo no caso de parâmetros do tipo inteiro e double, permitindo a validação do valor inserido pela interface gráfica. No caso de parâmetros de data ou horário (DateTime), ao invés de utilizarmos Range, podemos fazer a anotação [PropertyEditor(“NinjaTrader.Gui.Tools.DateTimeEditorKey”)], onde “DateTimeEditorKey” será usado quando você quiser renderizar um seletor de datas e “TimeEditorKey” caso deseje-se renderizar um seletor de horário.

A terceira anotação é a chamada a função Display, que nos permitirá atribuir um nome ao parâmetro na interface gráfica, juntamente com um texto a ser apresentado como Tooltip (ou seja, quando o mouse passar sobre o nome do parâmetro), a ordem de exibição e o grupo no qual o parâmetro será exibido na tela de configuração.

Os valores padrão dos parâmetros devem ser definidos no estado SetDefaults quando chamado o método OnStateChange.

 

Veja a seguir alguns exemplos de definição de parâmetros para estratégia:

Parâmetro Inteiro (Exemplo: Qtde de períodos de uma média móvel)

No código abaixo a tela de configuração da estratégia/indicador apresentará como segundo parâmetro do grupo “Setup (by NeoTraderBot)” a ser definido a “Média rápida – Qtde de periodos” que é do tipo numérico e inteiro, variando entre 1 e o maior valor inteiro possível.

				
							[NinjaScriptProperty]
		[Range(1, int.MaxValue)]
		[Display(Name="Periods", Description="Number of period for MA", Order=2, GroupName="Setup (by NeoTraderBot)")]
		public int period
		{ get; set; }
				
			
Parâmetro Brush (Paleta de cores)

No código abaixo a tela de configuração da estratégia/indicador apresentará como segundo parâmetro do grupo “Appereance (by NeoTraderBot)” a ser definido o texto “Plot color”, que apresentará em uma caixa de seleção de paleta de cor. Observe a existência da anotação XmlIgnore, cujo propósito é evitar a serialização desse parâmetro ao salvar um template do indicador, pois isto poderia gerar erro na plataforma (esta anotação é incluída automaticamente pelo NinjaScript Wizard).

				
							[NinjaScriptProperty]
		[XmlIgnore]
		[Display(Name="Plot color", Description="Example how to use brush as a parameter", Order=2, GroupName="Appearence (by NeoTraderBot)")]
		public Brush plotColor
		{ get; set; }
				
			
Código de um indicador com TODOS os tipos de parâmetros em NinjaScript

No código abaixo você encontrará um exemplo de um indicador com todos os tipos de parâmetros possíveis em NinjaScript.

				
					#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
{
	[Gui.CategoryOrder("Setup (by NeoTraderBot)", 1)]
	[Gui.CategoryOrder("Trading intervals (by NeoTraderBot)", 2)]
	[Gui.CategoryOrder("Appearence (by NeoTraderBot)", 3)]		
	public class _NTB_UserDefinedParameters : Indicator
	{
		protected override void OnStateChange()
		{
			if (State == State.SetDefaults)
			{
				Description									= @"Just a demonstration on how to include User Defined Parameters";
				Name										= "_NTB_UserDefinedParameters";
				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;
				
				avgType					= NeoTraderBot.MAType.SMA;
				period					= 9;
				percBand				= 2.0;
				msg						= @"Example of a msg to display on the chart!";
				daytradingMode			= true;
				DontTradeOn				= DateTime.Now;
				TradingStartAfter		= DateTime.Parse("09:00", System.Globalization.CultureInfo.InvariantCulture);
				TradingCloseAt			= DateTime.Parse("12:00", System.Globalization.CultureInfo.InvariantCulture);				
				plotColor				= Brushes.Orange;
				
			}
			else if (State == State.Configure)
			{
			}
		}

		protected override void OnBarUpdate()
		{
			//Add your custom indicator logic here.
		}

		#region Properties
		[Display(Name="MA Type", Description="Example of Dropbox parameter with enum", Order=1, GroupName="Setup (by NeoTraderBot)")]
		public NeoTraderBot.MAType avgType
		{ get; set; }	
		
		[NinjaScriptProperty]
		[Range(1, int.MaxValue)]
		[Display(Name="Periods", Description="Number of period for MA", Order=2, GroupName="Setup (by NeoTraderBot)")]
		public int period
		{ get; set; }

		[NinjaScriptProperty]
		[Range(1, double.MaxValue)]
		[Display(Name="% band around VWAP", Description="Just an example of double parameter", Order=3, GroupName="Setup (by NeoTraderBot)")]
		public double percBand
		{ get; set; }

		[NinjaScriptProperty]
		[Display(Name="Enable Daytrading mode", Order=4, GroupName="Setup (by NeoTraderBot)")]
		public bool daytradingMode
		{ get; set; }


		[NinjaScriptProperty]
		[PropertyEditor("NinjaTrader.Gui.Tools.DateTimeEditorKey")]
		[Display(Name="Dont Trade on", Description="Just an example of Date parameter", Order=1, GroupName="Trading intervals (by NeoTraderBot)")]
		public DateTime DontTradeOn
		{ get; set; }		
		
		[NinjaScriptProperty]
		[PropertyEditor("NinjaTrader.Gui.Tools.TimeEditorKey")]
		[Display(Name="Start trading after", Description="Time after the strategy will start to trade", Order=2, GroupName="Trading intervals (by NeoTraderBot)")]
		public DateTime TradingStartAfter
		{ get; set; }
		
		[NinjaScriptProperty]
		[PropertyEditor("NinjaTrader.Gui.Tools.TimeEditorKey")]
		[Display(Name="Trading close at", Description="Time at the strategy will stop trading and close open positions", Order=3, GroupName="Trading intervals (by NeoTraderBot)")]
		public DateTime TradingCloseAt
		{ get; set; }		


		
		
		[NinjaScriptProperty]
		[Display(Name="Display message", Description="Just an example of string parameter", Order=1, GroupName="Appearence (by NeoTraderBot)")]
		public string msg
		{ get; set; }		
		
		[NinjaScriptProperty]
		[XmlIgnore]
		[Display(Name="Plot color", Description="Example how to use brush as a parameter", Order=2, GroupName="Appearence (by NeoTraderBot)")]
		public Brush plotColor
		{ get; set; }

		[Browsable(false)]
		public string Teste6Serializable
		{
			get { return Serialize.BrushToString(plotColor); }
			set { plotColor = Serialize.StringToBrush(value); }
		}			
		#endregion

	}
}

namespace NeoTraderBot
{
	public enum MAType
	{
		SMA,
		EMA,
		WMA,
	}
}

#region NinjaScript generated code. Neither change nor remove.

namespace NinjaTrader.NinjaScript.Indicators
{
	public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
	{
		private _NTB_UserDefinedParameters[] cache_NTB_UserDefinedParameters;
		public _NTB_UserDefinedParameters _NTB_UserDefinedParameters(int period, double percBand, bool daytradingMode, DateTime dontTradeOn, DateTime tradingStartAfter, DateTime tradingCloseAt, string msg, Brush plotColor)
		{
			return _NTB_UserDefinedParameters(Input, period, percBand, daytradingMode, dontTradeOn, tradingStartAfter, tradingCloseAt, msg, plotColor);
		}

		public _NTB_UserDefinedParameters _NTB_UserDefinedParameters(ISeries<double> input, int period, double percBand, bool daytradingMode, DateTime dontTradeOn, DateTime tradingStartAfter, DateTime tradingCloseAt, string msg, Brush plotColor)
		{
			if (cache_NTB_UserDefinedParameters != null)
				for (int idx = 0; idx < cache_NTB_UserDefinedParameters.Length; idx++)
					if (cache_NTB_UserDefinedParameters[idx] != null && cache_NTB_UserDefinedParameters[idx].period == period && cache_NTB_UserDefinedParameters[idx].percBand == percBand && cache_NTB_UserDefinedParameters[idx].daytradingMode == daytradingMode && cache_NTB_UserDefinedParameters[idx].DontTradeOn == dontTradeOn && cache_NTB_UserDefinedParameters[idx].TradingStartAfter == tradingStartAfter && cache_NTB_UserDefinedParameters[idx].TradingCloseAt == tradingCloseAt && cache_NTB_UserDefinedParameters[idx].msg == msg && cache_NTB_UserDefinedParameters[idx].plotColor == plotColor && cache_NTB_UserDefinedParameters[idx].EqualsInput(input))
						return cache_NTB_UserDefinedParameters[idx];
			return CacheIndicator<_NTB_UserDefinedParameters>(new _NTB_UserDefinedParameters(){ period = period, percBand = percBand, daytradingMode = daytradingMode, DontTradeOn = dontTradeOn, TradingStartAfter = tradingStartAfter, TradingCloseAt = tradingCloseAt, msg = msg, plotColor = plotColor }, input, ref cache_NTB_UserDefinedParameters);
		}
	}
}

namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
	public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
	{
		public Indicators._NTB_UserDefinedParameters _NTB_UserDefinedParameters(int period, double percBand, bool daytradingMode, DateTime dontTradeOn, DateTime tradingStartAfter, DateTime tradingCloseAt, string msg, Brush plotColor)
		{
			return indicator._NTB_UserDefinedParameters(Input, period, percBand, daytradingMode, dontTradeOn, tradingStartAfter, tradingCloseAt, msg, plotColor);
		}

		public Indicators._NTB_UserDefinedParameters _NTB_UserDefinedParameters(ISeries<double> input , int period, double percBand, bool daytradingMode, DateTime dontTradeOn, DateTime tradingStartAfter, DateTime tradingCloseAt, string msg, Brush plotColor)
		{
			return indicator._NTB_UserDefinedParameters(input, period, percBand, daytradingMode, dontTradeOn, tradingStartAfter, tradingCloseAt, msg, plotColor);
		}
	}
}

namespace NinjaTrader.NinjaScript.Strategies
{
	public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
	{
		public Indicators._NTB_UserDefinedParameters _NTB_UserDefinedParameters(int period, double percBand, bool daytradingMode, DateTime dontTradeOn, DateTime tradingStartAfter, DateTime tradingCloseAt, string msg, Brush plotColor)
		{
			return indicator._NTB_UserDefinedParameters(Input, period, percBand, daytradingMode, dontTradeOn, tradingStartAfter, tradingCloseAt, msg, plotColor);
		}

		public Indicators._NTB_UserDefinedParameters _NTB_UserDefinedParameters(ISeries<double> input , int period, double percBand, bool daytradingMode, DateTime dontTradeOn, DateTime tradingStartAfter, DateTime tradingCloseAt, string msg, Brush plotColor)
		{
			return indicator._NTB_UserDefinedParameters(input, period, percBand, daytradingMode, dontTradeOn, tradingStartAfter, tradingCloseAt, msg, plotColor);
		}
	}
}

#endregion

				
			

Quando é chamado o método OnBarUpdate?

Reproduzir vídeo

Como criar estratégias/indicadores em múltiplos tempos gráficos (MTF)?

O código de exemplo abaixo apresenta um exemplo completo para você criar indicadores e estratégias em múltiplos tempos gráficos. Assista ao vídeo acima para entender o passo a passo da estruturação de um código MTF (multi Timeframe).

				
					#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.Indicators;
using NinjaTrader.NinjaScript.DrawingTools;
#endregion

//This namespace holds Strategies in this folder and is required. Do not change it. 
namespace NinjaTrader.NinjaScript.Strategies
{
	public class MTF_ExemploNeoTraderBot : Strategy
	{
		protected override void OnStateChange()
		{
			if (State == State.SetDefaults)
			{
				Description									= @"Example of NeoTraderBot";
				Name										= "MTF_ExemploNeoTraderBot";
				Calculate									= Calculate.OnBarClose;
				EntriesPerDirection							= 1;
				EntryHandling								= EntryHandling.AllEntries;
				IsExitOnSessionCloseStrategy				= true;
				ExitOnSessionCloseSeconds					= 30;
				IsFillLimitOnTouch							= false;
				MaximumBarsLookBack							= MaximumBarsLookBack.TwoHundredFiftySix;
				OrderFillResolution							= OrderFillResolution.Standard;
				Slippage									= 0;
				StartBehavior								= StartBehavior.WaitUntilFlat;
				TimeInForce									= TimeInForce.Gtc;
				TraceOrders									= false;
				RealtimeErrorHandling						= RealtimeErrorHandling.StopCancelClose;
				StopTargetHandling							= StopTargetHandling.PerEntryExecution;
				BarsRequiredToTrade							= 20;
				// Disable this property for performance gains in Strategy Analyzer optimizations
				// See the Help Guide for additional information
				IsInstantiatedOnEachOptimizationIteration	= true;
				
				AddPlot(new Stroke(Brushes.White, DashStyleHelper.Dash, 1), PlotStyle.Line, "EMA_CHART");
				AddPlot(new Stroke(Brushes.Yellow, DashStyleHelper.Solid, 1), PlotStyle.Line, "EMA_5MIN");
				AddPlot(new Stroke(Brushes.Blue, DashStyleHelper.Dash, 2), PlotStyle.Line, "EMA_15MIN");
				AddPlot(new Stroke(Brushes.Orange, DashStyleHelper.Solid, 2), PlotStyle.Line, "EMA_60MIN");
				
				
			}
			else if (State == State.Configure)
			{
				AddDataSeries(BarsPeriodType.Minute, 5);
				AddDataSeries(BarsPeriodType.Minute, 15);
				AddDataSeries(BarsPeriodType.Minute, 60);
			}
		}

		protected override void OnBarUpdate()
		{
			if (CurrentBars[0] < BarsRequiredToPlot || CurrentBars[1] < BarsRequiredToPlot || CurrentBars[2] < BarsRequiredToPlot
				|| CurrentBars[3] < BarsRequiredToPlot)
				return;
			
			Values[0][0] = EMA(Closes[0], 20)[0];
			Values[1][0] = EMA(Closes[1], 20)[0];
			Values[2][0] = EMA(Closes[2], 20)[0];
			Values[3][0] = EMA(Closes[3], 20)[0];
			
			if (BarsInProgress == 2) 
				BackBrushes[0] = Brushes.Olive;
			
		}
	}
}

				
			

Leave a Comment

CONTENTS