新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1011

 
Sergey Likho:

编写算法的最佳方式是什么?


任务。

一个专家顾问在不同的图表上运行。

我需要有一个单独的文件,其中有关于账户、余额、权益等的每分钟信息

现在发现,所有的Expert Advisors都在一个文件中写入所有信息。因此,我们有很多不必要的条目。

可能的原始解决方案是什么,以便只有一个机器人会在文件中做记录(而且,如果它被删除,另一个机器人会开始做记录,等等)。

在OnInit()中用EA的名字或任何其他对象创建一个图形对象。 也许,EA已经在创建一个对象,你可以使用它,例如 "MyEA":ObjectCreate(0,"MyEA",OBJ_...,...))

在OnTick()中,在向文件写入时,我们需要检查第一个带有这个标签的图表ID = 这意味着这是安装在终端的第一个专家顾问,我们对其他的不感兴趣。

我们必须使用过冲量。

string ChartGetSymb()
  {
   string symb="";
   long chartID=ChartFirst();
   while(chartID!=-1) 
    {
      if(ObjectGetString(chartID,"MyEA",OBJPROP_NAME)=="MyEA")
       {
        symb=ChartSymbol(chartID);
        break;
       }
      chartID=ChartNext(chartID);
     }
   return(symb);
  }

我们得到了第一个安装有专家顾问的图表/符号

然后,在将其写入文件之前,我们将其与第一个专家顾问进行比较。

if(ChartGetSymb() == Symbol()) {
  записываем в файл, если соответствует символу, иначе не записываем
}


这不是一个简单的结构,但它比写入全局变量要好。

 
Artyom Trishkin:

采取标准的MA,改变缓冲区数据类型,编译并在终端数据窗口检查(Ctrl+D)。

这不会有帮助,因为它不会在终端中显示出来。但我在ZigZag指标中检查了它,它有两个额外的缓冲区,分别是作为INDICATOR_CALCULATIONS声明的High和Low。它们也是从程序中提取的,尽管它们没有显示在终端。无论如何,谢谢你的提示。
 
Sergey Likho:

ChartID()被写入终端的全局变量,并出现错误。这是什么乱七八糟的东西?


试试这个代码。


执行这段代码的结果是

2019.11.29 15:22:07.453 Script 00 EURUSD,H1: removed
2019.11.29 15:22:07.453 00 EURUSD,H1: uninit reason 0
2019.11.29 15:22:07.453 00 EURUSD,H1: GVAR id:131992895281608496 GV_id:131992895281608496
2019.11.29 15:22:07.453 00 EURUSD,H1: initialized
2019.11.29 15:22:07.433 Script Test\00 EURUSD,H1: loaded successfully
 
Vitaly Muzichenko:

在OnInit()中创建一个图形对象,名称为EA或任何其他对象,也许EA已经创建了一个对象,那么你可以使用它,我们假设为 "MyEA":ObjectCreate(0,"MyEA",OBJ_...,...))

在OnTick()中,在向文件写入时,我们需要检查第一个带有这个标签的图表ID = 这意味着这是安装在终端的第一个专家顾问,我们对其他的不感兴趣。

我们必须使用过冲量。


我们得到了第一个安装有专家顾问的图表/符号

然后,在将其写入文件之前,我们将其与第一个专家顾问进行比较。


这不是一个简单的结构,但它比写入全局变量要好。

是的,好主意。

谢谢你。


问题是,如果EA已经被删除(例如由于错误),但该对象仍然存在,怎么办?如果图表被完全关闭,我们应该以某种方式重新分配 "主 "EA,该怎么做?

 
Sergey Likho:

是的,这是个好主意。

谢谢你。


问题是:如果EA已经被删除(例如由于一个错误),但对象仍然存在,该怎么办?如果图表被全部关闭,我们需要以某种方式重新分配 "主 "专家顾问,该怎么做?

