MT 버전 아카이브. - 페이지 2

 
Сергей Таболин :

정신적으로 나머지 코드를 실행하지 않고 전송이 즉시 수행되어야 한다고 가정합니다. 그래서?

사실 TesterStop()은 테스트를 전혀 중지하지 않습니다!

생각에 따르면 코드 실행을 더 이상 중단해야 하는 경우 단순히 return을 작성하면 계속되지 않을 것입니다. 그리고 TesterStop() 및 ExpertRemove ()

ExpertRemove() 함수가 호출될 때 Expert Advisor가 즉시 중지되지 않고 Expert Advisor 를 중지하는 플래그만 설정됩니다 . 즉, Expert Advisor는 더 이상 다음 이벤트 를 처리하지 않으며 OnDeinit()이 호출되고 차트에서 언로드 및 제거됩니다.

그리고 두 번째로 주목되는 잼은

 tester_stop = false ;

완전히 제자리에서.

 
Alexey Viktorov :

생각에 따르면 코드 실행을 더 이상 중단해야 하는 경우 단순히 return을 작성하면 계속되지 않을 것입니다. 그리고 TesterStop() 및 ExpertRemove()

그리고 두 번째로 주목되는 잼은

완전히 제자리에서.

다음 이벤트는 OnTick() 입니까?

OnTick()을 어디에서 종료할 수 있습니까?

왜 제자리에 있지 않습니까? TesterStop() 이 작동 하면 실행이 이 행에 도달하지 않을 것으로 예상했습니다.

 
Сергей Таболин :

다음 이벤트는 OnTick() 입니까?

OnTick()을 어디에서 종료할 수 있습니까?

왜 제자리에 있지 않습니까? TesterStop()이 작동하면 실행이 이 행에 도달하지 않을 것으로 예상했습니다.

어디로 가고 무엇을 계속할지는 개발자의 몫이다.

       if ((stop_loss_buy > 0 && stop_loss_buy < 700 ) || (stop_loss_sell > 0 && stop_loss_sell < 700 ))
      {
         Print ( "Результат в OnTester() должен быть -99999999999.99" );
         TesterStop ();
      }
      check_init  = true ;
       tester_stop = false ;

이 코드에서 tester_stop 플래그는 TesterStop() 이 실행되는지 여부에 관계없이 false로 설정됩니다.

 
Alexey Viktorov :

어디로 가고 무엇을 계속할지는 개발자의 몫이다.

이 코드에서 tester_stop 플래그는 TesterStop()이 실행되는지 여부에 관계없이 false로 설정됩니다.

그래서 이것은 내가 이미 이해 한 것입니다)))

문제는 - 무엇을 할 것인가? 테스트를 중지하는 방법? 구체적으로. 개발자 는 OnInit()에서 INIT_PARAMETERS_INCORRECT 를 사용하는 경우 거의 맹세합니다. 이는 견갑골에 유전학을 부여합니다.

해결책을 찾았습니다. 최근까지는 문제가 없었습니다. 그리고 지금 ... 그것은 끔찍합니다)))

그러나 OnTick()을 어디에서 종료할 수 있습니까?

 
Сергей Таболин :

그래서 이것은 내가 이미 이해 한 것입니다)))

문제는 - 무엇을 해야 합니까? 테스트를 중지하는 방법? 구체적으로. 개발자 는 OnInit()에서 INIT_PARAMETERS_INCORRECT 를 사용하는 경우 거의 맹세합니다. 이는 견갑골에 유전학을 부여합니다.

탈출구를 찾았지만 지난 번에는 문제가 없었습니다. 그리고 지금은 ... 끔찍합니다)))

문제가 무엇인지 이해한다면?

         TesterStop ();
      tester_stop = false ;
       return ;

TesterStop 이 실행된 후에는 모든 코드가 실행되지 않습니다. 즉, 작업이 즉시 중단됩니다. 또한 tester_stop 플래그에 초점을 맞춰 조정하는 것이 이미 가능합니다 ...

그리고 또 다른 질문: 어떤 종류의 숫자를 생각해 냈습니까? 빼기 많은 9, 그것은 무엇입니까? 추가 출혈을 얻으려고? 여기가 진짜 무섭다...

 
Alexey Viktorov :

문제가 무엇인지 이해한다면?

TesterStop이 실행된 후에는 모든 코드가 실행되지 않습니다. 즉, 작업이 즉시 중단됩니다. 또한 tester_stop 플래그에 초점을 맞춰 조정하는 것이 이미 가능합니다 ...

그리고 또 다른 질문: 어떤 종류의 숫자를 생각해 냈습니까? 빼기 많은 9, 그것은 무엇입니까? 추가 출혈을 얻으려고? 여기가 진짜 무섭다...

