用VB编写的带有输出函数的DLL能在MT4中调用吗?

 

因为在自定义指标中不能使用Sleep函数,所以我用VB调用API生成了一个带有输出函数的DLL

函数主体如下:

API声明部分

public function VBsleep(time as integer)

sleep time '调用API函数以实现暂停指定秒数

END function

生成的DLL的输出函数是:VBsleep

请问在MT4中如何调用这个DLL

请各位高手帮帮忙,谢谢了!

或者有没有办法在MT4中直接调用API中的Sleep函数呢>?

 
See Sleep
 

The Sleep() function cannot be called from custom indicators since they calculate in the interface thread and may not decelerate it.
The checking of the expert stop flag status every 0.1 second has been built into the function.

请教版主,这两句准确的意思是什么?

因为我们英文不行,如果可以的话,MT4中的帮助就可以够我们研究了

所以请版主帮忙介绍下这两句话的意思

还有,如果版主有相关的DLL调用实例的话,请介绍一下或给个链接

而且MT4中的DLL实例,我试过根本就不行,不知道是不是我下的功夫不够,请版主不吝赐教, 谢谢!

 
I don't understand what you want. Do you want to use Sleep() or to call dll from MT4?
 

我晕,你不懂中文吗?

我的问题很简单:

1、Sleep函数是否能用自定义指标中使用,有没有什么特殊方法?

2、DLL调用的具体方法是什么?

如果你不会中文,大哥你还是不要回答我的问题了。

我不明白这是中文论坛,还是一个英文论坛。

最后

if (you==chinese)

{

Please speak chinese;

}

 

呵呵,是,他确实不懂中文,他是MT负责这个论坛技术支持的高级技术人员(俄国人),MT软件的设计者之一。

MT自己有Sleep函数,但不能在自定义指标中使用(因为自定义指标在界面线程运行,不允许sleep). 不知道你为什么需要在指标中使用它?一般不需要的。

DLL调用的具体方法: dll符合C调用标准,是标准的DLL, 需要建立声明文件(类似C的头文件简化)声明可调用的函数,就可以使用了。

例子中有,不知道你为什么例子不成功。

即使win自己的winuser32库(\experts\include\WinUser32.mqh)都是这样用的。

 

谢谢楼上的大侠

我还有两点疑问,敬请指点:

1、在自定义指标中是否能用while循环?在移植一个货币强弱指标中

我把原智能交易系统中的下列语句移植到自定义指标中出现错误:(CPU占用率99%)

while (true) //需要每秒更新一次价格,所以采用WHILE死循环
{
if (IsConnected()) main();
if (!IsConnected()) objectBlank();
WindowRedraw();
Sleep(1000);
}

2、鉴定自定义指标中不能使用While死循环,所以我只好尝试用for循环嵌套来实现一天24小时中每秒更新一次价格,如:

for(i=0;i<24;i++)
{
for(j=0;j<3600;j++)
{
if (IsConnected()) main();
if (!IsConnected()) objectBlank();
WindowRedraw();
Sleep(1000);
}
}

但因为Sleep函数在自定义指标无法使用

所以想调用自已编写的DLL来实现sleep函数功能,那么请问MT4是否能直接调用WINDOWS中的API?比如API中的SLEEP函数?

如果可以那么在MT4该如果声明并且调用?

如果不行的话?请问有没有其他的办法来实现一秒获取一次货币对的价格?

请各位大侠在百忙中抽出一点时间指点一下小弟,谢谢了!

Thanks!

 

1 可以用while, 但是不能你这样用! 你这是死循环!!

为什么要用 每秒更新一次? 更新是MT自己控制的,用户可以准备有关代码供MT调用,但不允许用户控制! 指标是在MT的界面线程运行的,不允许独占! 看MT例子设计解决! 

2 这也不允许,你的思路不对,MT不是设计来这样用的.

实现一秒获取一次货币对的价格?不行! 这违背MT设计,不能使用!

一般根本不需要一秒获取一次货币对的价格, 你为什么需要强调一秒? 

 

我要做的是一个货币强弱指标,原指标运用了while死循环来实现一秒获取一次价格(利用MarkInfo函数), 它将数据显示在K线图窗口,

而我现在需要把它显示在一个分离的窗口中,并且只能用自定义指标

修改后的指标,因为没有办法实现一秒获取一次货币对的价格,所以跟原指标比起来,数据总是延迟几秒

仔细研究后发现:因为自定义指标只是运行在一个指定的窗口中(如:EUDJPY,H4),所以他不能及时的获取所有价格对的数据

因而存在着延迟,所以才考虑用DLL之类的来实现SLeep功能

感谢474大哥的帮忙,其实我用自定义指标开分离窗口加智能交易系统提取数据的方法已经实现了想要实现的功能

但是玩编程就是这样,越难以实现的东西,总是越想去实现

呵呵,听说用VC编写的DLL可以注入线程,但是本人技术太烂了

再次感谢474大哥的耐心回复!

不过如果您有时间,请再帮忙解决小弟的一个疑问:

用VB编写的DLL虽然带有输出函数,但是不是标准的DLL,依然是COM类的DLL,所以不能调用成功,这个通过您的解答我已经知道了。

但是为什么MT4中自带的那个示例DLL我调用也不成功呢?

程序执行到调用DLL中函数的那行,就停止运行了,这是为何呢?

如:

#import "EXP.dll" //示例中的DLL已经复制到指标文件夹,更名为EXP. dll

int GetIntVlaue(int)

#import

int init()

{

double i=1.111;

int j;

j=GetIntVlaue(i);//执行到此处程序就不有继续往下执行了

Alert(j);//显示J的值,测试GetInVlaue()函数是否起作用

}

 

玩编程就是这样?那你就继续玩吧!

呵呵,我玩编程是解决问题的,你现在是在和MT程序合作工作的,你无法做MT自己做的事。

真想玩编程,就自己遍个MT出来,那才是玩编程。现在既然是依靠MT,自然只好和MT合作。

试试:

int init()

{}

int start()

{

double i=1.111;

int j;

j=GetIntVlaue(i);//执行到此处程序就不有继续往下执行了

Print(j)

Alert(j);//显示J的值,测试GetInVlaue()函数是否起作用

return(0);

}

//示例中的DLL已经复制到指标文件夹??????????

DLL应该在\experts\libraries