只有一种情况会出现错误--如果专家顾问被意外删除,而对象被留下,但在我的记忆中,我不记得MT4有这样的错误。在所有其他情况下,首席专家顾问将被重新分配。


P.S. 尝试检查OnDeInit()是否会在专家顾问中错误输出并从图表中自我删除。也许,你可以通过创建一个变量并计算刻度,并在第11个刻度上除以10/0来轻松地检查它。

在OnDeInit()中,使用Print并查看去初始化的原因,如果它发生了,那么通过这个原因/数字从图表中删除对象 "MyEA"。

t++;
if(t > 10) {
 int e = 10;
 e /= 0;
}

你可以写下结果,因为我没有时间自己去检查。

 
Vitaly Muzichenko:

在OnInit()中创建一个图形对象,名称为EA或任何其他对象,也许EA已经创建了一个对象,那么你可以使用它,我们假设为 "MyEA":ObjectCreate(0,"MyEA",OBJ_...,...))

在OnTick()中,在向文件写入时,我们需要检查第一个带有这个标签的图表ID = 这意味着这是安装在终端的第一个专家顾问,我们对其他的不感兴趣。

我们必须使用过冲量。


我们得到了第一个安装有专家顾问的图表/符号

然后,在将其写入文件之前,我们将其与第一个专家顾问进行比较。


这不是一个简单的结构,但它比写入全局变量要好。

我认为你搞错了。GVs不是每次都写到磁盘上。否则就没有必要强制GV到磁盘。

void  GlobalVariablesFlush();
在此基础上,翻阅所有的图表,寻找EA和对象...维塔利,这真令人遗憾......
 
Alexey Viktorov:

我认为你搞错了。GVs不是每次都写到磁盘上。否则我们就不需要强制GV写入磁盘的功能了。

是的,再加上通过所有的图表来寻找EA和对象...维塔利,这真令人遗憾......

是的,它们是:GlobalVariableSet("GV",ID)。

概况 -> gvariables.dat


 
Vitaly Muzichenko:

还有它们的写法:GlobalVariableSet("GV",ID)。

概况 -> gvariables.dat


当你创建它时,也许是,但当你在禁用写在那里的应用程序之前覆盖它时,你必须检查。我太懒了。不过,纯粹从理论上讲,如果每次都要写到磁盘上,那么上述功能就会成为一种响声。

 
Sergey Likho:

你不能这样做。

寻找一个能够同步 文件夹中数据 的Windows程序。并进行设置,使专家顾问自动复制到新的终端。

据我所知,有这样的程序,但它们只对文件起作用,但如果是文本文件,它不会复制内容,也不会替换文件,也许我没有找到一个正常的程序。太糟糕了,开发人员没有考虑指定从哪里下载专家顾问或机器人文件的选项,我以为我可以像通常那样指定路径,但正如你上面指出的那样,这是不可能的。

 
Seric29:

据我所知,有这样的程序,但它们只对文件起作用,但如果是文本文件,内容就不会被复制,文件也不会被替换,也许我没有找到正常的程序。我认为开发者没有考虑到设置获取机器人或专家文件的路径的可能性是很糟糕的。 我以为可以像通常那样设置路径,但正如你上面所指出的,这是不可能的。

注意这个帖子中的 "所有终端都有共享文件夹"。

这是不可能的。 关于交易、自动交易系统和交易策略测试的论坛

如果我想使用市场上的产品,我应该怎么做?

谢尔盖-塔波林, 2019.11.23 08:17

你真的以为我不知道如何安装和在哪里安装吗?)))

所有终端都有共同的文件夹

我从市场上下载了一个免费指标。它与硬件结合在一起。

为什么它在一个硬件上工作,而在另一个硬件上不工作?

明显的结论是--它被捆绑了,至少不仅仅是与硬件相关...


搜索有关如何做到这一点的信息,然后就可以走了......这就是所谓的文件夹链接。