понедельник, 10 августа 2020 г.

Как привязать советник к номеру счета

 Весьма распространенная ситуация: программист написал свое великое творение и не хочет, чтобы его программный продукт бесконтрольно распространялся. Как иметь возможность передать советник конкретному человеку, но чтобы больше никто не мог им воспользоваться? Существует несколько способов защиты программного кода от несанкционированного использования.

1. Привязка советника к конкретному номеру счета. Наиболее простой способ. Но до недавнего времени был абсолютно неэффективен ввиду простоты декомпиляции исполняемых файлов. Однако последние билды MQL4 защищены намного лучше и в большинстве случаев такой защиты будет вполне достаточно. Достоинство метода - советник будет работать только у того, для кого он был скомпилирован. Недостаток - для каждого клиента необходимо перекомпилировать советник заново.
2. Генерация серийных номеров. Метод заключается в том, чтобы в настройки советника внести поле для ввода серийного номера, при этом внутри самого советника присутствует функция, проверяющая введенный серийный номер на валидность. Достоинство метода - единый экземпляр советника для любого пользователя. Недостаток - утечка любого из серийных номеров приведет к потере контроля за распространением советника.
3. Вынос привязки к номеру счета в динамически загружаемую библиотеку (DLL). В DLL также обычно выносится основная часть алгоритма работы. Более трудный способ на этапе создания советника, так как необходимо иметь немного больше мастерства программирования, чем начальный уровень. Но тем не менее, даже такая привязка взламывается при помощи дизассемблера и HEX-редактора. Достоинства - обход привязки требует более высокой квалификации программиста. Недостаток - в связи с усилением защиты от декомпиляции исполняемых файлов Метатрейдера, метод практически потерял свою актуальность.
4. Защита с использованием онлайн-сервиса и электронных криптографических ключей. Наиболее надежный метод, но мы его даже рассматривать не будем, так как он используется исключительно профессиональными распространителями программных продуктов и требует дополнительных вложений на техническую поддержку своего сервиса.

Рассмотрим первый вариант защиты советника - привязка к конкретному торговому счету.
Получить информацию о текущем счете в MQL4 можно двумя способами.
1. Как известно, логин для подключения счета и сам номер счета одинаковые. Логин представляет собой целочисленное значение. Для получения целочисленных значений соответствующих свойств счета есть функция
КОД: ВЫДЕЛИТЬ ВСЕ
long  AccountInfoInteger(
   int  property_id      // идентификатор свойства
   );

Если в параметр функции передать значение ACCOUNT_LOGIN, то она вернет нам текущий логин:
КОД: ВЫДЕЛИТЬ ВСЕ
// получить логин (номер счета) в переменную Number:
int Number = AccountInfoInteger(ACCOUNT_LOGIN);


2.Второй способ - воспользоваться функцией AccountNumber(), которая просто возвращает номер счета, на котором советник в данный момент работает:
КОД: ВЫДЕЛИТЬ ВСЕ
// получить номер счета в переменную Number:
int Number = AccountNumber();


Как теперь эти знания использовать? Нужно в начале работы советника проверить, соответствует ли номер счета, на котором работает советник, изначально заданному, и если не соответствует, то прекратить работу. Допустим, хотим ограничить выполнение советника исключительно на счете номер 1234567. В начало функции OnTick() советника вставляем соответствующий блок:
КОД: ВЫДЕЛИТЬ ВСЕ
void OnTick()
{
   int Number = AccountNumber(); // получить номер счета
   if (Number  != 1234567)       // сравнить его с заданным, и если не равен,
   {
      Comment("Работа на счете ",Number," запрещена!");   // вывести комментарий о запрете работы
      return;     // принудительно завершить работу
   }
   // ... дальнейший код советника
}