初学者的问题 MQL5 MT5 MetaTrader 5 - 页 742

 
Klimenko_a_e:

在实际代码中,该函数返回一个对象。

我认为在这种情况下,复制构造函数应该创建一个临时副本。

该代码在MQL5 build 1545中正确工作。

在新版本中,复制构造函数甚至不能调整一维数组的大小:错误4007。

我认为这是不正确的。

在这种情况下,我很难做一个明确的声明。对于你的问题,有非常好的专家,所以我建议把这个问题交给https://www.mql5.com/ru/forum/1111。

经过我的编辑,代码可以正常工作。没有它,就没有。但你的代码是否应该工作,最好是在上面的链接中的分支。

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Klimenko_a_e:

在实际代码中,该函数返回一个对象。

我认为在这种情况下,复制构造函数应该创建一个临时副本。

该代码在MQL5 build 1545中正确工作。

在新版本中,复制构造函数甚至不能调整一维数组的大小:错误4007。

在我看来,这是不正确的。


这个错误已经在Build 1580中被修复,谢谢,一切都在正常工作)。
 
fxsaber:

在这种情况下,我很难说什么定论。对于你的问题,有非常好的专家,所以我建议你向https://www.mql5.com/ru/forum/1111

经过我的编辑,代码可以正常工作。没有它,就没有。但你的代码是否应该工作,最好是针对上面链接的分支。


谢谢你的链接。
 

也许有人能给我一个提示。

我不知道如何在手动改变输入设置后中断EA的执行。

1) 在图表上像这样运行EA代码。

#property version   "1.00"

input int Setting_ = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   Print ("OnInit:",Setting_);
   
   return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print ("OnDeinit(",reason,"):",Setting_);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

2) 打开设置窗口,将 "设置_"参数改为1。

3) 并应用这些变化。

所以,为了开始应用变化,OnInit必须被执行,但OnInit将不会被执行,直到OnTick(或任何其他)的计算停止。

据我所知,只有通过_StopFlag--停止一个mql5-程序的标志来检查停止程序,但它只是为了完全退出。但我不知道如何理解,输入设置已经改变,停止计算。

也许有人遇到过这样的情况?也许有什么秘密的黑客?

 
Marat Sultanov:

也许有人能给我一个提示。

我不知道如何在手动改变输入设置后中断EA的执行。

1) 在图表上像这样运行EA代码。

2) 打开设置窗口,将 "设置_"参数改为1。

3) 并应用这些变化。

所以,为了开始应用变化,OnInit必须被执行,但OnInit将不会被执行,直到OnTick(或任何其他)的计算停止。

据我所知,只有通过_StopFlag--停止一个mql5-程序的标志来检查停止程序,但它只是为了完全退出。但我不知道如何理解,输入设置已经改变,停止计算。

也许有人遇到过这样的情况?也许有什么秘密的黑客?

检查OnInit()中的去初始化代码。

取消初始化的原因

由UninitializeReason()返回的Expert Advisor的去初始化原因代码。它们可以有以下任何一个值。

恒定.

价值

描述

理论_计划

0

专家已经通过调用ExpertRemove()停止了工作。

REASON_REMOVE

1

从图表中删除的程序

原因_重新编译

2

程序重新编译

原因_图表变化

3

图表符号或周期已被改变

原因_chartclose

4

该图表已关闭

原因_参数

5

输入参数被用户改变

REASON_ACCOUNT

6

另一个账户被激活或重新连接到交易服务器,因为账户设置被改变了

原因_模板

7

应用了另一个图表模板

拒绝接受的原因

8

标志着OnInit()处理程序已经返回了一个非零值

解释_关闭

9

终点站已关闭

 
Artyom Trishkin:

检查OnInit()中的去初始化代码。

...

嗯...你不了解我 :)

你需要在函数中知道(例如在OnTick 中),用户已经改变了输入参数,也就是说,知道是时候收尾了,让程序进入OnDeinit。

 
Marat Sultanov:

嗯...你误解了我的意思 :)

你需要在函数内部(例如在OnTick)知道用户已经改变了输入参数,也就是说,知道现在是时候收工了,让程序退出到OnDeinit。

一旦用户调用EA设置窗口(F7)并按下那里的确定按钮,OnDeinit()就会立即被调用,而这又会在去初始化代码中写入REASON_PARAMETERS 值。然后调用OnInit(),在这里 使用UninitializeReason() 可以检查去初始化代码,如果其值等于REASON_PARAMETERS,就可以决定下一步该怎么做。
 
Artyom Trishkin:
一旦用户调用EA设置窗口(F7)并点击那里的OK按钮,OnDeinit()就会被立即调用,而这又会在去初始化代码中写入REASON_PARAMETERS 的值。然后调用OnInit(),在这里 使用UninitializeReason() 可以检查去初始化代码,如果其值等于REASON_PARAMETERS,就可以决定下一步该怎么做。

好的。

请。

1)首先运行我的代码,这是我在第一篇帖子中给出的。 我不是为了美丽而把它放在那里......你可以在任何图表上运行它。

2) 调用EA设置窗口。

3) 改变参数并按确定。

如果你仔细看了我的代码,那么结果不会让你吃惊:OnDeinit()将不会被调用

 

不仅如此,我还在deinit中增加了一个打印,包括原因和参数,这样你就可以确保专家没有到达deinit。

请注意代码中最重要的一块。

void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

这是一个清晰的模拟长计算,不会因为输入参数的变化而中断。而我需要打断它,问题是如何打断?:)

我只是想确定我在MQL5中没有遗漏任何东西,在语言中除了_StopFlag 之外,确实没有其他东西,不幸的是,这并不能解决这种情况。

粗略的说,我需要在繁重的计算过程中抓住输入参数变化的瞬间。

 
Marat Sultanov:

不仅如此,我还在deinit中添加了一个打印,包括原因和参数,这样你就可以确保专家没有到达deinit。

请注意代码中最重要的一块。

这是一个清晰的模拟长计算,不会因为输入参数的变化而中断。而我需要打断它,问题是如何打断?:)

我只是想确定我在MQL5中没有遗漏任何东西,在语言中除了_StopFlag 之外,确实没有其他东西,不幸的是,这并不能解决这种情况。

粗略的说,我需要在繁重的计算过程中抓住输入参数变化的瞬间。

粗略的说--重新仔细阅读我写给你的东西,把无限循环从你的代码中删除。

你确定将专家顾问驱动到一个无限循环中是正确的解决方案吗?