Информация о счёте
Функции клиентского терминала и проверки состояния удобно применять, например, для
ограничения использования программ при коммерческом распространении. Рассмотрим,
как может быть решена такая задача:
|
Задача 39. Представить защитный код программы, распространяемой на коммерческой основе, удовлетворяющий
следующим требованиям: - для исполнения программы на реальных счетах индивидуальных клиентов требуется ввести
пароль;
- для исполнения программы на реальных счетах корпоративных клиентов пароль не требуется;
- ограничения при исполнении программы на демо-счёте не предусмотрены.
|
В этом примере правильно сформулирована постановка задачи. Для успешного коммерческого
распространения в распоряжение потенциальных потребителей необходимо предоставить
программу, которая в полной мере может быть опробована на демо-счёте. При этом
пользователь может оценить все достоинства программы и принять решение о её приобретении.
Применять один общий пароль для всех клиентов неправильно - в этом случае появляется
риск несанкционированного распространения программы. Поэтому для индивидуальных
клиентов пароль должен быть поставлен в зависимость от номера реального счёта.
Для корпоративных клиентов (если дилинговый центр приобрёл лицензию для всех своих
трейдеров) использовать пароль нет необходимости - программа должна сама определить,
к какому серверу подключён клиентский терминал. И если это сервер корпоративного
клиента, то необходимо предоставить любому пользователю возможность беспрепятственной
работы.
Решение Задачи 39 для ограничения прав использования программ
может быть таким (эксперт
сheck.mq4):
extern int Parol=12345;
int start()
{
if(Check()==false)
return;
Alert("Исполнение программы");
return;
}
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);
}
В данном примере необходимая проверка выполняется в первых строках специальной функции
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.