Neo traderBot

Neo traderBot

Você sabia?

A NeoTraderBot é a primeira comunidade aberta no Brasil com foco em compartilhar informações sobre automatização de estratégias

Docy

Perguntas Frequentes (FAQ) & Exemplos de Código

Leitura estimada: 15 minutos

Nesta seção vamos apresentar exemplos de códigos e respostas às perguntas frequentes para que você comece a usar a integração com o Telegram de maneira mais rápida possível. Caso tenha alguma dúvida, deixe nos comentários que iremos atualizar esta seção de acordo com a demanda.

Como eu incluo a ferramenta de integração com o telegram no meu código?

O primeiro passo é instalar a ferramenta em sua plataforma TraderEvolution. Para isso, basta seguir o roteiro apresentado neste link.

Uma vez instalada a ferramenta, no seu código fonte você deve referenciar a biblioteca de Integração com Telegram (desenvolvida pela NeoTraderBot) na seção de using. Como segue abaixo:

				
					using NTB_IntegrationServices_TE;
				
			

Em seguida, instancie um objeto no para integraçao com o Telegram, conforme segue abaixo:

				
					TelegramIntegration telegramConn;
				
			

Por fim, no método Init do seu código, você pode utilizar a seguinte estrutura de inicialização da biblioteca de integração com o Telegram.

				
					try
    {
        string botToken = "INSIRA AQUI O TOKEN DO SEU BOT";
        string emailAutenticacao = "seuEmail@teste.com";
        string versaoFerramenta = "PREMIUM";
        telegramConn = TelegramIntegration.GetTelegramConn;
        telegramConn.Authenticate(emailAutenticacao, this.AccountManager.Current, versaoFerramenta);
        
        //Registra o robô, grupos e tópicos com suas IDs
        telegramConn.AddBot("NeoTraderBot", botToken);
        telegramConn.AddGroup("NeoTraderBot", "Meus códigos TraderEvolution", "-1001909578209");
        telegramConn.AddTopic("NeoTraderBot", "Meus códigos TraderEvolution", "Alarme Volatilidade", "124");
        telegramConn.AddTopic("NeoTraderBot", "Meus códigos TraderEvolution", "Carteira de ações", "2");
        telegramConn.AddTopic("NeoTraderBot", "Meus códigos TraderEvolution", "Screening Opening Range", "60");
        telegramConn.AddTopic("NeoTraderBot", "Meus códigos TraderEvolution", "Grid Trading", "57");
    }
    catch (Exception ex)
    {
        Notification.Alert("Não autenticou a ferramenta de integração com telegram: " + ex.Message);
    }
				
			

Pronto! Caso não haja problema na Autenticação do seu usuário no servidor da NeoTraderBot, você já poderá utilizar os métodos para envio de mensagens no seu código.

Ah…eu quero guardar o token do meu bot e ler a partir de um arquivo. Ok! Use o snippet abaixo, o qual fará a leitura do arquivo “meuTokenTelegram.txt” na pasta “Meus Documentos”. O arquivo contém unica e exclusivamente o token do bot.

				
								try
			{
				string botToken = "";
				string logPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "meuTokenTelegram.txt");
	            using (StreamReader inputFile = new StreamReader(logPath))
	            {
	            	botToken = inputFile.ReadLine();
	            }
				
			    string emailAutenticacao = "seuEmail@teste.com";
			    string versaoFerramenta = "FREE";
			    telegramConn = TelegramIntegration.GetTelegramConn;
			    telegramConn.Authenticate(emailAutenticacao, this.AccountManager.Current, versaoFerramenta);
			
			    //Registra o robô, grupos e tópicos com suas IDs
			    telegramConn.AddBot("NeoTraderBot", botToken);
			    telegramConn.AddGroup("NeoTraderBot", "Meus códigos TraderEvolution", "-1001909578209");
			}
			catch (Exception ex)
			{
			    Notification.Alert("Não autenticou a ferramenta de integração com telegram: " + ex.Message);
			}	
				
			

Quais são os métodos para envio de mensagens?

Uma vez instanciado um objeto, conforme instruções da pergunta anterior, você irá utilizar o método SendMessage para enviar mensagens para um grupo do Telegram ou tópicos dentro dos grupos.

