错误、漏洞、问题 - 页 1781

 

不稳定的性能

  • 指示器位置路径。 \Indicators\Test_i.ex5
  • 专家顾问的目标路径:\Experts\Test.ex5
  • 脚本位置路径。 \Scripts\Test_s.ex5

步骤的顺序。将'Test_s.ex5'脚本多次连接到M15图表(欧元兑美元符号)。

结果。

2017.02.05 15:17:59.076 在启动时第一次附加
2017.02.05 15:18:03.293 在启动时第二次附加的
2017.02.05 15:18:07.760 第三次启动时加入了
2017.02.05 15:18:07.778 OnInit
2017.02.05 15:18:07.781 OnDeinit:1
2017.02.05 15:18:16.891 开机 第四次加入

连接的结果是不同的。它们不应该是不同的,但结果是随机的:带有OnInit/OnDeinit的行可能从第1次出现,或者从第10次出现。

//Test_i.mq5 //Индикатор
void OnInit()                    { Print( __FUNCTION__ ); }
void OnDeinit( const int reason ) { Print( __FUNCTION__, ":", reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }
//Test_s.mq5 //Скрипт
#import "..\\Experts\\Test.ex5"
        void OnInit();
#import
void OnStart()
{
        Print( __FUNCTION__ );
        OnInit();
}

附上专家文件(实际上是作为一个库使用),这里的代码https://www.mql5.com/ru/forum/1111/page1801#comment_4059227

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
附加的文件:
Test.mq5  1 kb
 

我不明白这个错误是我的还是终端的。

在第五位数
void OnStart()
  {

double A=1.11111;
double B=1.11111;
double C=1.11111;

long CalcX=
NormalizeDouble(A,Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(B,Digits)*MathPow(10,(Digits+1)*2-1)+
NormalizeDouble(C,Digits)*MathPow(10,(Digits+1)*1-1);

Print ("CalcX=",CalcX);  
  }

打印 CalcX=111111111111111111111104 预期值 CalcX=1111111111111111111111111111 11

 
A100:

改变图表周期时函数调用的顺序不正确

  • 指标位置路径:Indicators\Test_i.ex5
  • 专家的路径:\Experts\Test.ex5

行动的顺序。

  1. 将专家顾问'Test.ex5'附加到M5图表上(符号GBPUSD)。
  2. 将图表周期改为M15
  3. 将图表周期改为M30
  4. 从图表中删除专家顾问

显示日志。这样你就可以看到时间框架。

这里需要补充的是,在图表中 添加指标 和从图表中删除指标都是非同步的操作。

此外,当时间框架被改变时,指标不会立即从这个时间框架中卸载。并在新的时间框架上创建一个新的指标副本。我看到你在构造器-解构器中的打印,你认为解构器是立即被调用的吗?不,你错了。当指标被卸载时,析构器被调用,指标被删除后几秒钟内才会被卸载
 
Slawa:
显示日志。所以你可以看到时机。
需要补充的是,向图表 中添加指标 和从图表中删除指标是非同步操作。
此外,当你改变时间框架时,指标将不会立即从这个时间框架中卸载。并在新的时间框架上创建一个新的指标副本。我看到你在构造器-解构器中的打印,你认为解构器是立即被调用的吗?不,你错了。当指标被卸载时,析构函数被调用,并且在移除指标后的几秒钟内,指标才被卸载。

假设各步骤之间有足够的时间(图形周期变化)。

2017.02.05 19:49:49.984 I::I->M5 #第1步:加入
2017.02.05 19:49:49.984 OnInit->M5

2017.02.05 19:51:39.853 I::I->M15 #第2步:周期变化M5->M15
2017.02.05 19:51:39.853 OnInit->M15
2017.02.05 19:53:29.813 OnDeinit->M15:3 #第三步:周期变化M15->M30
2017.02.05 19:53:29.813 I::~I->M15
2017.02.05 19:53:29.864 I::I->M30
2017.02.05 19:53:29.864 OnInit->M30

2017.02.05 19:54:03.245 OnDeinit->M30:3 #第4步:周期变化M30->H1
2017.02.05 19:54:03.245 i::~i->m30
2017.02.05 19:54:03.286 i::i->h1
2017.02.05 19:54:03.286 OnInit->H1
2017.02.05 19:55:02.984 I::I->H4 #第5步:H1->H4时期的变化
2017。02.02.05 19:55:02.984 OnInit->H4
2017.02.05 19:55:02.984 OnDeinit->H1:3
2017.02.05 19:55:02.984 I::~I->H1

2017.02.05 19:55:50.697 I::I->D1 #第6步:周期变化H4->D1
2017.02.05 19:55:50.697 OnInit->D1
2017.02.05 19:55:50.697 OnDeinit->H4:3
2017.02.05 19:55:50.697 i::~i->h4
2017.02.05 19:56:11.122 OnDeinit->M5:1#第7步:删除
2017.02.05 19:56:11.122 I::~I->M5

2017.02.05 19:56:11.122 OnDeinit->D1:1
2017.02.05 19:56:11.123 I::~I->D1

非同步性只影响到一个步骤中函数调用的不同顺序(如步骤#3和#5中看到的)。

正如你所看到的,所有随后的图表周期变化,除了第一个(步骤#2:两个输出行),都是预期的(类似于步骤#3:四个输出行)。而且,为什么第一个图表周期的变化应该与其他所有的不同?它如何更好/更坏?为什么第2步的两行缺失的输出(而且只有这一行)会移到第7步(用红色标出)?

 
-Aleks-:

我不明白这个错误是我的还是终端的。

打印 CalcX=111111111111111111111104 预期值 CalcX=1111111111111111111111111111 11

如果双数中的有效小数的数量>DBL_DIG=15,正常的规则就不起作用了
 
A100:

假设各步骤之间有足够的时间(图形周期变化)。

2017.02.05 19:49:49.984 I::I->M5 #step1: join
2017.02.05 19:49:49.984 OnInit->M5

2017.02.05 19:51:39.853 I::I->M15 #第2步:周期变化M5->M15
2017.02.05 19:51:39.853 OnInit->M15
2017.02.05 19:53:29.813 OnDeinit->M15:3 #第三步:周期变化M15->M30
2017.02.05 19:53:29.813 I::~I->M15
2017.02.05 19:53:29.864 I::I->M30
2017.02.05 19:53:29.864 OnInit->M30

2017.02.05 19:54:03.245 OnDeinit->M30:3 #第4步:周期变化M30->H1
2017.02.05 19:54:03.245 i::~i->m30
2017.02.05 19:54:03.286 i::i->h1
2017.02.05 19:54:03.286 OnInit->H1
2017.02.05 19:55:02.984 I::I->H4 #第5步:H1->H4时期的变化
2017。02.02.05 19:55:02.984 OnInit->H4
2017.02.05 19:55:02.984 OnDeinit->H1:3
2017.02.05 19:55:02.984 I::~I->H1

2017.02.05 19:55:50.697 I::I->D1 #第6步:周期变化H4->D1
2017.02.05 19:55:50.697 OnInit->D1
2017.02.05 19:55:50.697 OnDeinit->H4:3
2017.02.05 19:55:50.697 i::~i->h4
2017.02.05 19:56:11.122 OnDeinit->M5:1 #第7步:删除
2017.02.05 19:56:11.122 I::~I->M5

2017.02.05 19:56:11.122 OnDeinit->D1:1
2017.02.05 19:56:11.123 I::~I->D1

非同步性只影响一个步骤内函数调用的不同顺序(如在步骤#3和#5看到的)。

我们可以看到,除了第一个步骤(第2步)之外,图表的所有后续周期变化都如期发生(与第3步类似)。为什么第一个时期的变化应该与所有其他时期不同?它如何更好/更坏?

让我再试着解释一下

在M5图表上有某种指标。当你把时间框架从M5改为M15时,同一指标的第二个副本会被创建。一条命令被发送到两个指示器上--第一个是M5 Deinit,第二个是M15 Init。同时,我们不知道这些命令中的哪一个会在另一个之前被执行--线程之间存在着经典的竞赛。

此后,第一个指标的使用计数器将减少。在使用计数器变为零后的几秒钟内,该指标将从图表中卸载。这时,该指标的全局对象的析构器将被称为
 
Slawa:
让我再试着解释一下

在M5图表中,有一个特定的指标。当你把时间框架从M5改为M15时,同一指标的第二个副本会被创建。一条命令被发送到两个指示器上--第一个是M5 Deinit,第二个是M15 Init。同时,我们不知道这些命令中的哪一个会在另一个之前被执行--不同线程之间存在着经典的竞赛。

此后,第一个指标的使用计数器将减少。在使用计数器变为零后的几秒钟内,该指标将从图表中卸载。该指标的全局对象的析构器将被称为

我断言(并建议检查),当时间框架从M5变为M15时,没有M5 Deinit命令被发送到第一个指标(而且只发给它--在这种情况下是M5),它不会从图表中卸载,直到用户删除EA为止。

如果'Test_i.ex5'中的结构 I被排除在外(没有影响),输出被简化。


2017.02.05 20:49:06.842 OnInit->M5

2017.02.05 20:49:21.253 OnInit->M15(*)周期变化M5->M15: M5指标未卸下
2017.02.05 20:56:40.001 OnDeinit->M15:3 周期变化M15->M30:M15 指标 立即 卸载
2017.02.05 20:56:40.132 OnInit->M30

自(*)以来已超过5分钟,但M5指示器 被卸下

从图表中删除专家顾问

2017.02.05 20:57:35.176 OnDeinit->M5:1 只有在删除专家顾问
,M5指标才会被卸载2017.02.05 20:57:35.177 OnDeinit->M30:1

 
Slawa:
让我再试着解释一下

在M5图表中,有一个特定的指标。当你把时间框架从M5改为M15时,同一指标的第二个副本就会产生。一条命令被发送到两个指示器上--第一个是M5 Deinit,第二个是M15 Init。同时,我们不知道这些命令中的哪一个会在另一个之前被执行--不同线程之间存在着经典的竞赛

此后,第一个指标的使用计数器将减少。在使用计数器变为零后的几秒钟内,该指标将从图表中卸载。这时,该指标的全局对象的析构器将被调用
你能解释一下我们正在谈论的是哪条线吗?一个符号的所有指标不是在一个线程中起作用吗?
 
Vladimir Gribachev:

安装比尔-威廉姆斯指标时出现的故障

我把分形 - 它确实

设置AO - ADX被设置

建立1031

在改变/MQx/Indicators目录结构时,菜单不更新的问题已经存在几百年了 :-)这个错误是如此古老,以至于它已经被认为是一个功能,习惯吧......可用性是用方块螺栓大锤敲打的,但数字π算得最快:-)
 
A100:
如果双数的有效小数位数>DBL_DIG=15,那么正常的规则就不起作用了

哪些是有效的?

在帮助文件中说,long的最大值是9223372036854775807 - 我显然没有达到这个值