ГЛАВА 6. EasyLanguage и Другие Языки
EasyLanguage дает возможность Вам использовать функции, постоянно находящиеся в библиотеках динамической связи (написанных или в ваших торговых сигналах, методиках анализа и функциях). Это означает, что в дополнение ко всем зарезервированным словам EasyLanguage и функциям, Вы также имеете в вашем распоряжении любую функцию в DLL, которые написаны в C или с использованием TradeStation Technologies EasyLanguage DLL Extension Kit, который состоит из четырех файлов и детальной документации. Эта глава представляет Вам это комплект и обсуждает использование функций DLL с EasyLanguage.
Это - усложненный раздел, и эта глава предполагает, что Вы знаете C, а также как создать Windows DLL файл.
Определение Функции DLL
Прежде, чем Вы сможете вызвать функцию DLL от EasyLanguage, Вы должны объявить DLL с использованием DLL инструкции Function Declaration.
Синтаксис:
DefineDLLFunc: "DLLNAME.DLL", Return Type,
"FunctionName", Parameters;
DLLNAME.DLL - имя DLL, где функция постоянно находится, Return Type - тип выражения, которое функция возвратит, FunctionName - имя функции как определено в DLL, Parameters - список параметров, ожидаемых функцией (каждый параметр, отделенный запятой).
Очень важно помнить, что 32-разрядные DLLs используют экспортируемые объявленные функции с учетом регистра, используя _cdecl, stdcall, или fastcall. Для DLLs, чтобы быть совместимым с EasyLanguage, экспортируемые функции должны быть созданы с использованием прописных букв и должны объявлены как _stdcall. Эти экспортируемые функции должны быть перечислены в пределах раздела EXPORTS .DEF файла DLL. Использование "_declspec (dllexport)" от прототипа функции недостаточно для EasyLanguage, чтобы определить местонахождение экспортируемых функций DLL.
Например, следующая инструкция объявляет функцию по имени MessageBeep, которая постоянно находится в DLL по имени USER32.DLL. Она возвращает булево (истинное/ложное) значение и ожидает один параметр, int.
DefineDLLFunc: "USER32.DLL", bool, "MessageBeep", int;
Data Types
EasyLanguage поддерживает множество типов достоверных данных, которые могут использоваться, чтобы посылать и получать информацию к функциям, содержавшимся в DLLs. Ниже - список типов данных, поддерживаемых EasyLanguage:
 |
| BYTE
|
1 byte integer data type.
|
| char
|
1 byte integer data type.
|
| int
|
4 byte signed integer data type.
|
| WORD
|
2 byte unsigned integer data type.
|
| long
|
4 byte signed integer data type.
|
| DWORD
|
4 byte unsigned integer data type.
|
| float
|
4 byte floating point data type.
|
| double
|
8 byte floating point data type.
|
| BOOL
|
4 byte boolean data type.
|
|
 |
 |
 |
| Варианты:
|
| UNSIGNED LONG
|
Same as DWORD.
|
| VOID
|
Means "No returned value".
|
| Типы указателей:
|
| LPBYTE
|
Pointer to a BYTE.
|
| LPINT
|
Pointer to an int.
|
| LPWORD
|
Pointer to a WORD.
|
| LPLONG
|
Pointer to a LONG.
|
| LPDWORD
|
Pointer to a DWORD.
|
| LPFLOAT
|
Pointer to a float (in float FAR).
|
| LPDOUBLE
|
Pointer to a double (in double FAR).
|
| LPSTR
|
Pointer to a char.
|
|
 |
 |