Cabe ressaltar que você deve verificar se sua versão contratada possui a funcionalidade desejada. Por exemplo, a versão FREE não permite o envio de mensagens para tópicos específicos de um grupo. Ela permite o envio apenas para o tópico principal.

Assim, existem 2 sobrecargas para o método SendMessage: uma para envio de mensagem para um grupo e outra para envio de mensagem para tópico de um grupo.

OBS: É necessário adicionar as IDs e texto de identificação de grupos e tópicos, antes de enviar as mensagens. Pois os grupos e tópicos serão referenciados pelo texto de identificação fornecido.

Enviando mensagem para um Grupo | SendMessage(string botName, string groupName, string message)

No exemplo abaixo, estamos utilizando o objeto telegramConn para enviar uma mensagem utilizando o bot “NeoTraderBot” para o grupo “Meus códigos TraderEvolution”. A mensagem enviada é: “Teste de envio!”.

				
					telegramConn.SendMessage("NeoTraderBot", "Meus códigos TraderEvolution", 
                         "Teste de envio!");
				
			
Enviando mensagem para um Tópico | SendMessage(string botName, string groupName, string topicName, string message)

No exemplo abaixo, estamos utilizando o objeto telegramConn para enviar uma mensagem utilizando o bot “NeoTraderBot” para o tópico “Carteira de ações” do grupo “Meus códigos TraderEvolution”. A mensagem enviada é: “21/nov/2023 – Valor atual da carteira: R$ 89.780,00”.

				
					telegramConn.SendMessage("NeoTraderBot", "Meus códigos TraderEvolution", 
                         "Carteira de ações", 
                         "21/nov/2023 - Valor atual da carteira: R$ 89.780,00");
				
			

Posso enviar emojis nas mensagens de texto?

Sim, claro! Talvez você queira utilizar elementos visuais em suas mensagens de texto. Você pode utilizar os códigos padronizados de emojis os quais estão disponíveis em diversos sites. 

Você pode utilizar o https://emojipedia.org/ como referencia ou copiar as figuras abaixo e colar nas suas mensagens.

OBS: A renderização do emoji (figura a ser desenhada) depende do ambiente no qual está utilizando (Windows/Mac/Telegram/Facebook/Twitter…).

TEMPO:

⏰  ⏲️  ⏳

PERCEPÇÃO DO MERCADO:

🌡️   🔥   🚀  💣 😱  ❄️ 🛒

TENDÊNCIA:

🔼 🔻 📉  📈

DESTAQUES:

⭐ 👀 🔎

ANÚNCIOS:

📢 🔔

ALERTAS:

⚠️  ⛔  🛑  🟢  🔴  🔵  🟡  🟠

RESULTADO:

💰  🤑  💲 🎉 💀 💩

Eu posso enviar imagens (arquivos jpg, png,...)?

Sim. Assim como o método SendMessage permite enviar mensagens de texto, o método SendPicture permite enviar mensagens contendo imagens e uma legenda.

Também há duas sobrecargas do método SendPicture para diferenciar o envio para grupo e tópicos específicos dentro de um grupo.

Veja o exemplo abaixo no qual é enviada uma mensagem contendo uma figura localizada na máquina local (em C:\\Users\\johna\\OneDrive\\Documents\\bulls_bears.jpg) com a legenda “Aqui você escreve o caption!” para o grupo “Meus códigos TraderEvolution” utilizando o bot “NeoTraderBot”.

				
					telegramConn.SendPicture("NeoTraderBot", "Meus códigos TraderEvolution", 
                         "C:\\Users\\johna\\OneDrive\\Documents\\bulls_bears.jpg", 
                         "Aqui você escreve o caption!");
				
			

Por questões de segurança, não é possível referenciar URLs de imagens na internet para envio de mensagens. Assim, recomendamos que baixe as imagens e salve em um diretório local para referenciar em seus códigos.

Não estou conseguindo enviar mensagens. O que pode estar acontecendo?

Caso ocorra alguma inconsistência no envio de alguma mensagem, a biblioteca de integração com o telegram foi projetada para não lançar exceções a fim de não causar distúrbios na execução dos códigos do usuário. Assim, para identificar o problema precisamos eliminar as causas de maneira gradativa.

1) Problemas relacionados à Autenticação do usuário

