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

 
Alain Verleyen :

업데이트 :

최대 피크가 이제 심각하게 증가합니다.

2020.06.13 08:18:25.187 342152 (EURGBP, H1) 금액 = 23520
2020.06.13 08:18:25.187 342152 (EURGBP, H1) 최소 = 33
2020.06.13 08:18:25.187 342152 (EURGBP, H1) 최대 = 81011
2020.06.13 08:18:25.187 342152 (EURGBP, H1) 평균 = 149

실험의 순도를 위해 이 스크립트를 여러 차트와 여러 터미널에서 병렬로 실행해야 합니다. 그런 다음 중단 시간을 비교합니다.

 
Stanislav Korotky :

실험의 순도를 위해 이 스크립트를 여러 차트와 여러 터미널에서 병렬로 실행해야 합니다. 그런 다음 중단 시간을 비교합니다.

좋습니다. 하지만 이미 1개의 차트에서 발생했다면 여러 차트로 개선되지 않습니다.

여러 차트/터미널에서 실행하는 데 무엇이 더 도움이 될까요?

 
Alain Verleyen :

좋습니다. 하지만 이미 1개의 차트에서 발생했다면 여러 차트로 개선되지 않습니다.

여러 차트/터미널에서 실행하는 데 무엇이 더 도움이 될까요?

이것이 다른 터미널에서 일치하면 문제는 OS 평면에 있습니다.

 
Stanislav Korotky :

이것이 다른 터미널에서 일치하면 문제는 OS 평면에 있습니다.

이해했다. 노력하겠습니다.
 
Stanislav Korotky :

실험의 순도를 위해 이 스크립트를 여러 차트와 여러 터미널에서 병렬로 실행해야 합니다. 그런 다음 중단 시간을 비교합니다.

다른 터미널이지만 20개의 차트(다른 기호)가 동시에 시작되었습니다.

피크가 어디에서 오는지 AUDUSD를 확인했습니다.

