Обсуждение статьи "Создание бота для Telegram на языке MQL5" - страница 30

 
Andrey Voytenko:

Хотел бы попросить тех, у кого не работает телеграм через WebRequest, запустить у себя этот скрипт и скопировать сюда строку из закладки Эксперты с результатом. Это поможет быстро выявить проблему.

2020.06.10 10:16:02.090    TestWebRequest (EURUSD,M15)    Build=2485 
WebRequest=200 GetLastError=0 
strData={"ok":true,"result":{"id":177791741,"is_bot":true,"first_name":"ForexSignal","username":"ForexSignalBot","can_join_groups":true,"can_read_all_group_messages":true,"supports_inline_queries":true}}
 
Ilyas:

с Винды 10 про и сервера 2016 запросы отправляются без каких либо проблем.

 
GedThey MaThey:

Я уже тестирую ваш скрипт в двух системах

Первая в windows 7 7601 SP1, работает с ошибкой, как ваша ошибка
Вторая в windows 10 pro 64 bit build 18363 работает хорошо без ошибок.


Я получил мои скрипты работают с теми же результатами, так что я могу подтвердить это сейчас:

- Windows 7: НЕ работает ❌

- Windows 10: работает хорошо ✅

@Andrey Voytenko

 

Здравствуйте, ребята, мне нужна помощь



Когда я размещаю заказ, бот отправляет одно и то же сообщение несколько раз,

Вот код!


заранее спасибо

#include <Telegram.mqh>


input string InpChannelName="@signal";//Имя канала
input string InpToken="1049045330:AxxxxxxbFxxx0-IxwKXyxxxxxxxx";//Bot Token


CCustomBot bot;

datetime time_signal=0;
//int SendMessage(const string channel_name,
                //const string text);




//+------------------------------------------------------------------+
//| Функция инициализации эксперта|
//+------------------------------------------------------------------+
int OnInit()
  {
   time_signal=0;

//--- установить маркер
   bot.Token(InpToken);


//--- done
   return(INIT_SUCCEEDED);
  }
 
  datetime _opened_last_time = TimeCurrent() ;
  datetime _closed_last_time = TimeCurrent()  ;
  
 

//+------------------------------------------------------------------+
//| Функция деинициализации эксперта|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)

{

}
     
  
//+------------------------------------------------------------------+
//| Функция экспертного тика|
//+------------------------------------------------------------------+
void OnTick()
  {
  

   string message = "";
   int total=OrdersTotal();
  
        
   for(int pos=0;pos<total;pos++){  // Текущие заказы -----------------------
     if(OrderSelect(pos,SELECT_BY_POS)==false) continue;
     if(OrderOpenTime() <= _opened_last_time) continue;
     
     message += StringFormat("Order opened!\r\nType: %s\r\nSymbol: %s\r\nPrice: %s\r\nSL: %s\r\nTP: %s\r\nTime: %s\r\nTicket:.%s ",
     order_type(),
     OrderSymbol(),
     DoubleToStr(OrderOpenPrice(),MarketInfo(OrderSymbol(),MODE_DIGITS)),
     DoubleToStr(OrderStopLoss(),MarketInfo(OrderSymbol(),MODE_DIGITS)),
     DoubleToStr(OrderTakeProfit(),MarketInfo(OrderSymbol(),MODE_DIGITS)),
     TimeToStr(OrderOpenTime(),TIME_MINUTES),
     IntegerToString(OrderTicket())
          
      );
      
     int res=bot.SendMessage(InpChannelName,message);
     if(res!=0)
         Print("Error: ",GetErrorDescription(res));
     
     }
     
      bool is_closed = false;

  
  total = OrdersHistoryTotal();
      
   for(int pos=0;pos<total;pos++){  // Исторические заказы-----------------------
      if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY)==false) continue;
      if(OrderCloseTime() <= _closed_last_time) continue;
     printf(OrderCloseTime());
     is_closed = true;
     
     message += StringFormat("Order closed!\r\nTicket: %s\r\nSymbol: %s\r\nClosing Price: %s\r\nTime: %s",
     IntegerToString(OrderTicket()),
     OrderSymbol(),
     DoubleToStr(OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_DIGITS)),
     TimeToStr(OrderCloseTime(),TIME_MINUTES),
     DoubleToStr(order_pips(),1)
     
     
     );
      
      int res=bot.SendMessage(InpChannelName,message);
     if(res!=0)
         Print("Error: ",GetErrorDescription(res));
      
     }
 
   }
   
   
