Discusión sobre el artículo "Cómo crear un bot para Telegram en el lenguaje MQL5" - página 17

 
Nicholas Martins:

Gracias por compartir este código.

Sólo tengo un pequeño problema, uno de mis corredores tiene letra minúscula en algunos símbolos como EURUSDm, GBPUSDm, XAUUSDm...s

¿Has probado Sólo el envío sin la m

o mejor aún 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:

Lo más probable es que el error se deba a que la apiche Telegram está bloqueada por Roskomnadzor. Yo me encontré con el mismo problema. Prueba con VPN y listo

¡Gracias Roman!

 


//--- parámetros de entrada
input string InpChannelName="";//Nombre del canal
input string InpToken="";//Token

//--- variables globales
bot CCustomBot;
int macd_handle;
datetime time_signal=0;
bool checked;
//+------------------------------------------------------------------+
//| Función de inicialización experta
//+------------------------------------------------------------------+
int OnInit()
{
señal_tiempo=0;

bot.Token(InpToken);

#ifdef __MQL5__
macd_handle=iMACD(NULL,0,12,26,9,PRECIO_CIERRE);
if(macd_handle==INVALID_HANDLE)
{
Print("Manejador iMACD no válido");
return(INIT_FAILED);
}
//--- añadir el indicador al gráfico
int total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
ChartIndicatorAdd(0,total,macd_handle);
#endif

return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Función de desinicialización experta |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(reason==REASON_PARAMETERS ||
reason==REASON_RECOMPILE |||
reason==REASON_ACCOUNT)
{
checked=false;
}

//--- borrar el indicador
#ifdef __MQL5__
int total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
for(int subwin=total-1; subwin>=0; subwin--)
{
int importe=ChartIndicatorsTotal(0,subwin);
for(int i=cantidad-1; i>=0; i--)
{
string nombre=NombreIndicadorCart(0,subwin,i);
if(StringFind(nombre, "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");
}
}
*/
//+------------------------------------------------------------------+
//| Función tick experto |
//+------------------------------------------------------------------+
void OnTick()
{

if(!checked)
{
if(StringLen(InpChannelName)==0)
{
Print("Error: El nombre del canal está vacío");
Sleep(10000);
return;
}

int resultado=bot.GetMe();
if(resultado==0)
{
Print("Nombre del bot: ",bot.Nombre()));
checked=true;
}
else
{
Print("Error: ",GetErrorDescription(result));
Sleep(10000);
return;
}
}

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

//--- comprueba la señal en cada barra
if(señal_tiempo!=tiempo[0])
{
//--- primer calculo
if(señal_tiempo==0)
{
señal_tiempo=tiempo[0];
return;
}

double macd[2]={};
double señal[2]={};

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

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

señal_tiempo=tiempo[0];

//--- Enviar señal BUY
if(macd[1]>señal[1] &&
macd[0]<=señal[0] &&
macd[0]<0.0)
{
string msg=StringFormat("Nombre: 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);
if(res!=0)
Print("Error: ",GetErrorDescription(res));
}

//--- Enviar señal VENTA
if(macd[1]<señal[1] &&
macd[0]>=señal[0] &&
macd[0]>0.0)
{
string msg=StringFormat("Nombre: 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);
if(res!=0)
Print("Error: ",GetErrorDescription(res));
}
}
}
//+------------------------------------------------------------------+

NOMBRE DEL INDICADOR ( Histograma coloreado MACD) , ESTA ES LA PREGUNTA COMO HACER UNA SEÑAL CON ESTE INDICADOR

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

Gracias por sus comentarios positivos. Pero la función WebRequest() no se puede ejecutar en el Probador de Estrategias.


Estimado Andrey,

¡gracias por su maravilloso artículo!

Dado que la función WebRequest() no funciona con el Probador de Estrategias, ¿hay alguna manera de recibir notificaciones con bots mientras se ejecuta el Probador de Estrategias?

Gracias

 
Jefferson Metha:

¿Intentó simplemente enviar sin la m

o mejor aún esto

//+------------------------------------------------------------------+
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;
  }
//--------------------------------------------------+



Tengo un pequeño problema chicos ¿Cómo puedo obtener canal / nombre del grupo utilizando chat.m_id

 
Andrey Voytenko:

Por favor, arregle la línea 117:

Estimado Andrey,

¡Su trabajo es impresionante! Y los trabajos realizados también


Tengo 1 problema y 1 pregunta para el Telegram_Bot_EA

1. Me sale este mensaje en el mt4 ¿Cuál podría ser la razón de ello? ¿Puede ayudar con una solución?

0 08:25:24.546 Telegram_Bot_EA mt4 GBPUSD,H1: Screenshot file 'NZDUSD60.gif' not created.

2. ¿Dónde tengo que cambiar el tamaño de la fuente de los botones de Telegram? - Me gustaría hacer el texto un poco más pequeño


¡Gracias de antemano por su ayuda!

 

@Deyan Ivanov

Yo también tengo estos problemas, este es mi código arreglado para MT4. Edita el archivo "Telegram_Bot_EA.mq4" reemplaza el 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);
           }

        }


      
....................
     }
 
Hola, Andrey. ¿Podrías ayudarme por favor - hay una manera de enviar un mensaje sobre el cierre de un acuerdo con/sin takeprofit?
 
volohovnp:
Hola, Andrey. ¿Podrías ayudarme por favor - hay una manera de enviar un mensaje sobre el cierre de una operación con/sin takeprofit?
Envío un comentario con cada operación, luego envío un mensaje indicando el Símbolo, el Tipo de Orden y el Comentario, y la Acción que quiero que se realice

Mensaje por ejemplo
Cerrar
EurUSD Comprar
Operación #23

O

Cerrar por 0.21 lotes o Cerrar por 50%.
<Otros parámetros que cambiaré basados en la Orden>
 
Hola, esta función we request lleva mucho tiempo, mejor hacerla por sockets, lo he intentado pero no he podido convertir, ¿alguien me puede ayudar a cambiar webreq por socket?