2020.06.13 09:16:35.151 342152 (USDJPY, H1) 금액 = 240
2020.06.13 09:16:35.151 342152 (USDJPY, H1) 최소=38
2020.06.13 09:16:35.151 342152 (USDJPY, H1) 최대 = 2235
2020.06.13 09:16:35.151 342152 (USDJPY, H1) 평균=472
2020.06.13 09:16:35.151 342152 (CADCHF, H1) 금액 = 240
2020.06.13 09:16:35.151 342152 (CADCHF, H1) 최소=48
2020.06.13 09:16:35.151 342152 (CADCHF, H1) 최대=2323
2020.06.13 09:16:35.152 342152 (CADCHF, H1) 평균=606
2020.06.13 09:16:35.152 342152 (EURAUD, H1) 금액 = 240
2020.06.13 09:16:35.152 342152 (EURCHF, H1) 금액 = 240
2020.06.13 09:16:35.152 342152 (GBPCHF, H1) 금액=240
2020.06.13 09:16:35.152 342152 (EURCHF, H1) 최소 = 141
2020.06.13 09:16:35.152 342152 (EURGBP, H1) 금액 = 240
2020.06.13 09:16:35.152 342152 (CHFJPY, H1) 금액=240
2020.06.13 09:16:35.152 342152 (AUDJPY, H1) 금액=240
2020.06.13 09:16:35.152 342152 (AUDJPY, H1) 최소=47
2020.06.13 09:16:35.152 342152 (EURUSD, H1) 금액 = 240
2020.06.13 09:16:35.152 342152 (EURUSD, H1) 최소 = 23
2020.06.13 09:16:35.152 342152 (EURUSD, H1) 최대 = 2368
2020.06.13 09:16:35.152 342152 (AUDUSD, H1) 금액 = 240
2020.06.13 09:16:35.152 342152 (EURUSD, H1) 평균=607
2020.06.13 09:16:35.152 342152 (AUDUSD, H1) 최소=74
2020.06.13 09:16:35.152 342152 (GBPJPY, H1) 금액=240
2020.06.13 09:16:35.152 342152 (AUDNZD, H1) 금액=240
2020.06.13 09:16:35.152 342152 (USDCHF, H1) 금액 = 240
2020.06.13 09:16:35.152 342152 (AUDNZD, H1) 최소=122
2020.06.13 09:16:35.152 342152 (AUDCHF, H1) 금액=240
2020.06.13 09:16:35.152 342152 (AUDNZD, H1) 최대=2402
2020.06.13 09:16:35.152 342152 (AUDNZD, H1) 평균=660
2020.06.13 09:16:35.152 342152 (AUDCHF, H1) 최소=157
2020.06.13 09:16:35.152 342152 (AUDCHF, H1) 최대=2354
2020.06.13 09:16:35.152 342152 (AUDCHF, H1) 평균=663
2020.06.13 09:16:35.152 342152 (GBPCHF, H1) 최소=32
2020.06.13 09:16:35.152 342152 (GBPCHF, H1) 최대=2380
2020.06.13 09:16:35.152 342152 (GBPCHF, H1) 평균=616
2020.06.13 09:16:35.152 342152 (EURCHF, H1) 최대 = 2327
2020.06.13 09:16:35.152 342152 (EURCHF, H1) 평균=618
2020.06.13 09:16:35.152 342152 (EURGBP, H1) 최소 = 36
2020.06.13 09:16:35.152 342152 (EURGBP, H1) 최대 = 2233
2020.06.13 09:16:35.152 342152 (EURGBP, H1) 평균=503
2020.06.13 09:16:35.152 342152 (CHFJPY, H1) 최소=11
2020.06.13 09:16:35.152 342152 (CHFJPY, H1) 최대=2387
2020.06.13 09:16:35.152 342152 (CHFJPY, H1) 평균=657
2020.06.13 09:16:35.152 342152 (AUDJPY, H1) 최대=2292
2020.06.13 09:16:35.152 342152 (AUDJPY, H1) 평균=612
2020.06.13 09:16:35.152 342152 (EURNZD, H1) 금액 = 240
2020.06.13 09:16:35.152 342152 (EURNZD, H1) 최소=54
2020.06.13 09:16:35.152 342152 (EURNZD, H1) 최대=2361
2020.06.13 09:16:35.152 342152 (EURNZD, H1) 평균=612
2020.06.13 09:16:35.152 342152 (AUDCAD, H1) 금액=240
2020.06.13 09:16:35.152 342152 (AUDCAD, H1) 최소=121
2020.06.13 09:16:35.152 342152 (EURCAD, H1) 수량 = 240
2020.06.13 09:16:35.152 342152 (AUDCAD, H1) 최대=2328
2020.06.13 09:16:35.152 342152 (AUDCAD, H1) 평균=605
2020.06.13 09:16:35.152 342152 (AUDUSD, H1) 최대 = 2361
2020.06.13 09:16:35.152 342152 (AUDUSD, H1) 평균=611
2020.06.13 09:16:35.152 342152 (GBPJPY, H1) 최소=13
2020.06.13 09:16:35.152 342152 (GBPJPY, H1) 최대 = 2411
2020.06.13 09:16:35.152 342152 (GBPJPY, H1) 평균=661
2020.06.13 09:16:35.153 342152 (GBPUSD, H1) 금액 = 240
2020.06.13 09:16:35.153 342152 (GBPUSD, H1) 최소 = 113
2020.06.13 09:16:35.153 342152 (GBPUSD, H1) 최대 = 2362
2020.06.13 09:16:35.153 342152 (GBPUSD, H1) 평균 = 667
2020.06.13 09:16:35.153 342152 (USDCAD, H1) 금액=240
2020.06.13 09:16:35.153 342152 (USDCAD, H1) 최소=151
2020.06.13 09:16:35.153 342152 (USDCAD, H1) 최대=2386
2020.06.13 09:16:35.153 342152 (EURAUD, H1) 최소=35
2020.06.13 09:16:35.153 342152 (USDCAD, H1) 평균=671
2020.06.13 09:16:35.153 342152 (EURAUD, H1) 최대=2233
2020.06.13 09:16:35.153 342152 (EURAUD, H1) 평균=478
2020.06.13 09:16:35.153 342152 (EURJPY, H1) 금액 = 240
2020.06.13 09:16:35.153 342152 (EURJPY, H1) 최소=10
2020.06.13 09:16:35.153 342152 (EURCAD, H1) 최소=123
2020.06.13 09:16:35.153 342152 (EURCAD, H1) 최대=2384
2020.06.13 09:16:35.153 342152 (EURCAD, H1) 평균=658
2020.06.13 09:16:35.153 342152 (USDCHF, H1) 최소=32
2020.06.13 09:16:35.153 342152 (USDCHF, H1) 최대 = 2369
2020.06.13 09:16:35.153 342152 (USDCHF, H1) 평균=614
2020.06.13 09:16:35.153 342152 (EURJPY, H1) 최대 = 2344
2020.06.13 09:16:35.153 342152 (EURJPY, H1) 평균 = 658