A primeira causa para você não conseguir enviar mensagens seria algum problema relacionado ao processo de autenticação da ferramenta vinculado ao e-mail e conta do usuário. Certifique-se que a autenticação está ocorrendo adequadamente.

Caso haja alguma falha de comunicação com o servidor de autenticação ou o usuário não esteja cadastrado, isso irá gerar uma exceção ainda no método Init, antes do código iniciar o processamento.

2) Problemas relacionados ao cadastro de token do Bot

Certifique-se de que você está inserindo o token do seu Bot Telegram por meio do método AddBot com o token correto. Atente-se para as funcionalidades da sua versão contratada, pois pode haver limitação da quantidade de bots a serem utilizados em um único código.

3) Permissões do Bot nos grupos destinatários

É importante verificar se você atribuiu as permissões necessárias ao Bot dentro dos grupos destinatários. Clique aqui para ver um roteiro passo a passo de como atribuir corretamente as permissões nos grupos.

4) Problemas relacionados a vinculação de ID para grupos e tópicos

Certifique-se de que você está inserindo os IDs de grupos e seus respectivos textos de identificação (método AddGroup). Ao enviar mensagens, o destinatário deverá ser referenciado pelo mesmo texto identificador. Clique aqui para ver um roteiro passo a passo de como identificar os IDs de grupos e tópicos.

Somente após cadastrar os grupos é que você deve inserir os tópicos do grupo, utilizando o método AddTopic.

Atente-se para as restrições da sua versão em uso, pois podem haver limitações de envio para mais de um grupo ou tópicos dentro dos grupos.

Por fim, certifique-se que as IDs de grupos e tópicos foram devidamente incluídas nos métodos AddGroup e AddTopic.

Sugestão: Inicie um código simples de indicador e insira apenas o código necessário para instanciar a sua conexão com a ferramenta de integração do Telegram e enviar uma única mensagem para um grupo. Uma vez validado esse funcionamento básico, você pode ir aos poucos incluindo outras tarefas no código e copiar essa estrutura para dentro dos seus códigos que deseja integrar com o Telegram.

Como enviar mensagens apenas quando minha estratégia/robô estiver analisando dados em tempo real?

Este controle de fluxo deve ser implementado pelo próprio usuário, pois a ferramenta foi criada para ser flexivel o suficiente para rodar em dados históricos em casos de inicializações com o mercado já aberto e envio de informações referentes a por exemplo a abertura do mercado.

Você possivelmente sabe que o código é processado algumas vezes para cada barra histórica, iniciando na barra mais antiga de dado disponível. As barras são percorridas sequencialmente até chegarmos a última barra, a qual se o mercado estiver aberto, estará sendo atualizada em tempo real.

Assim, para criar um controle de fluxo, no qual você irá enviar mensagens pelo Telegram apenas na última barra do gráfico, ou seja, na barra em tempo real, precisamos declarar uma variável auxiliar no seu código, conforme segue abaixo:

				
					private bool realTime;
				
			

Em seguida, insira no método Update de seu código a estrutura abaixo. Ela permitirá identificar em que momento seu código passará a processar barras em tempo real. Assim, basta você inserir a ação que deseja executar no fechamento da barra ou a cada nova cotação.

				
					public override void Update(TickStatus args)
{
    if (!realTime && (args == TickStatus.IsBar))
    { realTime = true; }
    else
    {
        if (args == TickStatus.IsQuote)   
        {
            //Insira aqui o que deseja executar sempre que tem nova cotação
        }
        else
        if (args == TickStatus.IsBar)
        {
            //Insira aqui o que deseja executar no fechamento da barra
        }
    }
}
				
			

Como eu posso fazer minha estratégia mandar mensagens pelo Telegram?

O código de estratégia abaixo é meramente ilustrativo, mas você pode copiar e rodar em sua conta de simulação na Trader Evolution. O que ele faz basicamente é a cada timeSpaceMinutes (parâmetro da estratégia) verificar se há uma posição aberta e se não houver a estratégia irá comprar ou vender (aleatoriamente) colocando ordens de stop e alvo em ticks, conforme definido nos parâmetros.

As mensagens enviadas para o telegram, nesse caso, foram realizadas sempre que uma ordem é posicionada e executada, bem como quando uma posição é aberta e encerrada. No exemplo, utilizamos sobrecarga de métodos nos eventos já disponíveis no EvoCode. Mas você pode encaminhar mensagens pelo Telegram nas condições que desejar.

				
					using System;