9를 빼면 정확히 TesterStop()에 의해 종료되었는지 확인합니다. INIT_PARAMETERS_INCORRECT를 대체하는 용도로만 사용합니다. 따라서 그 이후의 다른 모든 것은 필요하지 않습니다. 이제 모든 코드가 실행되고 0으로 나누기 오류가 나타납니다. 당연히 배열의 차원이 1이면 후자의 값에서 전자의 값을 뺀 값은 항상 0이 됩니다! 그리고이 에서 오, 죄송합니다. 오해에 대해 보험에 들지 않았습니다.

반환을 삽입하려고했습니다 ... 잘못된 위치에 약간만 있습니다.))) :

       if ((stop_loss_buy > 0 && stop_loss_buy < 700 ) || (stop_loss_sell > 0 && stop_loss_sell < 700 ))
      {
         Print ("Результат в OnTester () должен быть - 99999999999.99 ");
         TesterStop ();
         return ;
      }

마침내 얻었다:

DM       0        15 : 32 : 01.518     Core 1    2016.10 . 01 00 : 00 : 00    153128312914612747
PE       0        15 : 32 : 01.518     Core 1    2016.10 . 01 00 : 00 : 00    Советник получил MAGIC = 153128312914612747 .
IF       0        15 : 32 : 01.518     Core 1    2016.10 . 03 00 : 00 : 00    Результат в OnTester () должен быть - 99999999999.99
RS       3        15 : 32 : 01.518     Core 1    TesterStop () called on 0 % of testing interval
GK       0        15 : 32 : 01.518     Core 1    final balance 10000.00 USD
JM       0        15 : 32 : 01.518     Core 1    OnTester result - 99999999999.99001

그냥 놀라))))

정말 감사합니다!!!

 
Сергей Таболин :

빼기 많은 9 - 이것은 정확히 TesterStop()에 의해 종료되었는지 확인하기 위한 것입니다. INIT_PARAMETERS_INCORRECT를 대체하는 용도로만 사용합니다. 따라서 그 이후의 다른 모든 것은 필요하지 않습니다. 이제 모든 코드가 실행되고 0으로 나누기 오류가 나타납니다. 당연히 배열의 차원이 1이면 후자의 값에서 전자의 값을 뺀 값은 항상 0이 됩니다! 그리고이 에서 오, 죄송합니다. 오해에 대해 보험에 들지 않았습니다.

반환을 삽입하려고했습니다 ... 잘못된 위치에 약간만))) :

마침내 얻었다:

그냥 놀라))))

정말 감사합니다!!!

세르게이 타볼린 :

덕분에 이미 이해했습니다. 하지만 문제가 해결되지 않습니다. MQL_TESTER_STOP 상수를 사용하거나 반환값을 void에서 bool로 변경하여 해결할 수 있습니다.

Alexey Viktorov가 예상치 못한 결정을 제안했습니다 . TesterStop() 이후에 return을 사용하면 모든 것이 정상으로 돌아간 것처럼 보입니다. 개인적으로 어떻게 그리고 왜 이런 일이 일어 났는지 따라갈 수 없습니다 ... 그럼에도 불구하고 ...

여기에서 이 점을 문서에 추가하거나 void를 bool로 변경하십시오.

추신 빌드 2085에서 이 문제가 발생했습니다. 그 전에는 문제가 없었습니다. 제 생각에는 이것이 의미하는 바가 있습니까? )))

Sergey, 여기에는 예상치 못한 것이 없습니다. 반대로 모든 것이 자연스럽고 일관성이 있습니다. 다른 경우가 있습니다. 고문이 끝나기 전에 이벤트 처리를 완료해야 하는 경우도 있고, 귀하의 경우처럼 긴급하게 완료해야 하는 경우도 있습니다. 그래서 실행을 완료해야 하는 사람들로부터 불만을 받았는지, 아니면 이벤트 처리가 완료된 후 중지하는지에 대해 명확하게 인터럽트하고, 무엇을 하는 것이 옳은지 개발자들 앞에 질문이 생깁니다. 동시에 모든 프로그래머는 무기고에 return 문이 있으며 강제 종료되는 것은 없습니다.

그리고 어떤 목적으로 void 유형을 bool로 변경해야 했습니까? 프로그래머의 무기고에는 TesterStop() 전후에 변경할 수 있는 정적 변수가 있고 원칙적으로 모든 것이 원하는 대로 되기 때문입니다. 그리고 어떤 이유로 당신은 내 예에서 그것을 버렸다.

 
Alexey Viktorov :

