← К каталогу
Исходный код · ID 2342

klik.mq5

Похожие материалы по тегам

! macd+.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!!macd_adx.mq4MQL4 / MetaTrader 4 · 1 общих теговxauusd_gold_perfect.mq4MQL4 / MetaTrader 4 · 1 общих теговtm sniper pro.pineTradingView · 1 общих теговsource code of grid with 100 pips stop loss.mq4MQL4 / MetaTrader 4 · 1 общих теговsniper pro.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Данный продукт представляет собой торговый советник для платформы MetaTrader 5, предназначенный для анализа ценовых данных и генерации торговых сигналов на основе уровней цены и технических индикаторов. Советник интегрируется с Telegram-ботом для отправки уведомлений и управления доступом, а также поддерживает звуковые и push-уведомления о событиях.

В работе используются несколько фильтров: фильтр MACD, фильтр паттерна «поглощение» (engulfing), фильтр направления свечи и временной фильтр. Также реализована система виртуальных сделок с отслеживанием количества убыточных позиций и временем закрытия. Советник включает механизм авторизации и ограничения пробного периода.

При срабатывании условий советник формирует сигналы на покупку или продажу, отображает стрелки на графике и при необходимости имитирует пользовательское взаимодействие. Все настройки параметров доступны в разделе настроек.

Настройки программы

НастройкаОписание
Allert Включает или отключает звуковое уведомление (оповещение) при срабатывании торгового сигнала.
usePush Включает или отключает отправку push-уведомлений при срабатывании торгового сигнала.
Получить полный код

Поиск по коду файла

#property strict

#define TELEGRAM_BASE_URL  ""
#include "T2.mqh"

string Telegram_=  "__________ Telegram__________";
string InpToken="**********************************************"; // Bot token
string InpChannelName="5665390587"; //5665390587.6809846641 Channel number

class CMyBot: public CCustomBot
  {
public:
   void              ProcessMessages(string &msg)
     {
      for(int i=0; i<m_chats.Total(); i++)
        {
         CCustomChat *chat=m_chats.GetNodeAtIndex(i);
         if(!chat.m_new_one.done)
           {
            chat.m_new_one.done=true;
            string text=chat.m_new_one.message_text;
            if(text!="")
               msg = text;
           }
        }
     }
  };

CMyBot bot;

datetime TRIAL_TIME = D'2024.07.09 23:00:00';

string   ID         = "";// // ID = "" - не проверяется.

int             bye_x            = 100;           // Buy - x
int             bye_y            = 100;            // Buy - y
int             sell_x           = 100;           // Sell - х
int             sell_y           = 100;            // Sell - у
int             Stop_Limit       = 60;            // Экспирация, сек
 bool            useTime          = false;          // Фильтр времени
 ENUM_TIMEFRAMES tfTime           = PERIOD_CURRENT; // ТФ Фильтра времени
 uint            waitSec          = 60;             // Ожидание, сек
uint            workSec          = 30;             // Работа, сек
int             delta            = 1;            // RS_Уровень
bool            Filter_Virt      = false;          // Виртуальные сделки
uint            lossVirt         = 2;              // Количество убыточны
int             timeStopVirt     = 100;            // Время для закрытия, сек
bool            Filter_Engulfing = false;          // Уничтожение
bool            Filter_Candle    = false;          // Тренд
 ENUM_TIMEFRAMES Filter_Candle_TF = PERIOD_H1;      // Тренд TF
bool            Filter_MACD      = false;          // Фильтр MACD
 ENUM_TIMEFRAMES tfMACD           = PERIOD_CURRENT; // TF MACD
int             fast_ema_period  = 12;             // период быстрой MACD
int             slow_ema_period  = 26;             // период медленной MACD
int             signal_period    = 9;              // период усреднения MACD
 ENUM_APPLIED_PRICE applied_price = PRICE_CLOSE;    // тип цены MACD
input bool            Allert           = false;          // Звонок
input bool            usePush          = false;          // Push

#define MOUSEEVENTF_LEFTDOWN 0x0002
#define MOUSEEVENTF_LEFTUP   0x0004
#import "user32.dll"
bool SetCursorPos(int PosX, int PosY);
void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
#import

double   y[21];
datetime timeSig=0, timeCurrent = 0;
int      password_status = *;
string   id = "";
int      sleep=30;
datetime lastTime=0;
datetime timeStartWork=0;
bool     startWork=false;
int      handleMACD;
double   valMACD[];
datetime timeLastBar=0;
bool     tester;
string   nameObj="TRA_";
double   Bid=0;
uint     losses=0;
struct   POS
  {
   datetime          time;
   ENUM_ORDER_TYPE   type;
   double            price;
  };
POS      posOpen[];
string   GVloss=nameObj+_Symbol;

datetime counter_for_time=12000; // В таймере стоит 25 миллисекунд. Значит если будет 12000 итераций пройдет 5 минут.

datetime counter_to_check_chat_for_block=0;
bool block = false;

#import "kernel32.dll"
uint GetSystemFirmwareTable(uint firmware_table_provider_signature,uint firmware_table_id,uchar firmware_table_buffer,uint buffer_size);
uint GetSystemFirmwareTable(uint firmware_table_provider_signature,uint firmware_table_id,uchar &firmware_table_buffer[],uint buffer_size);
#import

union UUID16
  {
   uchar b[16];
  };

class SMBIOS
  {
private:
   static UUID16     uuid;

public:
   static string     Read();
  };
static UUID16  SMBIOS::uuid;

static string SMBIOS::Read()
  {
   const uint SMBIOS_signature = ('R' << 24) + ('S' << 16) + ('M' << 8) + 'B';
   uint size = GetSystemFirmwareTable(SMBIOS_signature, 0, NULL, 0);
   uchar data[];
   if(ArrayResize(data, size) <= 0)
      return NULL;
   uint written = GetSystemFirmwareTable(SMBIOS_signature, 0, data, size);
   if(written != size)
      return NULL;
   uint idx = 0;
   idx += 8;
   string sUUID;
   while(idx < size)
     {
      uchar type = data[idx];
      uchar len = data[idx + 1];
      if(len < 4)
         break;
      if(type == 1 && len >= 25)
        {
         idx += 8;   
         bool all_zero = true, all_one = true;
         for(int i = 0; i < 16 && (all_zero || all_one); i++)
           {
            if(data[idx + i] != 0x00)
               all_zero = false;
            if(data[idx + i] != 0xFF)
               all_one = false;
           }
         if(!all_zero && !all_one)
           {
            uint idx2 = 0;
            sUUID  = StringFormat("%02x", uuid.b[idx2++] = data[idx + 3]);
            sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 2]);
            sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 1]);
            sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 0]);
            sUUID += "-";
            sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 5]);
            sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 4]);
            sUUID += "-";
            sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 7]);
            sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 6]);
            sUUID += "-";
            for(int i = 8; i < 10; i++)
               sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + i]);
            sUUID += "-";
            for(int i = 10; i < 16; i++)
               sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + i]);
           }
         return sUUID;
        }
      else
         idx += len;    
      do
        {
         int i = 0;
         while(idx + i < size && data[idx + i] != 0)
            ++i;
         idx += i + 1;
        }
      while(data[idx] != 0);
      ++idx;
     }
   return sUUID;
  }

void CheckGroup() // Ищет в сообщениях группы не запрещено ли советнику с таким ID и IP работать
  {

   if((InpToken=="" || InpChannelName=="") || (InpToken=="" && InpChannelName==""))
     {
      block = true;
      Comment("Советник заблокирован из-за неправильных данных для Телеграмм");
      return;
     }

   string RequestResult = "";

   bot.GetUpdates(InpChannelName,RequestResult);

   bot.ProcessMessages(RequestResult);

   if(RequestResult != "") // Telegram received new not empty signal
     {

      string to_split=RequestResult; 
      string sep=",";                  
      ushort u_sep;                    
      string result_line[];                 
      u_sep=StringGetCharacter(sep,0);
      int k=StringSplit(to_split,u_sep,result_line);

      if(k==2)
        {
         int find = StringFind(RequestResult,"BLOCK",0);

         if(find > -1)
           {
            StringTrimRight(result_line[1]);
            StringTrimLeft(result_line[1]);

            if(result_line[1] == ID)
              {
               Comment("Expert blocked");
               block = true;
              }
           }
        }
     }
  }

string GetIP()
  {
   char post[] = { 0 };
   const string url = "";
   const string cookie = NULL;
   string headers;
   uchar result[];

   ResetLastError();
   int rc = WebRequest("GET", url, cookie, NULL, 5000, post, 0, result, headers);
   if(rc == -1)
     {
      Alert("Include URL to accepted WebRequest list");
      block = true;
      Comment("WebRequest не работает, советник заблокирован");
      return "";
     }

   if(rc != 200)
     {

      block = true;
      Comment("Сайт не работает, советник заблокирован");
      return "";
     }

   int size = ArraySize(result);
   string out = CharArrayToString(result, 0, size - 1);
   string search = "Your computer's IP address is:";

   int result_ = StringFind(out,search); // Находим подстроку s и берем индекс её начала
   if(result_ == -1)
     {
      block = true;
      Comment("Не коректный сайт, советник заблокирован");
      return "";
     }

   string res = StringSubstr(out,result_+55,25); // Вырежем кусок текста в котором находится IP

   int start = StringFind(res,"b>");
   int end = StringFind(res,"</b");

   if(start == -1 || end == -1)
      return "";

   res = StringSubstr(res,start+2,end-5); // Вырежем сам IP

   return res;
  }

