Русский

Учебник по MQL4  Стандартные функции  Информация о счёте

Информация о счёте


Функции клиентского терминала и проверки состояния удобно применять, например, для ограничения использования программ при коммерческом распространении. Рассмотрим, как может быть решена такая задача:

Задача 39. Представить защитный код программы, распространяемой на коммерческой основе, удовлетворяющий следующим требованиям:
  • для исполнения программы на реальных счетах индивидуальных клиентов требуется ввести пароль;
  • для исполнения программы на реальных счетах корпоративных клиентов пароль не требуется;
  • ограничения при исполнении программы на демо-счёте не предусмотрены.

В этом примере правильно сформулирована постановка задачи. Для успешного коммерческого распространения в распоряжение потенциальных потребителей необходимо предоставить программу, которая в полной мере может быть опробована на демо-счёте. При этом пользователь может оценить все достоинства программы и принять решение о её приобретении.

Применять один общий пароль для всех клиентов неправильно - в этом случае появляется риск несанкционированного распространения программы. Поэтому для индивидуальных клиентов пароль должен быть поставлен в зависимость от номера реального счёта. Для корпоративных клиентов (если дилинговый центр приобрёл лицензию для всех своих трейдеров) использовать пароль нет необходимости - программа должна сама определить, к какому серверу подключён клиентский терминал. И если это сервер корпоративного клиента, то необходимо предоставить любому пользователю возможность беспрепятственной работы.

Решение Задачи 39 для ограничения прав использования программ может быть таким (эксперт сheck.mq4):

//--------------------------------------------------------------------
// сheck.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
extern int Parol=12345;
//--------------------------------------------------------------- 2 --
int start() // Спец. функция start
{
if(Check()==false) // Если условия использования..
return; // ..не выполняются, то выход

// Здесь должен быть указан основной код программы
Alert("Исполнение программы"); // Алерт для примера

return; // Выход из start()
}
//--------------------------------------------------------------- 3 --
bool Check() // Пользов. функция проверки ..
{ // .. условий использования
if (IsDemo()==true) // Если это демо-счёт, то..
return(true); // .. других ограничений нет
if (AccountCompany()=="SuperBank") // Для корпоративных клиентов..
return(true); // ..пароль не нужен
int Key=AccountNumber()*2+1000001; // Вычисляем ключ
if (Parol==Key) // Если пароль верный, то..
return(true); // ..разрешаем работу на реале
Alert("Неправильный пароль. Эксперт не работает.");
return(false); // Выход из пользов. функции
}
//--------------------------------------------------------------- 4 --

В данном примере необходимая проверка выполняется в первых строках специальной функции start (блок 2-3):

   if(Check()==false)                  // Если условия использования..

Если в результате выполнения проверки пользовательская функция Check() (блок 3-4) вернула false, то управление передаётся на оператор return и специальная функция start() заканчивает работу. Основной код программы располагается непосредственно после указанной проверки. В результате успешной проверки функция Check() вернёт true, в этом случае основной код программы будет исполнен.

В пользовательской функции Check() выполняется проверка по трём критериям:
- является ли счёт демонстрационным;
- принадлежит ли сервер корпоративному клиенту;
- подходит ли пароль к реальному счёту.

Для проверки по первому критерию используется функция IsDemo().

Функция IsDemo()

bool IsDemo()

Функция возвращает TRUE, если программа работает на демонстрационном счете, в противном случае возвращает FALSE.

Если функция IsDemo() возвращает true, то пользователь работает на демо-счёте. Это значит, что выполнять другие проверки нет необходимости (т.к. опробование программы на демо-счёте позволено для всех желающих). В этом случае функция Check() прекращает работу, и возвращает значение true:

   if (IsDemo() == true)               // Если это демо-счёт, то..
return(true); // .. других ограничений нет

Если же в функция IsDemo() вернёт значение false, значит, пользователь работает на реальном счёте. В этом случае необходимо выяснить, достаточно ли у пользователя прав. В данном примере сначала выполняется проверка корпоративных клиентов, для этого используется функция AccountCompany().

Функция AccountCompany()

 string AccountCompany()

Функция возвращает название брокерской компании, в которой зарегистрирован текущий счет.

Если в результате выполнения проверки:

   if (AccountCompany() == "SuperBank")// Для корпоративных клиентов..
return(true); // ..пароль не нужен

установлено, что название компании совпадает с тем, что указано в программе, то функция Check() закончит работу и вернёт true - проверка закончена успешно. Если же оказывается, что клиент подключен к другой компании (не являющейся корпоративным клиентом), то необходимо выяснить имеет ли он индивидуальную лицензию.

В строке:

   int Key = AccountNumber()*2+1000001;// Вычисляем ключ