그리고 그 때 정점이 옵니다.

2020.06.13 09:17:35.151 342152 (USDJPY, H1) 금액 = 480
2020.06.13 09:17:35.151 342152 (USDJPY, H1) 최소=38
2020.06.13 09:17:35.151 342152 (USDJPY, H1) 최대 = 17421
2020.06.13 09:17:35.151 342152 (USDJPY, H1) 평균=533
2020.06.13 09:17:35.151 342152 (EURAUD, H1) 금액 = 480
2020.06.13 09:17:35.151 342152 (EURAUD, H1) 최소=35
2020.06.13 09:17:35.151 342152 (EURAUD, H1) 최대 = 17406
2020.06.13 09:17:35.151 342152 (EURAUD, H1) 평균=518
2020.06.13 09:17:35.151 342152 (EURGBP, H1) 금액 = 480
2020.06.13 09:17:35.151 342152 (EURGBP, H1) 최소=36
2020.06.13 09:17:35.151 342152 (EURGBP, H1) 최대 = 17425
2020.06.13 09:17:35.151 342152 (EURGBP, H1) 평균 = 515
2020.06.13 09:17:35.151 342152 (EURUSD, H1) 금액 = 480
2020.06.13 09:17:35.151 342152 (EURUSD, H1) 최소=18
2020.06.13 09:17:35.151 342152 (EURUSD, H1) 최대 = 17366
2020.06.13 09:17:35.151 342152 (EURCHF, H1) 금액 = 480
2020.06.13 09:17:35.151 342152 (EURUSD, H1) 평균 = 618
2020.06.13 09:17:35.151 342152 (AUDCHF, H1) 금액=480
2020.06.13 09:17:35.151 342152 (USDCHF, H1) 금액 = 480
2020.06.13 09:17:35.151 342152 (AUDCHF, H1) 최소=126
2020.06.13 09:17:35.151 342152 (CADCHF, H1) 금액 = 480
2020.06.13 09:17:35.151 342152 (AUDCHF, H1) 최대=10477
2020.06.13 09:17:35.151 342152 (EURCAD, H1) 수량 = 480
2020.06.13 09:17:35.151 342152 (GBPUSD, H1) 금액 = 480
2020.06.13 09:17:35.152 342152 (EURCAD, H1) 최소=123
2020.06.13 09:17:35.152 342152 (GBPUSD, H1) 최소=112
2020.06.13 09:17:35.152 342152 (EURCAD, H1) 최대=10485
2020.06.13 09:17:35.152 342152 (EURCAD, H1) 평균=663
2020.06.13 09:17:35.152 342152 (GBPUSD, H1) 최대 = 10435
2020.06.13 09:17:35.152 342152 (GBPUSD, H1) 평균 = 661
2020.06.13 09:17:35.152 342152 (EURCHF, H1) 최소 = 71
2020.06.13 09:17:35.152 342152 (EURJPY, H1) 금액 = 480
2020.06.13 09:17:35.152 342152 (USDCAD, H1) 금액=480
2020.06.13 09:17:35.152 342152 (USDCAD, H1) 최소=54
2020.06.13 09:17:35.152 342152 (EURJPY, H1) 최소=10
2020.06.13 09:17:35.152 342152 (EURJPY, H1) 최대 = 10487
2020.06.13 09:17:35.152 342152 (EURJPY, H1) 평균 = 664
2020.06.13 09:17:35.152 342152 (EURNZD, H1) 금액 = 480
2020.06.13 09:17:35.152 342152 (EURNZD, H1) 최소=54
2020.06.13 09:17:35.152 342152 (EURNZD, H1) 최대 = 17426
2020.06.13 09:17:35.152 342152 (EURNZD, H1) 평균=620
2020.06.13 09:17:35.152 342152 (USDCHF, H1) 최소=32
2020.06.13 09:17:35.152 342152 (USDCHF, H1) 최대 = 17427
2020.06.13 09:17:35.152 342152 (USDCHF, H1) 평균 = 649
2020.06.13 09:17:35.152 342152 (GBPCHF, H1) 금액=480
2020.06.13 09:17:35.152 342152 (GBPCHF, H1) 최소=32
2020.06.13 09:17:35.152 342152 (GBPCHF, H1) 최대=17433
2020.06.13 09:17:35.152 342152 (GBPCHF, H1) 평균=647
2020.06.13 09:17:35.152 342152 (AUDJPY, H1) 금액=480
2020.06.13 09:17:35.152 342152 (AUDJPY, H1) 최소 = 47
2020.06.13 09:17:35.152 342152 (AUDJPY, H1) 최대 = 17415
2020.06.13 09:17:35.152 342152 (AUDJPY, H1) 평균=640
2020.06.13 09:17:35.152 342152 (CADCHF, H1) 최소=48
2020.06.13 09:17:35.152 342152 (CADCHF, H1) 최대=17435
2020.06.13 09:17:35.152 342152 (CADCHF, H1) 평균=637
2020.06.13 09:17:35.152 342152 (AUDCHF, H1) 평균=662
2020.06.13 09:17:35.152 342152 (AUDUSD, H1) 금액 = 480
2020.06.13 09:17:35.152 342152 (AUDUSD, H1) 최소=43
2020.06.13 09:17:35.152 342152 (AUDUSD, H1) 최대 = 17416
2020.06.13 09:17:35.152 342152 (AUDUSD, H1) 평균=620
2020.06.13 09:17:35.152 342152 (GBPJPY, H1) 금액 = 480
2020.06.13 09:17:35.152 342152 (GBPJPY, H1) 최소=13
2020.06.13 09:17:35.152 342152 (GBPJPY, H1) 최대 = 10468
2020.06.13 09:17:35.152 342152 (GBPJPY, H1) 평균=660
2020.06.13 09:17:35.152 342152 (CHFJPY, H1) 금액=480
2020.06.13 09:17:35.152 342152 (CHFJPY, H1) 최소=11
2020.06.13 09:17:35.152 342152 (CHFJPY, H1) 최대=10474
2020.06.13 09:17:35.152 342152 (AUDNZD, H1) 금액=480
2020.06.13 09:17:35.152 342152 (AUDNZD, H1) 최소=61
2020.06.13 09:17:35.152 342152 (AUDNZD, H1) 최대=10491
2020.06.13 09:17:35.152 342152 (AUDNZD, H1) 평균=663
2020.06.13 09:17:35.152 342152 (EURCHF, H1) 최대 = 17414
2020.06.13 09:17:35.152 342152 (EURCHF, H1) 평균 = 646
2020.06.13 09:17:35.152 342152 (AUDCAD, H1) 금액=480
2020.06.13 09:17:35.152 342152 (AUDCAD, H1) 최소=100
2020.06.13 09:17:35.152 342152 (AUDCAD, H1) 최대=17421
2020.06.13 09:17:35.152 342152 (AUDCAD, H1) 평균=638
2020.06.13 09:17:35.152 342152 (USDCAD, H1) 최대=10488
2020.06.13 09:17:35.152 342152 (USDCAD, H1) 평균=666
2020.06.13 09:17:35.152 342152 (CHFJPY, H1) 평균=656

