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

 

불안정한 실행

  • 표시기 위치 경로: \Indicators\Test_i.ex5
  • 전문가 위치 경로: \Experts\Test.ex5
  • 스크립트 위치 경로: \Scripts\Test_s.ex5

작업 순서: Script 'Test_s.ex5'를 M15 차트(EURUSD 기호)에 여러 번 첨부합니다.

결과:

2017.02.05 15:17:59.076 온스타트 1차 가입
2017.02.05 15:18:03.293 온스타트 2차 가입
2017.02.05 15:18:07.760 온스타트 3차 가입
2017.02.05 15:18:07.778 온이니트
2017.02.05 15:18:07.781 OnDeinit:1
2017.02.05 15:18:16.891 온스타트 4차 가입

조인 결과가 다릅니다. 결과가 무작위라는 점을 제외하고는 다르지 않을 것으로 예상되었습니다. OnInit\OnDeinit가 있는 행은 첫 번째부터 나타날 수 있고 아마도 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/en/forum/1111/page1801#comment_4059227

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

제 잘못인지 단말기 탓인지 모르겠습니다.

5번째 표지판에서
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=111111111111111104 예상 값 CalcX=111111111111111111을 인쇄합니다.

 
A100 :

차트 기간 변경 시 함수 호출 순서가 잘못됨

  • 표시기 위치 경로: \Indicators\Test_i.ex5
  • 전문가 위치 경로: \Experts\Test.ex5

시퀀싱:

  1. M5 차트에 Expert Advisor 'Test.ex5' 첨부 (기호 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 #3단계: 변경 주기 M15->M30
2017.02.05 19:53:29.813 아이::~아이->M15
2017.02.05 19:53:29.864 아이::아이->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 아이::~아이->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.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 아이::~아이->엠5

2017.02.05 19:56:11.122 OnDeinit->D1:1
2017.02.05 19:56:11.123 아이::~아이->디1

비동기식은 단계 내에서 다른 순서의 함수 호출에만 영향을 줍니다(단계 #3 및 #5에서 볼 수 있음).

보시다시피 차트 기간의 모든 후속 변경은 첫 번째 변경(2단계: 출력 2줄)을 제외하고 예상대로 발생합니다(3단계: 출력 4줄과 유사). 그리고 차트 기간의 첫 번째 변경이 다른 모든 것과 달라야 하는 이유는 무엇입니까? 더 나은/나쁜 방법은 무엇입니까? 2단계(그리고 그것에서만) 출력의 누락된 두 줄이 왜 7단계(빨간색으로 강조 표시됨)로 이동했습니까?

 
-Aleks- :

제 잘못인지 단말기 탓인지 모르겠습니다.

CalcX=111111111111111104 예상 값 CalcX=111111111111111111을 인쇄합니다.

유효 소수점 이하 자릿수의 두 배 > DBL_DIG=15 이면 일반적인 규칙 - 작동하지 않음
 
A100 :

단계 사이에 충분한 시간이 경과한다고 가정합니다(차트 기간의 변경).

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 #3단계: 변경 주기 M15->M30
2017.02.05 19:53:29.813 아이::~아이->M15
2017.02.05 19:53:29.864 아이::아이->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 아이::~아이->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.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 아이::~아이->엠5

2017.02.05 19:56:11.122 OnDeinit->D1:1
2017.02.05 19:56:11.123 아이::~아이->디1

비동기식은 단계 내에서 다른 순서의 함수 호출에만 영향을 줍니다(단계 #3 및 #5에서 볼 수 있음).

보시다시피 차트 기간의 첫 번째 변경(2단계)을 제외한 모든 후속 변경은 예상대로 발생합니다(3단계와 유사). 그리고 차트 기간의 첫 번째 변경이 다른 모든 것과 달라야 하는 이유는 무엇입니까? 더 나은/나쁜 방법은 무엇입니까?

나는 다시 설명하려고 노력할 것이다

M5 차트에 몇 가지 지표가 있습니다. 기간을 M5에서 M15로 변경하면 동일한 지표의 두 번째 사본이 생성됩니다. 첫 번째는 M5 Deinit에서, 두 번째는 M15 Init에서 두 표시기로 명령이 전송됩니다. 동시에 이러한 명령 중 어느 것이 다른 명령보다 먼저 실행될지는 미리 알 수 없습니다. 여기에는 서로 다른 스레드 간에 고전적인 경쟁이 있습니다.

그 후 첫 번째 지표에 대한 사용량 카운터가 감소합니다. 사용량 카운터가 0이 된 후 몇 초 후에 표시기가 차트에서 언로드됩니다. 이 경우 이 표시기의 전역 개체 소멸자가 호출됩니다.
 
Slawa :
나는 다시 설명하려고 노력할 것이다

M5 차트에 몇 가지 지표가 있습니다. 기간을 M5에서 M15로 변경하면 동일한 지표의 두 번째 사본이 생성됩니다. 첫 번째는 M5 Deinit에서, 두 번째는 M15 Init에서 두 표시기로 명령이 전송됩니다. 동시에 이러한 명령 중 어느 것이 다른 명령보다 먼저 실행될지는 미리 알 수 없습니다. 여기에는 서로 다른 스레드 간에 고전적인 경쟁이 있습니다.

그 후 첫 번째 지표에 대한 사용량 카운터가 감소합니다. 사용량 카운터가 0이 된 후 몇 초 후에 표시기가 차트에서 언로드됩니다. 이 경우 이 표시기의 전역 개체 소멸자가 호출됩니다.

나는 M5에서 M15로 기간을 변경할 때 M5 Deinit 명령이 첫 번째 표시기로 전송되지 않고(이 경우 M5에만) 다음까지 사용자가 전문가를 삭제합니다.

'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에서 두 표시기로 명령이 전송됩니다. 동시에 이러한 명령 중 어느 것이 다른 명령보다 먼저 실행될지는 미리 알 수 없습니다 . 여기에는 서로 다른 스레드 간에 고전적인 경쟁이 있습니다.

그 후 첫 번째 지표에 대한 사용량 카운터가 감소합니다. 사용량 카운터가 0이 된 후 몇 초 후에 표시기가 차트에서 언로드됩니다. 이 경우 이 표시기의 전역 개체 소멸자가 호출됩니다.
당신이 말하는 스트림을 설명할 수 있습니까? 한 문자의 모든 표시기가 같은 스레드에서 실행되지 않습니까?
 
Vladimir Gribachev :

Bill Williams의 표시기 설치 시 결함

프랙탈 넣어 - 넣어

AO를 넣어 - ADX를 넣어

빌드 1031

/MQx/Indicators 디렉토리 구조가 변경될 때 메뉴가 업데이트되지 않는 100-500년 된 버그 :-) 버그가 너무 오래되어 이미 기능으로 인식되고 있으니 익숙해지십시오.
 
A100 :
유효 소수점 이하 자릿수의 두 배 > DBL_DIG=15 이면 일반적인 규칙 - 작동하지 않음

그리고 어떤 것이 작동합니까?

도움말은 오랫동안 최대값 이 9223372036854775807이라고 말합니다.

사유: