Discussão do artigo "Como criar bots para Telegram em MQL5" - página 17

 
Nicholas Martins:

Obrigado por compartilhar esse código!

Só tenho um pequeno problema: uma de minhas corretoras usa letras minúsculas em alguns símbolos, como EURUSDm, GBPUSDm, XAUUSDm...s

Você tentou enviar apenas sem o m

ou, melhor ainda, este

#include <Telegram.mqh>
input sring InpChannel;
input string InpToken;
void OnStart()
    {
        bot.Token(InpToken);
        string msg = "This currency pair/symbol is called: "+Symbol();
        bot.sendmessage(InpChannel, msg);
    }
 
Roman Zhitnik:

O mais provável é que o erro seja o fato de o aplicativo Telegram estar bloqueado pelo Roskomnadzor. Eu encontrei o mesmo problema. Tente a VPN e pronto

Obrigado, Roman!

 


//--- parâmetros de entrada
input string InpChannelName="";//Nome do canal
input string InpToken="";//Token

//--- variáveis globais
bot CCustomBot;
int macd_handle;
datetime time_signal=0;
bool checked;
//+------------------------------------------------------------------+
//| Função de inicialização especializada
//+------------------------------------------------------------------+
int OnInit()
{
time_signal=0;

bot.Token(InpToken);

#ifdef __MQL5__
macd_handle=iMACD(NULL,0,12,26,9,PRICE_CLOSE);
if(macd_handle==INVALID_HANDLE)
{
Print("Invalid iMACD handle");
return(INIT_FAILED);
}
//--- adicionar o indicador ao gráfico
int total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
ChartIndicatorAdd(0,total,macd_handle);
#endif

return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do especialista
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(reason==REASON_PARAMETERS ||
reason==REASON_RECOMPILE ||
reason==REASON_ACCOUNT)
{
checked=false;
}

//--- excluir o indicador
#ifdef __MQL5__
int total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
for(int int subwin=total-1; subwin>=0; subwin--)
{
int amount=ChartIndicatorsTotal(0,subwin);
for(int i=amount-1; i>=0; i--)
{
string name=ChartIndicatorName(0,subwin,i);
if(StringFind(name, "MACD",0)==0)
ChartIndicatorDelete(0,subwin,name);
}
}
#endif
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
/*
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_KEYDOWN &&
lparam=='Q')
{
bot.SendMessage(InpChannelName,"/\x2611");
bot.SendMessage(InpChannelName,"\x2705\x2705\x2705");
}
}
*/
//+------------------------------------------------------------------+
//| Função de tique de especialista
//+------------------------------------------------------------------+
void OnTick()
{

if(!checked)
{
if(StringLen(InpChannelName)==0)
{
Print("Error: Channel name is empty");
Sleep(10000);
return;
}

int result=bot.GetMe();
se(resultado==0)
{
Imprimir("Nome do bot: ",bot.Name()));
checked=true;
}
else
{
Print("Erro: ",GetErrorDescription(result));
Sleep(10000);
return;
}
}

//--- obter hora
datetime time[1];
if(CopyTime(NULL,0,0,1,time)!=1)
return;

//--- verificar o sinal em cada barra
if(time_signal!=time[0])
{
//--- primeiro cálculo
if(time_signal==0)
{
time_signal=time[0];
return;
}

double macd[2]={};
double signal[2]={};

#ifdef __MQL4__
for(int i=0;i<=1;i++)
{
macd[i] = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
signal[i]= iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);
}
#endif

#ifdef __MQL5__
if(CopyBuffer(macd_handle,0,1,2,macd)!=2)
return;
if(CopyBuffer(macd_handle,1,1,2,signal)!=2)
return;
#endif

time_signal=time[0];

//--- Enviar sinal BUY
if(macd[1]>signal[1] &&
macd[0]<=signal[0] &&
macd[0]<0,0)
{
string msg=StringFormat("Nome: MACD Signal\xF4E3\nSymbol: %s\nTimeframe: %s\nType: Buy\nPrice: %s\nTime: %s",
_Symbol,
StringSubstr(EnumToString((ENUM_TIMEFRAMES)_Period),7),
DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits),
TimeToString(time[0])));
int res=bot.SendMessage(InpChannelName,msg);
se(res!=0)
Print("Error: ",GetErrorDescription(res));
}

//--- Enviar sinal SELL
se(macd[1]<signal[1] &&
macd[0]>=signal[0] &&
macd[0]>0,0)
{
string msg=StringFormat("Nome: MACD Signal\xF4E3\nSymbol: %s\nTimeframe: %s\nType: Sell\nPrice: %s\nTime: %s",
_Symbol,
StringSubstr(EnumToString((ENUM_TIMEFRAMES)_Period),7),
DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits),
TimeToString(time[0])));
int res=bot.SendMessage(InpChannelName,msg);
se(res!=0)
Print("Error: ",GetErrorDescription(res));
}
}
}
//+------------------------------------------------------------------+

