Результати з 1 по 1 із 1

Тема: Використання WinAPI у радниках на MQL4

  1. #1
    Адміністратор Аватар bvn
    Створено
    липень 2014
    Місце
    Полтава, Україна
    Дописи
    2,699
    Подякував
    1,665
    1,362 Подяк в 767 Дописах

    Використання WinAPI у радниках на MQL4

    Ця замітка не відноситься до академічних матеріалів "що і як треба робити", а швидше до "Tips&Tricks" за власним досвідом. Просто наведу кілька прикладів (вирізки коду, що відноситься безпосередньо до застосування WinAPI) .

    1. Імітіція натискань клавіш ("вмикач радників").

    Code:
    #include <WinUser32.mqh>
    
    ...
    
    if (IsExpertEnabled())
        Comment("Радники включені");
      else {
        Comment("Вмикаємо радники");
        keybd_event(17, 0, 0, 0); // натискання CTRL
        keybd_event(69, 0, 0, 0); // натискання E
        Sleep(10); // час на реакцію, бо наступні події можуть загубитись
        keybd_event(69, 0, 2, 0); // відпускання E
        keybd_event(17, 0, 2, 0); // відпускання CTRL
      }
    2. Отримання інформації про час модифікації файлу та іншої.

    Code:
    struct FileTime {
      uint LowDateTime;
      uint HighDateTime;
    };
    
    struct FindFileData {
      uint FileAtributes;
      FileTime CreationTime;
      FileTime LastAccessTime;
      FileTime LastWriteTime;
      uint FileSizeHigh;
      uint FileSizeLow;
      uint Reserved1;
      uint Reserved2;
      char FileName[520];
      char AlternateFileName[28];
    };
    
    struct SystemTime {
      ushort wYear;
      ushort wMonth;
      ushort wDayOfWeek;
      ushort wDay;
      ushort wHour;
      ushort wMinute;
      ushort wSecond;
      ushort wMilliseconds;
    };
    
    #import "kernel32.dll"
      int FindFirstFileW(string path, FindFileData &data);
      bool FileTimeToSystemTime(FileTime &time, SystemTime &data);
    #import
    
    ...
    
    datetime GetMTime(string FileName) {
      FindFileData result;
      SystemTime filedatetime;
    
      StringReplace(FileName, "/", "\\"); // Провсяк випадок змінюєм звичайні слеші (unix/linux style) на обернені (dos/windows style)
    
      int handle = FindFirstFileW(FileName, result); // Знаходим перший файл, отриманий хендл може використовуватись для подальшої роботи
        // з функцією FindNextFileW(), призначеної для обробки кількох файлів з одного каталогу
    
      if (handle == -1) return(-1); 
      
      FileTimeToSystemTime(result.LastWriteTime, filedatetime); // У одному з полів структури FindFileData ми отримали необхідну нам
        // інформацію, однак у досить дивному вигляді, який потребує подвійного перетворення, спочатку у формат структури SystemTime
        // і останнім кроком у формат datetime відомий також як Timestamp, не забувши також відняти різницю часових поясів у секундах,
        // для повернення до GMT - з ним легше оперувати
    
      return StringToTime(IntegerToString(filedatetime.wYear)+"."+IntegerToString(filedatetime.wMonth)+"."+IntegerToString(filedatetime.wDay) +
        " "+IntegerToString(filedatetime.wHour)+":"+IntegerToString(filedatetime.wMinute)+":"+IntegerToString(filedatetime.wSecond)) -
        TimeGMTOffset();
    }
    3. Копіювання файлів (подолання обмежень "пісочниці" MQL/Files).

    Code:
    #import "kernel32.dll"
      bool CopyFileW(string path1, string path2, bool exist);
    #import
    
    ...
    
    if (!CopyFileW(From, To, false)) { // Тут в принципі все сказано, лише останній параметр треба пояснити,
        // значення true забороняє перезаписувати існуючі файли
    
      Print("Error Copy File: ", From, " > ", To);
    }
    4. Виконання іншої програми.

    Code:
    #import "shell32.dll"
      int ShellExecuteW(int hwnd, string operation, string file, string parameters, string directory, int show);
    #import
    
    ...
    
    ShellExecuteW(0, "open", "notepad.exe", NULL, NULL, 1);
    Якось так, і будьте обережні з об’явленням структур для параметрів віндових функцій, невірне вирівнювання даних може призвести до досить дивних і важковловимих помилок виконання. Вдалого програмування!
    Востаннє редагувалось bvn; 20-02-2015 в 15:21.
    Перед тим, як писати на форумі, ознайомтесь з Правилами форуму.
    Зараз я торгую тут: FXOpen Мій ПАММ-рахунок чекає на Ваші інвестиції: DTWT
    Цитувати Цитувати

  2. Наступні користувачі подякували bvn за цей корисний допис:

    BorRud (01-08-2016)

Інформація про Тему

Users Browsing this Thread

Зараз 1 відвідувачів переглядають цю тему. (0 користувачів і 1 гостей)

Права у Розділі

  • Ви не можете створювати нові теми
  • Ви не можете писати відповіді
  • Ви не можете робити вкладення
  • Ви не можете правити ваші дописи
  •