using Runtime.Script;
using TradeApi;
using TradeApi.History;
using TradeApi.Instruments;
using TradeApi.ToolBelt;
using TradeApi.Trading;
using NTB_IntegrationServices_TE;

namespace NeoTraderBotExemplos
{
    public class TimeSpacedOrdersExample : StrategyBuilder
    {
        [InputParameterAttribute(InputType.Color, "Abrir posição a cada (minutos)", 2)]
        [SimpleNumeric(1D, 2400D)]
        public int timeSpaceMinutes = 2;

        [InputParameterAttribute(InputType.Color, "Tamanho da exposição", 3)]
        [SimpleNumeric(1D, int.MaxValue)]
        public int orderQty = 1;

        [InputParameterAttribute(InputType.Color, "OCO - Stoploss (TICKS)", 4)]
        [SimpleNumeric(1D, int.MaxValue, 0, 1)]
        public int stoplossTicks = 10;

        [InputParameterAttribute(InputType.Color, "OCO - Take profit (TICKS)", 5)]
        [SimpleNumeric(1D, int.MaxValue, 0, 1)]
        public int takeProfitTicks = 10;

        TelegramIntegration telegramConn;

        BarData dadosCandle;
        private bool realTime;
        private double positionSize;
        private Random rndSignal;
        public TimeSpacedOrdersExample()
            : base()
        {
            #region Initialization
            Credentials.Author = "Johnathas Carvalho";
            Credentials.Company = "NeoTraderBot";
            Credentials.Copyrights = "NeoTraderBot";
            Credentials.DateOfCreation = new DateTime(2023, 10, 07);
            Credentials.ExpirationDate = DateTime.MinValue;
            Credentials.Version = "1.0";
            Credentials.Password = "66b4a6416f59370e942d353f08a9ae36";
            Credentials.ProjectName = "Estratégia integrada com Telegram";
            #endregion

            SeparateWindow = false;
        }
        public override void Init()
        {
            try
            {
                string botToken = "INSIRA SEU TOKEN AQUI";
                telegramConn = TelegramIntegration.GetTelegramConn;
                telegramConn.Authenticate("seuEmail@gmail.com", this.AccountManager.Current, "SUA VERSAO CONTRATADA");
                telegramConn.AddBot("NeoTraderBot", botToken);
                telegramConn.AddGroup("NeoTraderBot", "Meus códigos TraderEvolution", "INSIRA O ID DO SEU GRUPO AQUI");
            }
            catch (Exception ex)
            {
                Notification.Alert("Não autenticou a ferramenta de integração com telegram: " + ex.Message);
            }

            dadosCandle = (HistoryDataSeries as BarData);
            realTime = false;

            OrdersManager.OnFill += OnOrderFill;
            OrdersManager.OnPlace += OnOrderPlaced;
            PositionsManager.OnOpen += OnOpenPosition;
            PositionsManager.OnClose += OnClosePosition;

            //Gestão de posição
            positionSize = 0;
            
            //Geração de sinais aleatórios
            rndSignal = new Random();

        }

       public override void Update(TickStatus args)
        {

            if (!realTime && (args == TickStatus.IsBar))
            {
                realTime = true;
            }

            if (realTime)
            {
                if (args == TickStatus.IsQuote)   //Atua sempre que tem nova cotação
                {
                    
                }
                else
                if (args == TickStatus.IsBar)    //Atua no fechamento da barra
                {
                    positionSize = GetPositionSize();

                    if ((positionSize == 0) && ( ((dadosCandle.GetTimeUtc().TimeOfDay.TotalMinutes - 9*60) % timeSpaceMinutes) == 0))
                    {
                        if (rndSignal.Next(0, 2) == 0)
                            BuyAtMarket(orderQty, CalculationMode.TICKS, takeProfitTicks, stoplossTicks);
                        else SellAtMarket(orderQty, CalculationMode.TICKS, takeProfitTicks, stoplossTicks);
                    }
                }
            }
        }

