连接了() - 页 2

 
Matutin:

只要在init()中调用start()......你就会进入start(),即使没有tick出现!

谢谢你 2
 
Viffer:

根据我上面的链接展开...我运行一个单独的EA来监控连接状态。它基本上有我的测试的所有代码,在开始时编码,最后是睡眠。开始基本上是一个大的循环,当它完成时,它又回到了起点。但我并没有等待一个tick来触发启动,而是在init()中调用start()。这样一来,start()继续在睡眠中循环,而init()永远不会结束,所以代码根据睡眠的时间间隔运行,而不是等待tick......上面的链接显示了原理......

hth

V


Matutin:

只要从init()调用start()......你就会进入start(),即使没有tick出现!


这两种方法都不能解决问题,因为如果没有连接,init()也不会启动。

做到这一点的唯一方法是使用脚本;问题是没有办法在加载了脚本的情况下打开终端。

 
qjol:


这两种方法都不能解决问题,因为如果没有连接,init()也不能启动。

唯一的办法是使用脚本;问题是没有办法用加载的脚本打开终端。


让我们看看MT4i.com的工具。我使用它们来监测连接情况,并通过邮件或短信发送警报。

http://www.mt4i.com/mtdashboard.aspx

 
Matutin:

只要从init()中调用start()......你就会进入start(),即使没有tick出现!

不!这是不允许的。这是不允许的, init()应该在2秒后返回。init不允许阻塞! 各种各样的问题都可能(而且会)由此产生。

只要在start中进行循环,并期望start在加载EA后的下一个可用tick时被自动调用。 连接断开之前就 已经有刻度了,所以当这个事件发生时,你的循环已经在运行了。


如果你真的需要在init()中触发start(),因为你需要它在周末运行,那么唯一正确的方法是使用PostMessage()技巧来执行tick。你发布信息,然后让init返回!然后,MT4将以正常方式调用start(),init()不会阻塞。


请看下一篇文章中的例子。

 
// this is an EA

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return
   return(0);
}


int start(){
   while (!IsStopped()){
      // do your stuff here
      Sleep(1000);
   }
   return(0);
}
这是唯一正确的方法,可以从EA的init()中强制启动()。你不允许在指标中这样做,因为那里的start()将在GUI线程中运行。
 
/**
* MT4/experts/scripts/ticks.mq4
* send a fake tick every 200 ms to the chart and
* all its indicators and EA until this script is removed.
*/

#property copyright "© Bernd Kreuss"

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int start(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   while(!IsStopped()){
      PostMessageA(hwnd, msg, 2, 1);
      Sleep(200);
   }
}
为了完整起见,以上是我在周末用来模拟假的刻度线的脚本。你不需要它,它只是一个例子。这主要是用于调试其他EA和指标的作用。
 
/**
* this is a variation of the above script meant to be run as an EA.
* Send a fake tick every 200 ms to the chart and
* all its indicators until this EA is removed.
*/

#property copyright "© Bernd Kreuss"

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue the first fake tick
}

int start(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   while(!IsStopped()){
      PostMessageA(hwnd, msg, 2, 1);  // produce more fake ticks
      Sleep(200);
   }
}

这与上面的脚本相同,但作为一个EA实现,在一个EA中展示了这两个概念。

在init()中,它将会排队等待第一个tick来触发第一个start(),然后在start()中,它将会在一个无限循环中产生更多的tick,然后这些tick将被同一图表上的所有指标所接收。

 
7bit:
这是唯一正确的方法,可以从EA的init()中强制启动()。你不允许在指标中这样做,因为那里的start()将在GUI线程中运行。

// this is an EA

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return
   return(0);
}


int start(){
   while (!IsStopped()){
      // do your stuff here
      Sleep(1000);
   }
   return(0);
}

试着把这个EA放在图表上,关闭终端,然后关闭你的网络连接,再打开你的终端(当网络连接被关闭时),你会发现它不起作用。

 
qjol:


试着把这个EA放在图表上,关闭终端,然后关闭你的互联网连接,再打开你的终端(当互联网连接关闭时),你会发现它不工作。

但是,一旦它在正常情况下被启动,它应该继续 运行(这应该是正常的使用情况)。试着在它被启动后断开连接。


而且它可以作为一个例子,说明如何避免阻塞的init(),并作为一个EA而不是脚本运行。

 
7bit:

但它一旦在正常情况下被启动,就应该继续 运行(这应该是正常的使用情况)。试着在它被启动后断开连接。


并作为一个例子,说明如何避免阻塞的init(),并作为EA而不是脚本运行。


你是对的,但我不是在寻找你所描述的情况的解决方案,我是在寻找我所描述的情况的解决方案,现在我找到的唯一解决方案,即,外部软件,会运行一个脚本