连接了() - 页 4

 
7bit:

它可以被检查,只是在一个无限循环中运行检查。在连接中断时启动终端时如何启动 这个循环是一个完全独立的问题。一旦你让你的循环运行,它就会做预期的事情。

你的问题与IsConnected()函数没有关系。用同样的论据,你也可以抱怨Print()或Alert()或任何其他你无法调用的函数,因为你在一开始就 因为一些完全不同的 原因无法启动整个代码


好吧,让我解释一下,因为我一直在使用大量的终端系统,我的CPU使用率上升到了100%,这就是为什么我需要关闭一些终端。

当我打开它们时(当然是自动的),我看到有几次它们没有连接,而在它们上运行的EA没有报告没有连接。

这就是我开始这个话题的原因,到目前为止,我发现的唯一方法就是像我上面说的那样,用外部程序来解决。

 

也许 这与Windows XP SP2首次引入的 "功能 "有关,它拒绝在任何时候有超过少数几个 半开放的连接,主要是为了惹恼那些想使用网络密集型应用程序的人。AFAIK存在一些方法来修补这个恼人的 "功能",并恢复正常的操作性:http://blog.davidkaspar.com/archives/2005/04/windows-xp-sp2-and-event-id-4226.php

在windows事件日志中寻找4226事件。

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

这很好,但并不总是有效,因为在init()返回之前,tick可能已经消失,在这种情况下,tick会被丢弃。为了强调这一点,如果你在启动()后添加一个5ms的停顿,那么你就可以在启动()后添加一个停顿。

PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return

那么start()将不会被执行。

是否有一个更好的解决方案,让start()在专家顾问加载时执行,而不需要经纪商的真实tick

 

我有点老了,但 正在寻找 解决这个 问题 方法

事实上,qjol所说的 "唯一的办法是用脚本来做;问题是没有办法在加载了脚本的情况下打开终端 "是部分正确的。用脚本可以,但有一种方法可以在客户端启动脚本。这在metatrader的帮助中有所记载(F1,工具,启动时的配置)。可能在这个话题开始的时候,它还不一样。

所以我开发了一个小脚本来完成这个工作。在启动脚本中使用这个脚本,例如 。

  ; open chart and run expert and/or script
  Symbol=EURUSD
  Period=H4
  Template=popular.tpl
  Expert=
  ExpertParameters=
  Script=CheckConnection
  ScriptParameters=

在启动终端的时候,会出现类似".NET "的字样。

"...\Metatrader 4\terminal.exe" config\start.ini

附加的文件:
 

嗨,伙计们。

你知道 你们 中的任何一个人 为什么 不工作脚本假ticks -https://www.mql5.com/en/forum/128803/page2#373539(第2页)这个线程的构建600++?

我的操作系统是Vista。谢谢你。

 
endy5:

嗨,伙计们。

你知道 你们 中的任何一个人 为什么 不工作脚本假ticks -https://www.mql5.com/en/forum/128803/page2#373539(第2页)这个线程的构建600++?

我的操作系统是Vista。谢谢你。

由于Build > 600,你必须把Ansi的 "A "替换成unicode的 "W"。

int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
int RegisterWindowMessageA(string lpString);
 

为什么它在参数 中使用2和1

PostMessageA(hwnd, msg, 2, 1)
 
iamsuman2:

为什么它在参数中使用2和1

这超出了MQL的范围,请查看这里 的功能。

 

如果有人正在寻找关于IsConnected()函数 的信息。

所以是的,该函数在start()函数或OnTick()函数下不会工作,因为如果没有连接,那么就不会有新的tick到达,并且该函数不会触发反正....。

那么我们应该怎么做呢?

使用OnTimer()函数,定期检查连接情况,而不管是否有新的刻度线。

int timer = 60;   //60 seconds, for example
int OnInit()
  {
//--- create timer
   EventSetTimer(timer);  //could use EventSetMillisecondTimer(timer) for millisecond resolution
//---
   return(INIT_SUCCEEDED);
  }

// Metatrader self-triggered function, will be called regularly
void OnTimer()
  {
    if(!IsConnected())
      Alert("Problem, not connection to the server!");
  }

void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
      
 

fridayda13:

所以是的,该函数在start()函数或OnTick()函数下不会起作用,因为如果没有连接,那么就不会有新的tick到达,并且该函数不会触发反正....。

那么我们应该怎么做呢?

使用OnTimer()函数,定期检查连接情况,而不管是否有新的刻度线。

你应该什么都不做,因为你什么都做不了。在网络超时和函数 变值之前需要30多秒。当什么都没有改变,你也没有连接时,你要做什么呢?

只有在你从未从start/OnTick 返回的情况下才有用(在OrderSend 之前检查),或者在OrderSend 之后,在同一个tick内重试。

相反,如果OrderSend 失败,记录它,返回并在下一个tick上测试/重试。完成了。