double order_pips() {
   double pips;
   
   if(OrderType() == OP_BUY) {
      pips =  (OrderClosePrice()-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);
   } else {
      pips =  (OrderOpenPrice()-OrderClosePrice())/MarketInfo(OrderSymbol(),MODE_POINT);
   }
   return pips/10;
}

string order_type_to_str(int type)
{
   return StringSubstr(EnumToString((ENUM_ORDER_TYPE)type), 11);
}
string order_type () {
   return order_type_to_str(OrderType());
   
   if(OrderType() == OP_BUY)        return "BUY";
   if(OrderType() == OP_SELL)       return "SELL";
   if(OrderType() == OP_BUYLIMIT)   return "BUY LIMIT";
   if(OrderType() == OP_SELLLIMIT)  return "SELL LIMIT";
   if(OrderType() == OP_BUYSTOP)    return "BUYSTOP";
   if(OrderType() == OP_SELLSTOP)   return "SELLSTOP";
   
   return "{err}";
}
   

   
//---
 

Здравствуйте, сэр!!! Спасибо за этот прекрасный инструмент!


Я хотел бы узнать, если у меня уже есть пресеты алертов по разным индикаторам, настроенные на оповещения по электронной почте, могу ли я узнать, какие строки мне нужно добавить, чтобы получать на мой канал через ваш telegram mql.


У меня уже есть все файлы в папке include


Заранее спасибо



//+------------------------------------------------------------------+
//|Индикатор: Alert.mq5 |
//||
//||
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property description ""

//--- настройки индикатора
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2

#property indicator_type1 DRAW_ARROW
#property indicator_width1 4
#property indicator_color1 0xFFFFFF
#property indicator_label1 "Buy"

#property indicator_type2 DRAW_ARROW
#property indicator_width2 4
#property indicator_color2 0xC437C4
#property indicator_label2 "Sell"

#include <Telegram.mqh>


input string InpChannelName="@xxxxx";//Имя канала
input string InpToken="xxxxxxx:AxxxxxxbFxxx0-IxwKXyxxxxxxxx";//Bot Token


CCustomBot bot;

datetime time_signal=0;
//int SendMessage(const string channel_name,
                //const string text);



//--- индикаторные буферы
double Buffer1[];
double Buffer2[];

datetime time_alert; //используется при отправке оповещения
bool Send_Email = true;
double myPoint; //инициализируется в OnInit
int MACD_handle;
double MACD_Main[];
double MACD_Signal[];
double Low[];
double High[];
double Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double Last = SymbolInfoDouble(_Symbol, SYMBOL_LAST);

void myAlert(string type, string message)
  {
   if(type == "print")
      Print(message);
   else if(type == "error")
     {
      Print(type+" DAILY ALERT "+Symbol()+message);
     }
   else if(type == "order")
     {
     }
   else if(type == "modify")
     {
     }
   else if(type == "")
     {
      if(Send_Email) SendMail("DAILY ALERT",">Symbol : "+Symbol()+
      "\n"
      "\n" + "Price : "+ DoubleToString(Last) +  
      "\n" + "Date : "+TimeToString(TimeLocal(),TIME_DATE )+
      "\n" + "Time : "+TimeToString(TimeLocal(),TIME_MINUTES)+
      "\n" + "Time Frame : "+EnumToString((ENUM_TIMEFRAMES)Period())+message);
     }
  }

