错误、漏洞、问题 - 页 2823

 
Nikolai Semko:

决定检查速度漫游的版本。
结果令人惊讶。
即使是预规范化的双倍数的比较,平均来说也比通过epsilon或通过转换为int的双倍数的比较要慢。

其结果是。

我不排除很多事情取决于处理器的新颖性和架构,一些程序员可能会得到不同的结果。

令人惊讶的是,四舍五入函数返回的是一个实数,而不是一个整数,你必须把类型也四舍五入到一个整数。语言的逻辑在哪里?
 
Nikolai Semko:

比较两个双数的操作性能是否取决于变量本身的值?我怀疑这一点。

似乎是这样。这相当奇怪。
如果你替换上面例子中的一行

double test = 1.11;

double test = NormalizeDouble(1.11,2);

两个双数的简单比较比其他选项更快开始工作。虽然它可以是双倍的,也可以是两倍的。这看起来有什么区别呢?但由此产生的性能却快了两倍。这就像一个奇迹。

2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   простое сравнение предварительно нормализированых double 1 - 552 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   простое сравнение предварительно нормализированых double 2 - 954 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   сравнение double через эпсилон                             - 778 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   сравнение double через преобразование в int                - 854 микросекунд, всего совпадений = 507
附加的文件:
 
Alexey Navoykov:

这个测试是不正确的。 为什么你只在最后 除以100000.0一次? 应该在每次迭代时进行,然后求和。 这是一个公平的比较。 但这根本不是归一化 - 你只是优化了你的测试算法当然,它将更快、更准确(因为累积误差减少了)。

是的,你是对的。如果你在每次迭代时都进行除法,其精确度将与NormalizeDouble 相同。但速度仍然会比使用NormalizeDouble高。

2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   простая сумма                            - 1394 микросекунд, сумма = -3604329.1567609389312565
2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   сумма с NormalizeDouble                  - 5861 микросекунд, сумма = -3604329.1543100476264954
2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   сумма, нормализированная через int       - 2179 микросекунд, сумма = -3604329.1543100476264954

谢谢你。

 

一般来说,在四舍五入到一个整数后,返回一个非整数是不好的。早些时候,我在打印机上看到过几乎是整数的数字,小数点之后是零,最后是一,或者小数点之后是九。我以为这是一个错误。事实证明,这是开发商的一个不明确的立场。好吧,四舍五入到整数,你应该把二进制形式的小数点后的余数去掉,但显然很难/不可能把尾数归零。关于规范化就更复杂了,即使我们把逗号移到5位和二进制中的整数,反向四舍五入到双数也会产生与整数类型的 差异。

可悲的是,人们不得不在看似简单的比较操作上拄着拐杖。

不是python.))))

 
Valeriy Yastremskiy:

一般来说,在四舍五入到一个整数后,返回一个非整数是不好的。以前在打印机中,我看到过几乎是整数的小数点后有零,末尾有一,或者小数点后有九。我以为这是一个错误。事实证明,这是开发商的一个不明确的立场。好吧,四舍五入到整数,你应该把二进制形式的小数点后的余数去掉,但显然很难/不可能把尾数归零。关于规范化就更复杂了,即使我们把逗号移到5位和二进制中的整数,反向四舍五入到双数也会产生与整数类型的 差异。

可悲的是,我们不得不对看似简单的比较操作进行紧缩。

四舍五入后的表达式可能包含对结果数据的一些其他操作,而且不一定是整数操作。然后我们将不得不把它从int转换回double,在现场产生一个开销。

没有人阻止你创建自己的函数RoundInt或RoundLong,它将返回所需类型。

 

市场上的测试器有一个问题。

如果我测试一个多货币的EA,测试器就会挂掉。

原因是:在分析金融工具的过程中,专家顾问偶然发现了没有历史记录的工具,或者工具的设计不恰当。

在标准终端中,它挂起了29秒,这是肯定的,它被检查了。

市场中的测试人员报告说测试时间太长。

我假设专家顾问会遇到几个这样的破损的金融工具。

这个问题已经写过好几次了,而且是在一年前,但它仍然存在....。

 
Vladimir Pastushak:

这个问题已经写过好几次了,而且是在一年前,但它仍然存在....。

这对我来说是行不通的。请附上你的源代码。

 

你能评论一下为什么这个功能不能工作吗?它不会切换到0图。

ChartSetInteger(0,CHART_BRING_TO_TOP,0,true);

模式的 第二次和进一步的应用 复制了窗口

ChartApplyTemplate(0,"Template.tpl");

这些功能在更新前是有效的。

 
fxsaber:

这不是为我玩的。附上你的源代码。

在演示的Metakvotes服务器上测试

void OnStart()
  {
   int m_all_symbols = SymbolsTotal(false);
   string m_sym_name = "";
   for(int i = 0; i < m_all_symbols; i++)
     {
      // ======================================================================
      // === Получили имя символа
      if((m_sym_name = SymbolName(i, false)) != NULL)
        {
         // ======================================================================
         // === Если символ не выбран в окне маркет ватч
         if(!SymbolInfoInteger(m_sym_name, SYMBOL_SELECT))
            if(!SymbolSelect(m_sym_name, true))
               Print(" SymbolSelect " + m_sym_name);
         ulong get = GetMicrosecondCount();
         MqlRates rateM1[1440];
         if(CopyRates(m_sym_name, PERIOD_M1, 0, 1440, rateM1) > 0)
           {
            Print(m_sym_name, "  ", (GetMicrosecondCount() - get));
           }
         else
            Print("Error  ",m_sym_name, "  ", (GetMicrosecondCount() - get));
        }
     }
  }


2020.08.11 20:20:55.657 test (EURUSD,M15) MXNJPY 1998

2020.08.11 20:20:55.659 test (EURUSD,M15) NZDMXN 1979

2020.08.11 20:20:55.661 测试(EURUSD,M15) USDCOP 1973

2020.08.11 20:20:55.663 测试(EURUSD,M15) USDARS 2093

2020.08.11 20:20:55.665 测试(EURUSD,M15) USDCLP 1929

2020.08.11 20:21:25.259 test (EURUSD,M15) Error AUS200 29593673

2020.08.11 20:21:54.837 test (EURUSD,M15) Error FCHI40 29578404

2020.08.11 20:22:24.336 test (EURUSD,M15) Error GDAXIm 29498485

2020.08.11 20:22:53.949 test (EURUSD,M15) Error HSI50 29612968

2020.08.11 20:23:23.458 test (EURUSD,M15) Error Jap225 29509059

2020.08.11 20:23:52.919 test (EURUSD,M15) Error ND100m 29461316

2020.08.11 20:24:22.425 test (EURUSD,M15) Error SP500m 29505571

2020.08.11 20:24:51.860 test (EURUSD,M15) Error SPN35 29435460

2020.08.11 20:25:21.273 test (EURUSD,M15) Error STOX50 29412578

2020.08.11 20:25:50.663 test (EURUSD,M15) Error UK100 29389644

2020.08.11 20:26:20.205 test (EURUSD,M15) Error Brent 29542597

2020.08.11 20:26:49.667 test (EURUSD,M15) Error Crude 29462066

2020.08.11 20:27:19.194 test (EURUSD,M15) Error NatGas 29526780




 
Vladimir Pastushak:

在演示的Metacvots服务器上测试

对不起,它现在挂断了....

在我的机器上,这个脚本并没有导致终端机挂起。