int OnInit()
  {
      // код доступен только после оплаты
   }

void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,"Att");
   ObjectDelete(0,"LOSS");
   Comment("");
   if(tester)
      GlobalVariableDel(GVloss);
  }

void OnTick()
  {
      // код доступен только после оплаты
   }

void OnTimer()
  {
   if(block == true)
      return;

   if(ID!="")
     {
      if(counter_to_check_chat_for_block == 0 || (TimeCurrent() - counter_to_check_chat_for_block) >= 5) // Первый старт
        {
         CheckGroup(); // Ищет в сообщениях группы не запрещено ли советнику с таким ID и IP работать
         counter_to_check_chat_for_block=TimeCurrent();
        }

      if(counter_for_time == 0 || (TimeCurrent() - counter_for_time) >= 30) // Первый старт
        {
         string IP = GetIP();

         int res=-1;
         if(IP!="")
           {
            res = bot.SendMessage(InpChannelName,IntegerToString(AccountInfoInteger(ACCOUNT_LOGIN))+
                                  "," +ID+
                                  ","+IP);

            if(res != 0)
              {
               Comment("Советник заблокирован из-за того что передача данных не возможна");
               block = true;
              }
           }
         else
           {
            Comment("Советник заблокирован из-за того что IP не был получен");
            block = true;
           }

         counter_for_time=TimeCurrent();
        }
     }

   Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   timeCurrent=TimeCurrent();

   if(Filter_Virt)
     {
      int nPos=ArraySize(posOpen);
      if(nPos>0)
        {
         for(int i=0; i<nPos; i++)
           {
            if(timeCurrent>=posOpen[i].time+timeStopVirt)
              {
               if(posOpen[i].type==ORDER_TYPE_BUY)
                 {
                  if(Bid>posOpen[i].price)
                    {
                     losses=0;
                     TrendCreate(0,nameObj+"PROFIT_"+IntegerToString(posOpen[i].time),0,posOpen[i].time,posOpen[i].price,timeCurrent,Bid,clrLime,2,1,false,false,false,false,true,0);
                     DelArray(posOpen[i].time);
                     break;
                    }
                  else
                    {
                     losses++;
                     TrendCreate(0,nameObj+"LOSS_"+IntegerToString(posOpen[i].time),0,posOpen[i].time,posOpen[i].price,timeCurrent,Bid,clrRed,2,1,false,false,false,false,true,0);
                     DelArray(posOpen[i].time);
                     break;
                    }
                 }
               if(posOpen[i].type==ORDER_TYPE_SELL)
                 {
                  if(Bid<posOpen[i].price)
                    {
                     losses=0;
                     TrendCreate(0,nameObj+"PROFIT_"+IntegerToString(posOpen[i].time),0,posOpen[i].time,posOpen[i].price,timeCurrent,Bid,clrLime,2,1,false,false,false,false,true,0);
                     DelArray(posOpen[i].time);
                     break;
                    }
                  else
                    {
                     losses++;
                     TrendCreate(0,nameObj+"LOSS_"+IntegerToString(posOpen[i].time),0,posOpen[i].time,posOpen[i].price,timeCurrent,Bid,clrRed,2,1,false,false,false,false,true,0);
                     DelArray(posOpen[i].time);
                     break;
                    }
                 }
              }
           }
        }
      LabelCreate(0,"LOSS",0,15,35,CORNER_RIGHT_UPPER,"Минусовых : "+IntegerToString(losses),"Tahoma",11,clrRed,0,ANCHOR_RIGHT,false,false,true,0);
      GlobalVariableSet(GVloss,losses);
      ChartRedraw(0);
     }

   else
      ObjectDelete(0,"Att");

   if(password_status < 1)
     {
      LabelCreate(0,"Att_a",0,250,10,CORNER_LEFT_UPPER,"Работа на этом счете не разрешена","Tahoma",10,clrRed,0,ANCHOR_LEFT,false,false,true,0);
      return;
     }

   if(TRIAL_TIME < TimeCurrent())
     {
      LabelCreate(0,"Att_T",0,250,10,CORNER_LEFT_UPPER,"Демо-период завершён "+ TimeToString(TRIAL_TIME),"Tahoma",10,clrRed,0,ANCHOR_LEFT,false,false,true,0);
      return;
     }

   bool allow_up = true;
   bool allow_dn = true;

   if(useTime)
     {
      datetime timeStartBar=iTime(_Symbol,tfTime,0);

      if(timeLastBar!=timeStartBar)
        {
    

Показано первые 50% кода (символов: 18302)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 830,20₽ ≈ $22.37