Neo traderBot

Neo traderBot

Você sabia?

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

Docy

Snippets para Ordens e Administração de Trade

Leitura estimada: 7 minutos

Esta seção visa apresentar trechos de códigos com exemplos de envio de ordens e administração de trade utilizando técnicas de stoploss (fixo, móvel, breakeven) e take profit.

Você pode acessar os Snippets diretamente pelo menu lateral direito, ou fazendo CRL+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

Como rotear ordens a mercado, stop e limitada?

No código abaixo, você encontra um exemplo de estratégia que abre um posição em uma data/horário específicos. Assim, você poderá testar a abertura de posições por ordens a mercado, limitada ou stop.

O código possui parâmetros para quantidade, horario de encerramento da posição e lado da posição (comprado/vendido).

OBS: É importante ressaltar que uma vez apregoada uma ordem, ela permanecerá ativa e aguardando execução até que o usuário cancele. Não há um auto-gerenciamento de execução apenas para próxima barra como em outras plataformas.

				
					using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using Runtime.Script;
using TradeApi;
using TradeApi.History;
using TradeApi.Indicators;
using TradeApi.Instruments;
using TradeApi.ToolBelt;
using TradeApi.Trading;



namespace ExemplosNeoTraderBot
{
    /// <summary>
    /// Strategy1
    /// 
    /// </summary>
    public class NTB_ExemploRoteamentoOrdens : StrategyBuilder
    {
		private BarData dadosBarra;
		
        public NTB_ExemploRoteamentoOrdens()
            : base()
        {
			#region Initialization
            Credentials.Author = "NeoTraderBot";
            Credentials.Company = "NeoTraderBot";
            Credentials.Copyrights = "";
            Credentials.DateOfCreation = new DateTime(2023, 9, 5);
            Credentials.ExpirationDate = DateTime.MinValue;
            Credentials.Version = "";
            Credentials.Password = "66b4a6416f59370e942d353f08a9ae36";
            Credentials.ProjectName = "exemploOrdensBasicas";
            #endregion 


        }
        
        /// <summary>
        /// This function will be called after creating
        /// </summary>
		public override void Init()
		{
			dadosBarra = (HistoryDataSeries as BarData);
		}        
 
        /// <summary>
        /// Entry point. This function is called when new quote comes or new bar created
        /// </summary>
        public override void Update(TickStatus args)
        {
        	if (args == TickStatus.IsBar)
        	{
        		List<Position> listaPosicoes = PositionsManager.GetPositions();

        		//DATA E HORA PARA ABERTURA DE POSIÇÕES
        		DateTime horarioAbertura = new DateTime(2023, 09, 05, 09, 06, 0);
				DateTime horarioEncerramento = horarioAbertura.AddMinutes(10);
				
				//INFORMAÇÃO PARA ABERTURA DE POSIÇÕES
				OrderSide ladoOperacao = OrderSide.Sell;
				int quantidade = 1;
				double precoOrdemStop = 4977.5;
				double precoOrdemLimitada = 4982.5;
        		
				OrderRequest request = null;
				
				//CRIA ORDENS
        		if ((listaPosicoes.Count == 0) && (dadosBarra.GetTimeUtc(0).ToLocalTime() == horarioAbertura))
        		{
					// ORDEM A MERCADO
					//request = new OrderRequest(OrderType.Market, InstrumentsManager.Current, AccountManager.Current, ladoOperacao, quantidade);
            		
					// ORDEM LIMITADA
					//request = new OrderRequest(OrderType.Limit, InstrumentsManager.Current, AccountManager.Current, ladoOperacao, quantidade, precoOrdemLimitada);
        			
        			// ORDEM STOP
        			request = new OrderRequest(OrderType.Stop, InstrumentsManager.Current, AccountManager.Current, ladoOperacao, quantidade, null, precoOrdemStop);

	        		//ENVIA ORDENS PARA BROKER
	        		OrdersManager.Send(request);
        		}

				
				//CRIA ORDEM DE ENCERRAMENO A MERCADO        		
				if ((listaPosicoes.Count != 0) && (dadosBarra.GetTimeUtc(0).ToLocalTime() == horarioEncerramento))
        		{
					request = new OrderRequest(OrderType.Market, InstrumentsManager.Current, AccountManager.Current, (ladoOperacao == OrderSide.Buy) ? OrderSide.Sell : OrderSide.Buy, quantidade);
            		OrdersManager.Send(request);
        		} 

        	}
			
        }
        
        /// <summary>
        /// This function will be called before removing
        /// </summary>
		public override void Complete()
		{
			
		} 
     }
}

				
			

Como enviar uma ordem a mercado?

Para enviar uma ordem a mercado, é necessário criar uma requisição de ordem (OrderRequest) com a parametrização desejada e, em seguida, solicitar ao Gestor de ordens que envie essa ordem.

