img

DLL файлы - использовании файлов динамических библиотек

Язык NTL+ поддерживает работу с DLL файлами. Это могут быть как стандартные DLL файлы, поставляемые с OC Windows (например, user32.dll или kernel32.dll), так и DLL созданные пользователем. Благодаря тому, что функции DLL являются машинным кодом, их использование значительно ускоряет скорость исполнения, например, сложных расчетов. Функции, используемые в DLL из скрипта, должны соответствовать соглашению о связях, принятому для функций Windows API. Для соблюдения такого соглашения в исходном тексте программ, написанных на языках C или C++, используется ключевое слово __stdcall, которое присуще компиляторам от фирмы Microsoft.

Для начала работы с файлами библиотек необходимо поместить пользовательские DLL файлы в папку имя_пользователя\Documents\NeTTradeX Advisors\scripts\libraries. Системные DLL (например user32.dll) не требуют своего размещения в данной папке.

В редакторе программного кода необходимо создать объект типа dll, это можно сделать следующим образом: dll произвольный_идентификатор("путь_и_имя_файла"). Все пути к DLL (за исключением системных) указываются относительно папки имя_пользователя\Documents\NeTTradeX Advisors\scripts\libraries.

Вызов функции из указанной библиотеки осуществляется при помощи метода Call или CallProc. Различие между методами заключается в следующем: когда функция из библиотеки возвращает значение int, используется метод Call, когда функция не возвращает никакого значения (void), используется метод CallProc.

Допустим мы создали объект dll mydll("test.dll") и в библиотеке существует функция int func(int a, int b), которую мы хотим использовать. Вызов этой функции в коде будет иметь следующий вид mydll.Call("func",a,b).

При передаче в файл библиотеки переменные типа bool, int8 и int16 преобразовываются к типу int (int32 - синоним типа int).


Пример.

Продемонстрируем, как можно вывести сообщение пользователю при помощи стандартной библиотеки user32.dll. При запуске скрипта Вам понадобится поставить галочку напротив Allow DLL usage на вкладке Common свойств советника. Данный советник в момент запуска будет запоминать текущую цену и затем, при росте цены на более чем на 20 пипсов, выводить сообщение "The price has gone up", а при падении на 20 пипсов - "The price has gone down".

 #define MB_OK 0x00000000 #define MB_ICONEXCLAMATION 0x00000030 bool priceLevelIsSet = false; double price; int Run() { if(priceLevelIsSet == false) { price = Symbols.LastBid(Chart.Symbol); System.Print("Price level = "+price); priceLevelIsSet = true; } dll _dll("user32.dll"); if(Symbols.LastBid(Chart.Symbol)>price + 20*Chart.Point) { _dll.CallProc("MessageBoxA",0,"The price has gone up.","Notification",MB_OK|MB_ICONEXCLAMATION); return -1; } if(Symbols.LastBid(Chart.Symbol)<price - 20*Chart.Point) { _dll.CallProc("MessageBoxA",0,"The price has gone down.","Notification",MB_OK|MB_ICONEXCLAMATION); return -1; } return(0); }