그래서 모든 일이 동시에 일어났다. 그러나 이것은 여전히 MT5에서 문제가 될 수 있습니다. 다른 동시 단말기로 확인하겠습니다.

 
Stanislav Korotky :

이것이 다른 터미널에서 일치하면 문제는 OS 평면에 있습니다.

문제는 OS 평면이 아니라 MT에 있습니다.
MT5(빌드 2009)에서 확인 - 모든 것이 날아가고 실행은 5ms 미만입니다.
동시에 MT5(빌드 2485)에서는 모든 것이 느려지고 실행 시간이 종종 200ms를 초과합니다(특히 50개 이상의 차트가 열려 있는 경우).
문제 설명의 코드가 사용되었습니다: https://www.mql5.com/en/forum/342152

MT5 2009 및 MT5 2485의 두 가지 버전에 대한 ChartGetInteger 함수의 구현을 비교했는데 문제는 다음과 같을 수 있습니다.
1. 2485에서는 차트 개체의 "원자" 필드를 읽는 데 다소 느린 작업이 사용되었습니다.
울타리; 잠금 이동 eax,[rax+2C];
그러나 2009년 빌드에서는 다음을 사용하여 수행됩니다. lock xadd [rcx+2C],eax

2. 또한 ntdll_RtlEnterCriticalSection에서 소요되는 로직과 가능한 시간이 크게 변경된 것 같습니다.
이전에는 2009년에 원자적 연산 없이 임계 영역에서 수신된 값 중 몇 개만 확인했습니다.
그리고 2485에서는 연결 목록 차트 개체에 대한 반복 작업을 추가로 수행할 수 있습니다.