Все указатели - 32-разрядные указатели, и EasyLanguage обрабатывает каждого из них тем же самым способом.
Также, очень важно помнить, что все значения в EasyLanguage - плавающие, кроме значений Open, High, Low and Close, которые являются целыми числами. Чтобы управлять этими ценами, Вы должны послать функции ценовой масштаб символа, который составляет график.
Например, если бумага имеет ценовой масштаб 1/1000, а окончательная цена была 105.125, эту цену будут посылать DLL как 105125. Для DLL, чтобы знать, как читать эту цену, Вы должны послать значение в зарезервированном слове PriceScale, которое в этом случае возвращает значение 1 000.
Использование Типов данных Указателя
Типы данных указателя предназначены, чтобы передать адреса памяти и пункты данных к функции DLL. Все указатели, используемые в EasyLanguage, обрабатываются как 32-разрядные указатели. Чтобы получить указатель любого элемента данных в EasyLanguage, пользователь должен поставить перед элементом данных амперсанд (&).
Например, чтобы обратиться к адресам открытия и максимума бар назад и значению переменной value1 два бара назад, Вы используете следующие выражения:
&Open Address of the open price of the current bar.
&High[1] Address of the high price of the previous bar.
&Value1[2] Address of the Value 1 variable of two bars ago.
EasyLanguage в настоящее время поддерживает адреса для следующих объектов данных:
Все значения Date, Time, Open, High, Low, Close, Volume, OpenInt.
Все true/false и числовые переменные, включая предопределенные переменные.
Все true/false и числовые массивы.
Текстовые строки передают адрес как значение по умолчанию, когда используется тип параметра LPSTR . Не изменяйте размер переданной строки в пределах вашего DLL, поскольку это может вызвать непредсказуемые результаты.
Следующий пример использует правильный синтаксис для включения типа данных указателя как один из параметров, посланных функции от DLL в инструкции.
DefineDLLFunc: "C:\UserDLL\MyLib.DLL",int,"MyFunc", LPLONG;
If MyFunc(&Close) > 0 Then
Buy next bar at market;
Очень важно помнить, что указатели не могут быть правильно назначены на переменную или элемент массива. Поскольку ни переменная, ни элемент массива не имеют необходимую точность, чтобы держать указатель, Вы не должны пробовать сохранить указатель для более позднего использования.
ЗАПРЕЩЕНО: следующий пример запрещен в текущей версии EasyLanguage, поскольку он приводит к непредсказуемому результату, когда на Value1 ссылаются в более позднее время.
Value1 = &Open;
Также, не предполагайте, что есть какие-либо отношения между двумя адресами памяти. Например, не применяйте &Open[1] как равный &Open[0] плюс 4. Вы должны всегда использовать обеспеченные Функции ELKIT32, чтобы исполнить вычисления указателя.
Использование Функций от DLL
Однажды определенную инструкцией DefineDLLFunc функцию DLL можно вызвать от EasyLanguage способом, аналогичным вызову любой другой функции EasyLanguage. Функцию DLL можно вызвать в пределах выражения или как явную инструкцию, если возвращаемое значение не используется. Чтобы вызывать функцию DLL, пользователь должен определить имя функции и включить все параметры в пределах круглых скобок. Если используются множественные параметры, они должны быть отделены запятыми.
Например, чтобы использовать функцию по имени MessageBeep, которая включена в USER32.DLL, может использоваться следующая инструкция:
DefineDLLFunc: "USER32.DLL",bool, "MessageBeep", int;
If Open > Close Then
MessageBeep (0);
Второй пример:
DefineDLLFunc: "MYLIB.DLL", int, "MyAverageFunc", multiple;
Value1 = MyAverageFunc ("Open = ", (LONG)Open);
Возвращаемое значение функции MyAverageFunc назначено на Value1. Обратите внимание, что спецификатор типа данных (LONG) включается перед значением второго параметра. Этот спецификатор необходим, потому что MyAverageFunc объявляет множественные поля параметра. В этом образце, спецификатор типа данных должен предшествовать каждому параметру. Исключение к этому правилу - когда текстовая строка используется как параметр функции DLL как в Примере 2. С учетом этого исключения мы знаем, что типом данных должен быть LPSTR. Поэтому, никакой спецификатор типа данных не необходим, даже когда используется MULTIPLE . Это - к тому, почему нет никакого спецификатора типа данных перед строкой "Open =".
Дополнительно о EasyLanguage DLL Extension Kit
EasyLanguage DLL Extension Kit состоит из четырех файлов:
ELKIT32.DLL
ELKIT32.H
ELKITVC.LIB (для использования только с VC++)
ELKITBOR.LIB (для использования только с Borland Builder)
Эти файлы расположены в каталоге \Omega Research\Program, а документация для комплекта представлена на компакт-диске программы.
EasyLanguage Toolkit Library (ELKIT32.DLL) - динамически компонуемая библиотека, которая предоставляет полезные функции, которые можно вызвать от любого пользовательского DLL. Обычно используется, чтобы найти адрес смещения EasyLanguage объекта данных изнутри пользовательского DLL.
Чтобы установить документацию, просмотрите компакт-диск программы и найдите папку по имени DEVKIT. Выполните файл setup.exe из этой папкой, чтобы установить документацию.
|