程序库: Expert - 页 7

 

与 MT4 不同,MT5 在启动或更改智能交易系统时不会记录其输入参数。因此,无法从日志中确定在终端中启动了什么。

类似功能可以纠正这种情况。

#include <fxsaber\Expert.mqh> //https://www.mql5.com/zh/code/19003

// 输出运行中的 EA 数据
string EAToString( const long Chart_ID = 0 )
{
  string Names[];
  MqlParam Params[];
  
  const int Flag = EXPERT::Parameters(Chart_ID, Params, Names);
  const int Size = ArraySize(Names);
  
  string Str = "Expert " + Params[0].string_value + ", expertmode = " + (string)Flag;
  
  for (int i = 0; i < Size; i++)
    Str += "\n" + Names[i] + " = " + Params[i + 1].string_value;
    
  return(Str);    
}


应用程序

input int inInput1 = 1;
input int inInput2 = 2;

int OnInit()
{
  Print(EAToString());
  
  return(INIT_FAILED);
}


结果

Test8 (EURUSD,M1)       Expert Experts\Test8.ex5, expertmode = 4
Test8 (EURUSD,M1)       inInput1 = 1
Test8 (EURUSD,M1)       inInput2 = 2


遗憾的是,该功能对脚本不起作用。MT4 可自行输出脚本的输入参数,而 MT5 则不行。

 
我无法运行使用该库的动态链接库的 EA。在日志中,不允许加载 DLL。有什么办法可以解决这个问题吗?
 
pivomoe:
我无法运行使用该库的动态链接库的 EA。在日志中,不允许加载 DLL。有什么办法可以解决这个问题吗?
Params[0].string_value += "\nexpertmode=5"; // 使用 DLL 的权限
 
fxsaber:

很有效。

 
我检查了输入组库 的工作情况。一切正常,我不需要修改代码。
 

我对在字符串中使用常量作为临时模板名称的原则有疑虑:

#define  FILENAME (__FILE__ + ".tpl")

其中包含一个与多线程相关的潜在错误。如果在不同图表上运行的同一个程序尝试使用该库,可能会与模板文件发生碰撞--要么出现访问错误,要么会悄无声息地启动两个完全相同的模板副本,尽管使用的是不同的模板。

您应该生成一个临时名称,最好是 MQL-program-name + timestamp + random(MQL-程序名 + 时间戳 + 随机)的形式(以前是__FILE__ ,"strike "在 html 中不起作用)。

最好还能在下一次调用时自动超时删除以前的文件,例如在 1 天内(通过分析时间戳的一部分),这样就不会在文件夹中乱放了。

PS.情况更糟,因为 __FILE__ 是一个源文件,在所有使用它的程序中都等于 Expert.mqh!按名称更正了句子。
 
Stanislav Korotky:

这样做是经过深思熟虑的,权衡了所有利弊。

创建模板后立即删除是合理的,而不是每天删除一次。不过,始终保留上次保存的模板也很方便,可以更好地分析正在发生的事情。

 
fxsaber:

这是经过深思熟虑、权衡利弊后做出的决定。

创建模板后立即删除是合理的,而不是每天删除一次。不过,始终保留上次保存的模板也很方便,可以更好地分析正在发生的事情。

我无法举出当前方法的任何优点。在我看来,我提出了一个更正确的方法。

如果同步 = true(默认值),立即删除是有道理的,但现在并没有这样做 - 文件仍然存在。

 
Stanislav Korotky:

我想不出目前的方法有什么 "优点"。我认为,建议采用更正确的方法。

优点在于实际应用。我在启动终端 时使用了之前启动的智能交易系统,这些系统一开始就立即进入了它们的模板。它们运行完美。我相信理论上的碰撞是可以重现的。但在我看来,这与实践相去甚远。如果你决定创建一个通用的解决方案,请在这里分享。我会更新 "圣经 "的。我自己还没准备好。

如果同步 = true(默认值),一次性删除是有道理的,但现在并不是这样实现的--文件仍然存在。

是的,我不是故意删除的。

 
fxsaber:

对于 - 这是一个实际应用。我用之前推出的智能交易系统启动了终端,这些系统一开始就立即进入了它们的模板。它们运行完美。我相信理论上的碰撞是可以重现的。但在我看来,这与实践相去甚远。如果你决定创建一个通用的解决方案,请在这里分享。我会更新 "圣经 "的。我自己还没准备好。

是的,我不是故意删除的。

我还是不明白,为什么 Expert.mqh.tpl 这个常量名称比以生成程序命名的模板更 "实用"(实用?假设有一个使用 bibla 的程序 A.mq5 和 B.mq5。如果它们生成的模板都用自己的名字命名,那就更实用了:首先,每个程序都有自己最后的 "动作指纹",而不是一个程序覆盖另一个程序的 "动作指纹"。其次,你可以通过名称立即看出生成者是谁(如果是外国程序,尤其有用)。现在,在进入 Expert.mqh.tpl 文件之前,您无法从文件中看出这一点。我给出的通用解决方案是使用 MQL-programme 的名称+时间戳+随机。我认为没有必要将文件保留为 sync=true。我认为一切都早已经过测试和调试。如果出现错误或需要调试,可以选择 sync=false。这样就可以保留文件。我认为一切都合乎逻辑。编辑也很简单。

我同意在实践中可能很少发生碰撞,除非有人在多个程序中并行使用该手册。我没有这本书,但我刚才快速查看了一下代码,我的目光被文件文件夹中的 Expert.mqh.tpl 吸引住了。一切纯属个人意见。