아마도 새 컴파일러로의 전환(2-3개월 전)의 일부로 차트 기능으로 작업할 때 충돌이 수정되었을 때 문제가 발생했을 수 있습니다.
MT5(빌드 2485)에서 ChartGetInteger를 호출 하기 위한 어셈블러 코드는 첨부 파일에 있습니다.

 
Sergey Dzyublik :

문제는 OS 평면이 아니라 MT에 있습니다.
MT5(빌드 2009)에서 확인 - 모든 것이 날아가고 실행은 5ms 미만입니다.
동시에 MT5(빌드 2485)에서는 모든 것이 느려지고 실행 시간이 종종 200ms를 초과합니다(특히 50개 이상의 차트가 열려 있는 경우).
문제 설명의 코드가 사용되었습니다: https://www.mql5.com/en/forum/342152

MT5 2009 및 MT5 2485의 두 가지 버전에 대한 ChartGetInteger 함수의 구현을 비교했는데 문제는 다음과 같을 수 있습니다.
1. 2485에서는 차트 개체의 "원자" 필드를 읽는 데 다소 느린 작업이 사용되었습니다.
울타리; 잠금 이동 eax,[rax+2C];
그러나 2009년 빌드에서는 다음을 사용하여 수행됩니다. lock xadd [rcx+2C],eax

2. 또한 ntdll_RtlEnterCriticalSection에서 소요되는 로직과 가능한 시간이 크게 변경된 것 같습니다.
이전에는 2009년에 원자적 연산 없이 임계 영역에서 수신된 값 중 몇 개만 확인했습니다.
그리고 2485에서는 연결 목록 차트 개체에 대한 반복을 추가로 수행할 수 있습니다.