O envio de ordem pode ser feito de maneira síncrona ou assincrona. Na primeira forma (síncrona), o código fica aguardando o retorno da função Send. Já no envio assíncrono, o código continua sua execução e o programador fornece uma função callback para ser executada quando houver o resultado do envio da ordem.

Seguem abaixo exemplos de envio de ordens a mercado de compra e venda.

Ordem de compra a mercado (Envio síncrono)
				
					orderSize = 1;

OrderRequest request = new OrderRequest(OrderType.Market, 
                                        InstrumentsManager.Current,
                                        AccountManager.Current,
                                        OrderSide.Buy,
                                        orderSize);
OrdersManager.Send(request); 
				
			
Ordem de venda a mercado (Envio síncrono)
				
					orderSize = 1;

OrderRequest request = new OrderRequest(OrderType.Market, 
                                        InstrumentsManager.Current,
                                        AccountManager.Current,
                                        OrderSide.Sell,
                                        orderSize);
OrdersManager.Send(request); 
				
			

Como abrir uma posição com ordens OCO?

Gestão de risco é essencial para negociação de ativos. O exemplo abaixo demonstra como enviar um ordem de compra a mercado para abertura de posição, acompanhada das ordens de stoploss e alvo em termos de ticks. 

Ordem de compra a mercado com RG 3:1 e Stop de 30 ticks (Envio síncrono)
				
					using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using Runtime.Script;
using TradeApi;
using TradeApi.History;
using TradeApi.Indicators;
using TradeApi.Instruments;
using TradeApi.ToolBelt;
using TradeApi.Trading;



namespace ExemplosNeoTraderBot
{
    /// <summary>
    /// Strategy1
    /// 
    /// </summary>
    public class NTB_ExemploOrdemOCO : StrategyBuilder
    {
		private BarData dadosBarra;
		
        public NTB_ExemploOrdemOCO()
            : base()
        {
			#region Initialization
            Credentials.Author = "NeoTraderBot";
            Credentials.Company = "NeoTraderBot";
            Credentials.Copyrights = "";
            Credentials.DateOfCreation = new DateTime(2023, 9, 5);
            Credentials.ExpirationDate = DateTime.MinValue;
            Credentials.Version = "";
            Credentials.Password = "66b4a6416f59370e942d353f08a9ae36";
            Credentials.ProjectName = "exemploOrdensOCO";
            #endregion 


        }
        
        /// <summary>
        /// This function will be called after creating
        /// </summary>
		public override void Init()
		{
			dadosBarra = (HistoryDataSeries as BarData);
		}        
 
        /// <summary>
        /// Entry point. This function is called when new quote comes or new bar created
        /// </summary>
        public override void Update(TickStatus args)
        {
        	if (args == TickStatus.IsBar)
        	{
        		List<Position> listaPosicoes = PositionsManager.GetPositions();

        		//DATA E HORA PARA ABERTURA DE POSIÇÕES
        		DateTime horarioAbertura = new DateTime(2023, 09, 05, 09, 06, 0);
				DateTime horarioEncerramento = new DateTime(2023, 09, 05, 17, 00, 0);
				
				//INFORMAÇÃO PARA ABERTURA DE POSIÇÕES
				TradeResult ordem;				
				OrderSide ladoOperacao = OrderSide.Sell;
				int quantidade = 1;
				double stoplossTicks = 30;
				double takeProfitTicks = stoplossTicks*3;        		
				
				OrderRequest request = null;
				
				//CRIA ORDEM OCO
        		if ((listaPosicoes.Count == 0) && (dadosBarra.GetTimeUtc(0).ToLocalTime() == horarioAbertura))
        		{
					request = new OrderRequest(OrderType.Market,
					                                        InstrumentsManager.Current,
					                                        AccountManager.Current,
					                                        ladoOperacao, quantity: quantidade)
					{
						SLTPPriceType = SLTPPriceType.Ticks,
        				StopLossPrice = stoplossTicks,
						TakeProfitPrice = takeProfitTicks
					};
					
					//ENVIA ORDENS PARA BROKER
					ordem = OrdersManager.Send(request);

        		}

				
				//CRIA ORDEM DE ENCERRAMENO A MERCADO        		
				if ((listaPosicoes.Count != 0) && (dadosBarra.GetTimeUtc(0).ToLocalTime() == horarioEncerramento))
        		{
					request = new OrderRequest(OrderType.Market, InstrumentsManager.Current, AccountManager.Current, (ladoOperacao == OrderSide.Buy) ? OrderSide.Sell : OrderSide.Buy, quantidade);
            		OrdersManager.Send(request);
        		} 

        	}
			
        }
        
        /// <summary>
        /// This function will be called before removing
        /// </summary>
		public override void Complete()
		{
			
		} 
     }
}

				
			

Leave a Comment

CONTENTS