NOME DO INDICADOR ( Histograma colorido MACD) , ESTA É A PERGUNTA COMO FAZER UM SINAL COM ESSE INDICADOR

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
  • www.mql5.com
Признак отрисовки ценового графика. Если установлено значение false, то отключается отрисовка любых атрибутов ценового графика и устраняются все отступы по краям графика: шкалы времени и цены, строка быстрой навигации, метки событий Календаря, значки сделок, тултипы индикаторов и баров, подокна индикаторов, гистограммы объёмов и т.д...
 
Andrey Voytenko:

Obrigado por seu feedback positivo. Mas a função WebRequest() não pode ser executada no Strategy Tester.


Prezado Andrey,

Obrigado por seu excelente artigo!

Como a função WebRequest() não funciona com o testador de estratégia, existe uma maneira de receber notificações com bots durante a execução do testador de estratégia?

Muito obrigado

 
Jefferson Metha:

Você tentou enviar apenas sem o m

ou, melhor ainda, este

//+------------------------------------------------------------------+
string CTelebot::TradeSymbol(string txt)
  {
   string symbol;
   if(SymbolFind(txt))
     {
      symbol = txt;
      return symbol;
     }
   if(SymbolFind(txt + suffix))
     {
      symbol = txt + suffix;
      return symbol;
     }
   if(SymbolFind(GetSymbolDescription(txt)))
      return GetSymbolDescription(txt);
   else
      // símbolo = SymbolGet(txt);
      symbol = "EMPTY";
   return symbol;
  }
//--------------------------------------------------+



Estou com um pequeno problema, pessoal. Como faço para obter o nome do canal/grupo usando chat.m_id?

 
Andrey Voytenko:

Favor corrigir a linha 117:

Prezado Andrey,

Seu trabalho é impressionante! E as tarefas também foram executadas


Tenho um problema e uma pergunta para o Telegram_Bot_EA

1. Recebo essa mensagem no mt4, qual poderia ser o motivo? Você pode me ajudar com uma solução?

0 08:25:24.546 Telegram_Bot_EA mt4 GBPUSD,H1: O arquivo de captura de tela 'NZDUSD60.gif' não foi criado.

2. Onde devo alterar o tamanho da fonte dos botões do Telegram? - Gostaria de deixar o texto um pouco menor


Agradeço antecipadamente por sua ajuda!

 

@Deyan Ivanov

Eu também tenho esse problema, este é o meu código corrigido para o MT4. Edite o arquivo "Telegram_Bot_EA.mq4" e substitua o método "int SendScreenShot(...)"

//+------------------------------------------------------------------+
   int               SendScreenShot(const long _chat_id,
                                    const string _symbol,
                                    const ENUM_TIMEFRAMES _period,
                                    const string _template=NULL)
     {

	......................

      Sleep(50);

      bool resultShot = ChartScreenShot(chart_id,filename,2560,1200,ALIGN_RIGHT);
      ChartClose(chart_id);
      if(resultShot)
        {
         Sleep(500);

         bot.SendChatAction(_chat_id,ACTION_UPLOAD_PHOTO);

         //---
         if(FileIsExist(filename))
           {
            string screen_id;
            result=bot.SendPhoto(photo_id,_chat_id,filename,_symbol+"_"+StringSubstr(EnumToString(_period),7));
           }
         else
           {
            string mask=m_lang==LANGUAGE_EN?"Screenshot file '%s' not created.":"Файл скриншота '%s' не создан.";
            PrintFormat(mask,filename);
           }

        }


      
....................
     }
 
Olá, Andrey. Você poderia me ajudar, por favor? Existe uma maneira de enviar uma mensagem sobre o fechamento de um negócio com/sem takeprofit?
 
volohovnp:
Olá, Andrey. Você poderia me ajudar, por favor? Existe uma maneira de enviar uma mensagem sobre o fechamento de uma operação com/sem takeprofit?
Eu envio um comentário com cada negociação e, em seguida, envio uma mensagem informando o Símbolo, o Tipo de Ordem, o Comentário e a Ação que desejo realizar

Mensagem, por exemplo
Fechar
Compra EurUSD
Negociação nº 23

Ou

Fechar por 0,21 lote ou Fechar por 50%
<Outros parâmetros que mudarei com base no pedido>
 
Hi, this we request function takes many time, better make by sockets, I tried but I couldn't convert, can someone help to change webreq to socket?