为MetaTrader 4开发了一个API函数库 - 页 7

 
下午好,所以我咨询了我认识的一位程序员,他解释说,如果这个DLL不是专门为在Omega中使用而编写的,就不能保证功能。因为Omega可能在DLL的函数调用参数中没有我们需要的资源。下面是一个例子:
int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
这一行不支持Omega中 "TDateTime *tim "这样的数据。
这意味着只有没有设置参数的终端的开始和结束功能才起作用。在设置参数的地方,我们需要知道DLL采取的是什么参数,如果有例子就更好了。
我想你必须在Delphi中看一个例子,有一个程序员可以准确地告诉你你需要什么,然后寻找Omega工具来向DLL提供所需的参数。如果你想发布一个专门针对Omega的DLL版本,这将使它在快速测试和使用方面变得不可估量,我认为会有很多使用Omega的用户。已经有一些感兴趣的用户。下面是Omega HELP的一小段摘录:
一个重要的点是支持的数据类型列表,见下文。



DLL 函数定义

在从 EasyLanguage 调用 DLL 函数之前,您必须使用 DLL 函数声明指令声明 DLL。

语法。

DefineDLLFunc: "DLLNAME.DLL", Return Type, "FunctionName", Parameters;

DLLNAME.DLL是函数所在的DLL名称,Return Type是函数将返回的表达式类型,FunctionName是DLL中定义的函数名称,Parameters是函数预期的参数列表(每个参数用逗号分隔)。

记住32位DLL使用导出的、区分大小写的、使用_cdecl、stdcall或fastcall的声明函数,这一点非常重要。为了使DLL与EasyLanguage兼容,导出的函数 必须使用大写字母创建,并且必须声明为_stdcall。这些导出功能必须列在DLL文件的EXPORTS .DEF部分。在函数原型中使用"_declspec (dllexport) "不足以让 EasyLanguage 找到导出的 DLL 函数。

例如,下面的指令声明了一个名为MessageBeep的函数,该函数永久地位于一个名为USER32.DLL的DLL中。它返回一个布尔值(真/假),并期望有一个参数,即int。

DefineDLLFunc: "USER32.DLL", bool, "MessageBeep", int;

数据类型

EasyLanguage支持许多有效的数据类型,可用于向DLL中包含的函数发送和接收信息。以下是EasyLanguage支持的数据类型列表:

基本数据类型:

BYTE
1字节的整数数据类型。

char
1字节的整数数据类型。

int
4字节有符号整数数据类型。

WORD
2个字节的无符号整数数据类型。

long
4字节有符号整数数据类型。

DWORD
4字节的无符号整数数据类型。

float
4字节的浮点数据类型。

double
8字节的浮点数据类型。

BOOL
4字节的布尔数据类型。




变体:


UNSIGNED LONG
与DWORD相同。

VOID
意味着 "没有返回值"。

指针类型:


LPBYTE
指针指向一个BYTE。

LPINT
指向一个int的指针。

LPWORD
指向一个WORD的指针。

LPLONG
指向一个LONG的指针。

LPDWORD
指向一个DWORD的指针。

LPFLOAT
指向浮点数的指针(以浮点数FAR为单位)。

LPDOUBLE
指向一个双数的指针(在双数FAR中)。

LPSTR
指向一个char的指针。


所有指针都是32位指针,EasyLanguage以同样的方式处理每一个指针。

记住EasyLanguage中的所有数值都是浮点数,除了开盘价、最高价、最低价和收盘价是整数,这一点也非常重要。为了控制这些价格,你必须向构成图表的符号发送价格刻度功能。

例如,如果一个证券的价格比例是1/1000,而最终的价格是105.125,那么这个价格将被发送到DLL,成为105125。为了让DLL知道如何读取这个价格,你必须在保留字PriceScale中发送这个值,在本例中它会返回值1,000。
 
Omega可能在DLL函数调用的参数中没有你需要的资源。下面是一个例子:<br/ translate="no"> int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
在这一行中,"TDateTime *tim "类型的数据不被Omega支持。

现在一切都说得通了。为了解决这个问题,尝试在Omega中指定double类型,而不是TDateTime--即int TikKot(char, double, double, double); 实际上,这些类型很容易互换,并且各使用8字节的内存。好运!
 
好的,谢谢。那么 "char "类型呢,Omega需要Numeric,但DLL需要text?是否有可能更换它?
 
好的,谢谢。那么 "char "类型呢,Omega需要Numeric,但DLL需要text?能否用?<br / translate="no">

为什么?这是在描述中。
LPSTR
指向一个字符的指针。

这是同一件事。欧米茄文档中是否有这些类型的变量的例子?你需要在那里仔细寻找类似的变体。好运!
 
下午好,找到了问题:
这是来自DLL帮助:

注意:32位DLL使用大小写的导出函数,这些函数使用_cdecl, _stdcall , 或fastcall声明。为了使DLL与EasyLanguage兼容,导出的函数应使用所有大写字母创建,并声明为_stdcall。这些导出的函数必须列在DLL的.DEF文件的EXPORTS部分。在函数原型中使用"_declspec (dllexport) "不足以让 EasyLanguage 找到 DLL 的导出函数。

因此,这里说Omega只对那些用大字书写的函数起作用。我检查了它在另一个DLL中的写法,真的只有大写字母。
如果你改变功能调用(名字用大写字母),那么我们可以进一步测试。
我个人对你们的产品非常感兴趣,我对你们的要求是将DLL适合于Omega。我希望它能发挥作用...好运!
如果你不这样做,那么请在这里发帖,我将不得不在另一个贸易自动化解决方案中工作。谢谢你。
 
<br / translate="no"> 如果你改变了Function的调用(名字用大写字母),那么你可以进一步测试。
我个人对你们的产品非常感兴趣,我对你们的要求是将DLL适合于Omega。我希望它能发挥作用...好运!

我做了一个带有大功能字母的变体,并把它发送到你的收件箱。好运!
 
非常感谢,我将进行测试并公布结果。