//+------------------------------------------------------------------+
//| Пользовательская функция инициализации индикатора |
//+------------------------------------------------------------------+
int OnInit()
  {   
   SetIndexBuffer(0, Buffer1);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(0, PLOT_ARROW, 241);
   SetIndexBuffer(1, Buffer2);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(1, PLOT_ARROW, 242);
   
   
   //инициализация myPoint
   myPoint = Point();
   if(Digits() == 5 || Digits() == 3)
     {
      myPoint *= 10;
     }
   MACD_handle = iMACD(NULL, PERIOD_D1, 12, 26, 9, PRICE_CLOSE);
   if(MACD_handle < 0)
     {
      Print("The creation of iMACD has failed: MACD_handle=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
   
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Пользовательская функция итерации индикатора|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
   int limit = rates_total - prev_calculated;
   //--- подсчет от 0 до rates_total
   ArraySetAsSeries(Buffer1, true);
   ArraySetAsSeries(Buffer2, true);
   //--- начальный ноль
   if(prev_calculated < 1)
     {
      ArrayInitialize(Buffer1, 0);
      ArrayInitialize(Buffer2, 0);
     }
   else
      limit++;
   datetime TimeShift[];
   datetime Time[];
   
   if(BarsCalculated(MACD_handle) <= 0) 
      return(0);
   if(CopyBuffer(MACD_handle, MAIN_LINE, 0, rates_total, MACD_Main) <= 0) return(rates_total);
   ArraySetAsSeries(MACD_Main, true);
   if(CopyTime(Symbol(), PERIOD_CURRENT, 0, rates_total, TimeShift) <= 0) return(rates_total);
   ArraySetAsSeries(TimeShift, true);
   if(BarsCalculated(MACD_handle) <= 0) 
      return(0);
   if(CopyBuffer(MACD_handle, SIGNAL_LINE, 0, rates_total, MACD_Signal) <= 0) return(rates_total);
   ArraySetAsSeries(MACD_Signal, true);
   if(CopyLow(Symbol(), PERIOD_CURRENT, 0, rates_total, Low) <= 0) return(rates_total);
   ArraySetAsSeries(Low, true);
   if(CopyHigh(Symbol(), PERIOD_CURRENT, 0, rates_total, High) <= 0) return(rates_total);
   ArraySetAsSeries(High, true);
   if(CopyTime(Symbol(), Period(), 0, rates_total, Time) <= 0) return(rates_total);
   ArraySetAsSeries(Time, true);
   //--- главный цикл
   for(int i = limit-1; i >= 0; i--)
     {
      if (i >= MathMin(5000-1, rates_total-1-50)) continue; //удалить некоторые старые тарифы, чтобы предотвратить "Array out of range" или медленное вычисление 
      
      int barshift_D1 = iBarShift(Symbol(), PERIOD_D1, TimeShift[i]);
      if(barshift_D1 < 0) continue;
      
      //Индикаторный буфер 1
      if(MACD_Main[barshift_D1] > MACD_Signal[barshift_D1]
      && MACD_Main[barshift_D1+1] < MACD_Signal[barshift_D1+1] //MACD пересекается выше MACD
      )
        {
         Buffer1[i] = Low[i]; //Установка значения индикатора на нижней границе свечи
         if(i == 0 && Time[0] != time_alert)
         { myAlert("",
        "\n"
        "\n" + ">Direction : " " UP"); time_alert = Time[0]; } //Мгновенное оповещение, только один раз за бар
        }
      else
        {
         Buffer1[i] = EMPTY_VALUE;
        }
      // Индикаторный буфер 2
      if(MACD_Main[barshift_D1] < MACD_Signal[barshift_D1]
      && MACD_Main[barshift_D1+1] > MACD_Signal[barshift_D1+1] //MACD пересекается ниже MACD
      )
        {
         Buffer2[i] = High[4+i]; //Установка значения индикатора по максимуму свечи
         if(i == 0 && Time[0] != time_alert) 
         { myAlert(" ",
         "\n"
         "\n" + ">Direction : " " DOWN"); time_alert = Time[0]; } //Мгновенное оповещение, только один раз за бар
        }
      else
        {
         Buffer2[i] = EMPTY_VALUE;
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
OrelMely:



Работает ли библиотека в индикаторах
 
Jefferson Metha:
Работает ли библиотека в индикаторах

Да, у него есть готовый сигнальный файл, который уже работает с MACD...


Но у меня ограниченные навыки работы с кодом, поэтому я не могу запустить его в данный момент.

 

Привет,

Mt4 выдает ошибку, когда я пытаюсь отправить фото:


  • EURUSD,H1: { "ok":false, "error_code":400, "description": "Bad Request: wrong HTTP URL specified"}


Похоже, он думает, что я пытаюсь получить EURUSD.gif с сервера, в то время как он находится на "MQL4/Files".

Я попробовал использовать прямой путь из файлов windows, но проблема осталась. Я застрял на этой проблеме уже несколько часов назад, есть ли у кого-нибудь подсказка?

Вот мой код

      bot.Token(token);
      
      string photo_id;
      int result=bot.SendPhoto(-1001098781629,"EURUSD.gif",photo_id);
      if(result==0)
         Print("Photo ID: ",photo_id);
      else
         Print("Error: ",GetErrorDescription(result));
 
Telegram Bot API
  • core.telegram.org
The Bot API is an HTTP-based interface created for developers keen on building bots for Telegram. To learn how to create and set up a bot, please consult our Introduction to Bots and Bot FAQ . Recent changes June 4, 2020 Added the new field via_bot to the Message object. You can now know which bot was used to send a message. Supported video...
 
Извините, но я не уверен, что делаю неправильно. Вы имеете в виду, что я не могу отправить фотографию локально и что мне нужно сначала загрузить ее на сервер?