Sergey, 여기에는 예상치 못한 것이 없습니다. 반대로 모든 것이 자연스럽고 일관성이 있습니다. 다른 경우가 있습니다. 고문이 끝나기 전에 이벤트 처리를 완료해야 하는 경우도 있고, 귀하의 경우처럼 긴급하게 완료해야 하는 경우도 있습니다. 그래서 실행을 완료해야 하는 사람들로부터 불만을 받았는지, 아니면 이벤트 처리가 완료된 후 중지하는지에 대해 명확하게 인터럽트하고, 무엇을 하는 것이 옳은지 개발자들 앞에 질문이 생깁니다. 동시에 모든 프로그래머는 무기고에 return 문이 있으며 강제 종료되는 것은 없습니다.

그리고 어떤 목적으로 void 유형을 bool로 변경해야 했습니까? 프로그래머의 무기고에는 TesterStop() 전후에 변경할 수 있는 정적 변수가 있고 원칙적으로 모든 것이 원하는 대로 되기 때문입니다. 그리고 어떤 이유로 당신은 내 예에서 그것을 버렸다.

알렉스, 도와주셔서 정말 감사합니다.

개발자가 직면한 질문을 이해하고 있기 때문에 그러한 솔루션을 제안합니다. 상황에 적절하게 대응할 수 있습니다.

정적 변수 와 내가 "던진" 예에 관해서는 ... 죄송합니다. 그러나 그것이 무엇에 관한 것인지 잘 이해하지 못합니다. 실례가 되지 않는다면 설명하세요.

그리고 약간의 관대함과 인내심을 요구합니다. 나는 지금 매우 안 좋은 상황에 처해 있습니다. 그 때문에 나는 매우 짜증이 나고(이 점을 이해하지만 지금까지는 그것에 대해 아무 것도 할 수 없습니다) 주의를 기울이지 않습니다.

그리고 여기서 일반적으로 오해가 사라집니다. 헤드 스핀...

예시:

내 코드에서 배열의 마지막 값에서 배열의 첫 번째 값을 뺀 값이 초기 0이면 결과는 -99999999999.88이어야 함을 알 수 있습니다.

최적화하면 다음과 같은 결과가 나타납니다.

 2019.06 . 16 16 : 27 : 09.847 Core 1    final balance 9587.10 USD
2019.06 . 16 16 : 27 : 09.847 Core 1    OnTester result - 99999999999.88

9587 - 10000은 0이 아니지만 결과는 -99999999999.88입니다. 어떻게?!?!? 난 이미 붙어있어...

 
Сергей Таболин :

알렉스, 도와주셔서 정말 감사합니다.

개발자가 직면한 질문을 이해하고 있기 때문에 그러한 솔루션을 제안합니다. 상황에 적절하게 대응할 수 있습니다.

정적 변수 와 내가 "던진" 예에 관해서는 ... 죄송합니다. 그러나 그것이 무엇에 관한 것인지 잘 이해하지 못합니다. 실례가 되지 않는다면 설명하세요.

그리고 관대함과 인내심을 요구합니다. 나는 지금 매우 안 좋은 상황에 처해 있습니다. 그 때문에 나는 매우 짜증이 나고(이 점을 이해하지만 지금까지는 그것에 대해 아무 것도 할 수 없습니다) 주의를 기울이지 않습니다.

그리고 여기서 일반적으로 오해가 사라집니다. 헤드 스핀...

예시:

내 코드에서 배열의 마지막 값에서 배열의 첫 번째 값을 뺀 값이 초기 0이면 결과는 -99999999999.88이어야 함을 알 수 있습니다.

최적화할 때 다음과 같은 결과를 얻습니다.

9587 - 10000은 0이 아니지만 결과는 -99999999999.88입니다. 어떻게?!?!? 난 이미 붙어있어...

이것이 좋은지 나쁜지는 모르겠지만 전체 코드를 깊이 파고들지 않았기 때문에 정적 변수에 대해 이야기했습니다. 그리고 tester_stop 플래그가 프로그램의 다른 부분에서 사용된다는 사실로 판단하면 이 플래그는 전역 변수 수준에서 선언되어야 합니다.

따라서 내 예에서 플래그 값의 변경 사항을 무심코 "버려 버렸다"는 확인이 있습니다.

용도는 다음과 같습니다.

   if (tester_stop) return (- 99999999999. 99 );

그리고 분명히 이 플래그는 전혀 변경되지 않거나 변경 사항이 있어야 할 위치에 제공되지 않기 때문에 변경되지 않습니다.

 
Alexey Viktorov :
때로는 어드바이저 가 끝나기 전에 이벤트 처리를 완료해야 하는 경우가 있습니다.

동시에 모든 프로그래머는 무기고에 return 문 이 있으며 강제 종료가 없습니다 .


이런 맥락에서 우리는 확인을 할 수 없습니까?

 if ( IsStopped ())
if (! IsStopped ())