в программу заложен алгоритм вычисления ключа для любого номера счёта. В данном примере это простой способ. Программист по своему усмотрению может ввести в программу другой, более сложный способ вычисления ключа. В любом случае алгоритм вычисления ключа должен учитывать номер счёта, который доступен программе через функцию AccountNumber().

Функция AccountNumber()

 int AccountNumber()

Функция возвращает номер текущего счета.

Ранее вычисленный по тому же алгоритму пароль передаётся пользователю. Если в результате проверки оказывается, что пароль и ключ совпадают, то функция Check() прекращает работу и возвращает значение true:

   if (Parol == Key)                   // Если пароль верный, то..
return(true); // ..разрешаем работу на реале

Если ни одна из проверок не закончилась успешно, это означает, что пользователь не имеет права применения данной программы на реальном счёте. В этом случае, после соответствующего уведомления, функция Check() прекращает работу и возвращает значение false. Таким образом пресекается попытка несанкционированного использования программы.

Функции, возвращающие информацию о клиентском терминале


Функция Краткое описание
TerminalCompany Возвращает наименование компании-владельца клиентского терминала.
TerminalName Возвращает имя клиентского терминала.
TerminalPath Возвращает директорий, из которого запущен клиентский терминал.

Функции, позволяющие определить текущее состояние клиентского терминала, в том числе состояние окружения выполняемой MQL4-программы


Функция Краткое описание
GetLastError Функция возвращает код последней ошибки, после чего значение специальной переменной last_error, в которой хранится код последней ошибки, обнуляется. Так что последующий вызов GetLastError() вернет значение 0.
IsConnected Возвращает состояние главного соединения клиентского терминала с сервером, по которому производится подкачка данных. TRUE - связь с сервером установлена, FALSE - связь с сервером отсутствует или прервана.
IsDemo Возвращается TRUE, если программа работает на демонстрационном счете, в противном случае возвращает FALSE.
IsDllsAllowed Возвращает TRUE, если DLL вызов функции разрешены для эксперта, иначе возвращает FALSE.
IsExpertEnabled Возвращает TRUE, если в клиентском терминале разрешен запуск экспертов, иначе возвращает FALSE.
IsLibrariesAllowed Возвращает TRUE, если эксперт может назвать библиотечную функцию, иначе возвращает FALSE.
IsOptimization Возвращается TRUE, если эксперт работает в режиме оптимизации тестирования, иначе возвращает FALSE.
IsStopped Возвращается TRUE, если программа (эксперт или скрипт) получила команду на завершение своей работы, иначе возвращает FALSE.
IsTesting Возвращается TRUE, если эксперт работает в режиме тестирования, иначе возвращает FALSE.
IsTradeAllowed Возвращается TRUE, если эксперту разрешено торговать и поток для выполнения торговых операций свободен, иначе возвращает FALSE.
IsTradeContextBusy Возвращается TRUE, если поток для выполнения торговых операций занят, иначе возвращает FALSE.
IsVisualMode Возвращается TRUE, если эксперт тестируется в режиме визуализации, иначе возвращает FALSE.
UninitializeReason Возвращает код причины завершения экспертов, пользовательских индикаторов и скриптов. Возвращаемые значения могут быть одним из кодов деинициализации. Эту функцию можно также вызывать в функции init() для анализа причин деинициализации предыдущего запуска.

Функции для доступа к информации об активном счете


Функция Краткое описание
AccountBalance Возвращает значение баланса активного счета (сумма денежных средств на счете).
AccountCredit Возвращает значение кредита для активного счета.
AccountCompany Возвращает название брокерской компании, в которой зарегистрирован текущий счет.
AccountCurrency Возвращает наименование валюты для текущего счета.
AccountEquity Возвращает сумму собственных средств для текущего счета. Расчет equity зависит от настроек торгового сервера.
AccountFreeMargin Возвращает значение свободных средств, разрешенных для открытия позиций на текущем счете.
AccountFreeMarginCheck Возвращает размер свободных средств, которые останутся после открытия указанной позиции по текущей цене на текущем счете.
AccountFreeMarginMode Режим расчета свободных средств, разрешенных для открытия позиций на текущем счете.
AccountLeverage Возвращает значение плеча для текущего счета.
AccountMargin Возвращает сумму залоговых средств, используемых для поддержания открытых позиций на текущем счете.
AccountName Возвращает имя пользователя текущего счета.
AccountNumber Возвращает номер текущего счета.
AccountProfit Возвращает значение прибыли для текущего счета в базовой валюте.
AccountServer Возвращает имя активного сервера.
AccountStopoutLevel Возвращает значение уровня, по которому определяется состояние Stop Out.
AccountStopoutMode Возвращает режим расчета уровня Stop Out.

Для получения подробного описания этих и других функций необходимо обратиться к справочной документации на MQL4.community, сайте MetaQuotes Ltd. или к разделу "Справка" в редакторе MetaEditor.