오류, 버그, 질문 - 페이지 2823

 
Nikolai Semko :

나는 속도를 위해 미친 버전을 확인하기로 결정했다.
그리고 결과는 놀랐습니다.
사전 정규화 된 double의 비교는 double이 epsilon을 통해 또는 int로 변환을 통해 비교되는 경우보다 평균적으로 훨씬 느립니다.

결과:

나는 많은 것이 프로세서의 참신함과 아키텍처에 달려 있고 누군가에게는 결과가 다를 수 있다는 점을 배제하지 않습니다.

놀랍게도 정수로 반올림 함수는 정수가 아니라 실수를 반환하므로 유형을 정수로 변환해야 합니다. 언어의 논리는 어디에 있습니까?
 
Nikolai Semko :

두 개의 이중 비교 연산의 성능은 실제로 변수 자체의 값에 달려 있습니까? 나는 의심한다.

예처럼 보입니다. 아주 이상한.
위의 예에서 줄을 바꾸면

 double test = 1.11 ;

 double test = NormalizeDouble ( 1.11 , 2 );

그러면 두 개의 복식에 대한 간단한 비교가 다른 옵션보다 빠르게 작동하기 시작합니다. 있는 것은 두 배로, 있는 것은 두 배로. 차이점은 무엇입니까? 그리고 전체 성능은 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

고맙습니다.

 

물론 일반적으로 정수로 반올림한 후 정수가 아닌 숫자의 반환은 좋지 않습니다. 이전에는 인쇄물에서 소수점 뒤에 0이 있고 끝에 1이 있거나 소수점 뒤에 9가 있는 반올림 후에 거의 정수를 만났습니다. 버그라고 생각했습니다. 이해할 수 없는 개발자의 입장이 드러났습니다. 좋은 점은 정수로 반올림할 때 이진 형식의 소수점 뒤 나머지를 제거해야 하지만 분명히 가수를 재설정하는 것은 어렵습니다/불가능합니다. 정규화는 훨씬 더 어렵습니다. 쉼표를 5자리로 이동하여 이진 형식의 정수로 변환하더라도 이중으로 역변환하면 정수 유형 과 차이가 발생합니다.

슬프게도, 겉보기에 단순한 비교 작업으로 목발을 짚어야 합니다.

파이썬이 아닙니다.

 
Valeriy Yastremskiy :

물론 일반적으로 정수로 반올림한 후 정수가 아닌 숫자의 반환은 좋지 않습니다. 이전에는 인쇄물에서 소수점 뒤에 0이 있고 끝에 1이 있거나 소수점 뒤에 9가 있는 반올림 후에 거의 정수를 만났습니다. 버그라고 생각했습니다. 이해할 수 없는 개발자의 입장이 드러났습니다. 좋은 점은 정수로 반올림할 때 이진 형식의 소수점 뒤 나머지를 제거해야 하지만 분명히 가수를 재설정하는 것은 어렵습니다/불가능합니다. 정규화는 훨씬 더 어렵습니다. 쉼표를 5자리로 이동하여 이진 형식의 정수로 변환하더라도 이중으로 역변환하면 정수 유형 과 차이가 발생합니다.

슬프게도, 겉보기에 단순한 비교 작업으로 목발을 짚어야 합니다.

반올림 후 표현식에서 얻은 결과와 함께 일부 다른 연산이 있을 수 있으며 정수 연산일 필요는 없습니다. 그런 다음 int에서 double로 다시 변환하여 파란색 오버헤드를 생성해야 합니다. 왜 필요한가요?

아무도 필요한 유형을 반환하는 자신의 RoundInt 또는 RoundLong 함수를 만드는 데 신경 쓰지 않습니다.

 

시장의 테스터에 문제가 있습니다.

다중 통화 Expert Advisor 를 확인 중인 경우 테스터가 멈춥니다.

이유: 금융 상품을 분석하는 동안 Expert Advisor는 기록이 없거나 상품의 형식이 올바르게 지정되지 않은 상품을 우연히 발견했습니다.

표준 터미널에서 이로 인해 29초 동안 중단이 발생합니다. 이는 확실하고 확인되었습니다.

시장의 테스터는 너무 긴 테스트를 작성합니다.

나는 고문이 이러한 깨진 금융 상품 중 몇 가지를 우연히 발견했다고 가정합니다.

이 문제는 몇 번 그리고 1 년 전에 작성되었지만 일이 여전히 있습니다 ....

 
Vladimir Pastushak :

이 문제는 몇 번 그리고 1 년 전에 작성되었지만 일이 여전히 있습니다 ....

나는 재생산하지 않습니다. 소스를 첨부합니다.

 

기능이 작동하지 않는 이유에 대해 말씀해 주시겠습니까? 0 그래프로 전환하지 않습니다.

 ChartSetInteger ( 0 , CHART_BRING_TO_TOP , 0 , true );

템플릿의 두 번째 및 추가 적용은 창을 복제합니다.

 ChartApplyTemplate ( 0 , "Template.tpl" );

이러한 기능은 업데이트 전에 작동했습니다.

 
fxsaber :

나는 재생산하지 않습니다. 소스를 첨부합니다.

Metaquots 데모 서버에서 테스트

 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 테스트(EURUSD,M15) MXNJPY 1998

2020.08.11 20:20:55.659 테스트(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 테스트(EURUSD,M15) 오류 AUS200 29593673

2020.08.11 20:21:54.837 테스트(EURUSD,M15) 오류 FCHI40 29578404

2020.08.11 20:22:24.336 테스트(EURUSD,M15) 오류 GDAXIm 29498485

2020.08.11 20:22:53.949 테스트(EURUSD,M15) 오류 HSI50 29612968

2020.08.11 20:23:23.458 테스트(EURUSD,M15) 오류 Jap225 29509059

2020.08.11 20:23:52.919 테스트(EURUSD,M15) 오류 ND100m 29461316

2020.08.11 20:24:22.425 테스트(EURUSD,M15) 오류 SP500m 29505571

2020.08.11 20:24:51.860 테스트(EURUSD,M15) 오류 SPN35 29435460

2020.08.11 20:25:21.273 테스트(EURUSD,M15) 오류 STOX50 29412578

2020.08.11 20:25:50.663 테스트(EURUSD,M15) 오류 UK100 29389644

2020.08.11 20:26:20.205 테스트(EURUSD,M15) 브렌트 29542597

2020.08.11 20:26:49.667 테스트(EURUSD,M15) 오류 원유 29462066

2020.08.11 20:27:19.194 테스트(EURUSD,M15) 오류 Nat Gas 29526780




 
Vladimir Pastushak :

Metaquots 데모 서버에서 테스트

죄송합니다. 이제 단단히 고정되어 있습니다 ....

이 스크립트로 인해 터미널이 내 컴퓨터에서 중단되지 않았습니다.