        public override void Complete()
        {
            OrdersManager.OnFill -= OnOrderFill;
            OrdersManager.OnPlace -= OnOrderPlaced;

            PositionsManager.OnOpen -= OnOpenPosition;
            PositionsManager.OnClose -= OnClosePosition;

            telegramConn.SendMessage("NeoTraderBot", "Meus códigos TraderEvolution", "A estratégia exemplo de ordens espaçadas no tempo foi encerrada.");
        }

        private TradeResult BuyAtMarket(int qty, CalculationMode mode, double takeProfitUnits, double stoplossUnits)
        {
            OrderRequest request = null;
            TradeResult order;

            request = new OrderRequest(OrderType.Market,
                InstrumentsManager.Current,
                AccountManager.Current,
                OrderSide.Buy, quantity: qty)
            {
                SLTPPriceType = SLTPPriceType.Ticks,
                StopLossPrice = stoplossUnits,
                TakeProfitPrice = takeProfitUnits
            };

            order = OrdersManager.Send(request);
            return order;
        }

        private TradeResult SellAtMarket(int qty, CalculationMode mode, double takeProfitUnits, double stoplossUnits)
        {
            OrderRequest request = null;
            TradeResult order;

            request = new OrderRequest(OrderType.Market,
                InstrumentsManager.Current,
                AccountManager.Current,
                OrderSide.Sell, quantity: qty)
            {
                SLTPPriceType = SLTPPriceType.Ticks,
                StopLossPrice = stoplossUnits,
                TakeProfitPrice = takeProfitUnits
            };

            order = OrdersManager.Send(request);
            return order;
        }

        private void ClosePositions()
        {
            OrderRequest request = null;

            foreach (Position p in PositionsManager.GetPositions())
            {
                request = new OrderRequest(OrderType.Market, InstrumentsManager.Current, AccountManager.Current, (p.Side == PositionSide.Long) ? OrderSide.Sell : OrderSide.Buy, p.Quantity);
                OrdersManager.Send(request);
            }
        }

        private double GetPositionSize()
        {
            double posSize = 0;
            foreach (Position p in PositionsManager.GetPositions(po => po.Instrument == InstrumentsManager.Current))
            {
                Notification.Alert("Posição é de " + p.Quantity);
                posSize += ((p.Side == PositionSide.Long) ? 1 : -1) * p.Quantity;
            }

            return posSize;
        }


        #region callback for Orders and Position events
        private void OnOrderFill(Order order)
        {
            double price = (AccountManager.Current.Name.ToUpper().Contains("DEMO")) ? order.Price : order.AverageFilledPrice;
            double quantity = (AccountManager.Current.Name.ToUpper().Contains("DEMO")) ? order.Quantity : order.FilledQuantity;

            string msg = "Foi executada uma " + ((order.Side == OrderSide.Buy) ? "compra" : "venda") + $" de {quantity} @ {price}";
            telegramConn.SendMessage("NeoTraderBot", "Meus códigos TraderEvolution", ((order.Side == OrderSide.Buy) ? "🔼" : "🔻") + " " + msg);
        }

        private void OnOrderPlaced(Order order)
        {
            double price = order.Price;
            double quantity = order.Quantity;

            string msg = "Foi apregoada uma ordem de " + ((order.Side == OrderSide.Buy) ? "compra" : "venda") + $" de {quantity} @ {price}";
            telegramConn.SendMessage("NeoTraderBot", "Meus códigos TraderEvolution", "👀" + " " + msg);
        }

        private void OnOpenPosition(Position position)
        {
            string msg = "Foi aberta uma posição " + ((position.Side == PositionSide.Long ? "comprada" : "vendida")) + $" de {position.Quantity} @ {position.OpenPrice}";
            telegramConn.SendMessage("NeoTraderBot", "Meus códigos TraderEvolution", "⚠️" + " " + msg);
        }

        private void OnClosePosition(Position position)
        {
            string msg = "Foi encerrada uma posição " + ((position.Side == PositionSide.Long ? "comprada" : "vendida")) + $" de {position.Quantity} com resultado líquido de {position.NetPnL}";
            telegramConn.SendMessage("NeoTraderBot", "Meus códigos TraderEvolution", ((position.NetPnL >= 0) ? "🟢" : "🔴") + " " + msg);

        }

        #endregion

        private enum CalculationMode
        {
            PRICE,
            TICKS,
            PERCENTAGE,
        }

    }
}
				
			

Leave a Comment

CONTENTS