아마도 새 컴파일러로의 전환(2-3개월 전)의 일부로 차트 기능으로 작업할 때 충돌이 수정되었을 때 문제가 발생했을 수 있습니다.
MT5(빌드 2485)에서 ChartGetInteger를 호출 하기 위한 어셈블러 코드는 첨부 파일에 있습니다.

공식 빌드는 2005 빌드였고 그다음은 2085 빌드였는데 혹시 가지고 계신가요? 2007 빌드만 있습니다.
 
Sergey Dzyublik :

비동기 및 동기라는 용어를 잘못 이해하고 있습니다.
함수가 비동기식이라는 것은 현재 실행 스레드가 아니라 다른 병렬 스레드에서 실행된다는 의미입니다.

메인 스레드에서 비동기 ChartSetInteger 함수를 호출하는 것은 실제 실행이 다른 스레드에서 발생하기 때문에 빠릅니다.

반면에 동기 함수 ChartGetInteger를 호출하려면 스레드 동기화가 필요하며 추가 시간이 걸릴 수 있습니다.
지연은 병렬 스레드가 차트 구조의 데이터를 지속적으로 업데이트할 때(예: 사용자가 차트 창을 이동하거나 기록을 스크롤할 때) 특히 두드러집니다.
단순성과 신뢰성을 위해 차트 데이터 구조에 하나의 동기화 개체가 사용됩니다.
"데이터 분할"을 사용하여 실행 속도를 개선할 수 있지만 다른 한편으로는 이제 교착 상태에 빠지거나 데이터가 제대로 업데이트되지 않거나 다른 중요한 위치에서 속도가 느려질 가능성이 있습니다.
일반적으로 이미 안정적으로 작동하는 것은 만지지 않는 것이 좋습니다.

일리아스 :

피크가 차트 주석의 그림이라고 가정합니다. 그렇지 않으면 차트 대기열이 비어 있을 때 ChartGetXXX 함수 호출(동기화 호출)에 0.13밀리초가 걸립니다.

나는 코드를 말하는 데 더 익숙하다.
예를 들어 다음과 같은 지표를 스케치했습니다.


마우스가 움직이면 ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR, 0)가 실행됩니다.
빨간색 그래프는 이 함수의 실행 시간에 대한 통계입니다.
한 자릿수에 대한 간단한 요청은 전체 화면을 지우고 수천 줄의 그래프를 생성하고 눈금을 그리고 텍스트 정보 블록을 형성하고 화면에 모두 표시하는 BildChart 기능보다 몇 배 느립니다.

동시성-비동시성 때문에 그것이 어떻게 되어야 하는지에 대한 모든 학문적 내러티브는 "검은색은 흰색이다"로 인식됩니다.
따옴표의 전체 배열이 있으면 캔버스를 기반으로 하는 나만의 독립적인 차트를 쉽게 만들 수 있으며 나노초 문제에 액세스할 수 있는 이 차트의 특성에 대한 전체 테이블을 갖게 됩니다. 동시에 차트 캔버스는 다른 스레드에 그려집니다.

파일:
 
나는 컴파일러가 이 줄에서 무엇을 좋아하지 않는지 이해하지 못한 채 오랫동안 바보였습니다.
   else (Type != - 1 ) // expression has no effect

쓰는 것을 잊었다면. 그런 멍청한 사람들이 메시지를 씹는 것이 좋을 것이라고 생각했습니다.

 
Nikolai Semko :

한 자릿수에 대한 간단한 요청은 전체 화면을 지우고 수천 줄의 그래프를 생성하고 눈금을 그리고 텍스트 정보 블록을 형성하고 화면에 모두 표시하는 BildChart 기능보다 몇 배 느립니다.

내가 아는 한 ChartRedraw를 호출 하면 차트가 즉시 다시 그려지지 않습니다. 다시 그리기는 일부 Get 메서드가 호출될 때만 발생합니다.
그리고 ChartRedraw는 본질적으로 동일한 비동기 방식입니다. 따라서 BuildChart 측정은 신뢰할 수 없습니다.