klik.mq5
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «klik.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный продукт представляет собой торговый советник для платформы 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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.