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

 
Roman :

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

불행히도, 이 테스트는 아무것도 나타나지 않았습니다...

 
Roman :

IsStopped()를 사용하여 예를 들어 첫 번째 부분에 답하려고 했습니다.
고문이 끝나기 전에 이벤트 처리를 완료해야 하는 경우도 있고, 귀하의 경우처럼 긴급하게 완료해야 하는 경우도 있습니다.
문서에서 이 IsStopped() 함수 에 대한 설명을 읽으면 몇 가지 아이디어를 얻을 수 있습니다.
그러나 그것은 다른 오페라에서 당신에게 보였다. 다른 사람의 경우 가능한 가정에 대해 유감스럽게 생각합니다.
그러나 가능한 제안에서 말했듯이 문제에 대한 검색이 해결됩니다.
아무도 자신의 코드의 모든 논리를 알지 못하기 때문에 명확한 해결책을 말하지 않을 것이며 아마도 자세히 살펴보지도 않을 것입니다.

로만, 여기서 다시 당신은 완전한 인용을 하지 않습니다. 그러나 그는 선택된 모든 사람 중에서 한 명을 뽑았습니다.

자, 강제 종료가 실행 중이라고 가정해 보겠습니다. 그리고 이 완료가 완료되기 위해 시작되고 계산의 복잡성이 3초를 초과하는 이벤트가 필요합니다. 그리고 어떻게 프로그램이 종료되는 것을 방지하고 끝까지 실행하도록 할 수 있습니까? 이것이 바로 문제입니다. 종료 방법에 대한 대화가 아니라 종료라고 잘못 호출되는 것을 방지하는 방법에 대한 대화였습니다. 또는 방지하는 것이 아니라 특정 순간까지, 특히 이벤트 처리가 완료될 때까지 연기하는 것입니다.

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

버전을 확인했습니다. 이 메시지로 모든 것이 끝났습니다.

일반적으로 - 막 다른 골목 ...

그래서 제안된 옵션은

 bool                  tester_stop = false ;                 // флаг проверки выхода по TesterStop
.......
void OnTick ()
{
//--- пропустить бесполезные проходы оптимизации
   if (!check_init && ( MQLInfoInteger ( MQL_OPTIMIZATION ) || MQLInfoInteger ( MQL_TESTER )))
   {
       if (недопустимый параметр)          tester_stop = TesterStop ();
........
}
double OnTester ()
{
   if (tester_stop) return (- 99999999999.99 );

정확히 동일하게 작동합니다. 그리고 다시 "막다른 길"이 나타납니다. 그러나 막다른 골목은 mql이 아니라 머리에 있습니다. 당신은 그런 프로그래밍을 할 수 없습니다. 코드에서 무언가를 기대하기 전에 자신이 바보가 되는 것을 상상하고 컴퓨터가 하는 것처럼 전체 코드를 여러 번 어리석게 살펴봐야 합니다. 어떤 경우에 실행이 전송되어야 하는지 확인하십시오. 이 경우 또는 그 경우에 수신해야 하는 매개변수. 그런 다음 실행을 시작하여 원하는 결과를 얻었는지 확인하십시오. 그렇지 않은 경우 디버깅 중에 볼 수 있는 위치를 찾아야 합니다.

그렇지 않으면 불가능합니다. 그리고 코드 조각으로 실행을 디버그하는 것은 절대 불가능합니다.

 
Alexey Viktorov :

로만, 여기서 다시 당신은 완전한 인용을 하지 않습니다. 그러나 그는 선택된 모든 사람 중에서 한 명을 뽑았습니다.

자, 강제 종료가 실행 중이라고 가정해 보겠습니다. 그리고 이 완료가 완료되기 위해 시작되고 계산의 복잡성이 3초를 초과하는 이벤트가 필요합니다. 그리고 어떻게 프로그램이 종료되는 것을 방지하고 끝까지 실행하도록 할 수 있습니까? 이것이 바로 문제입니다. 종료 방법에 대한 대화가 아니라 종료라고 잘못 호출되는 것을 방지하는 방법에 대한 대화였습니다. 또는 방지하는 것이 아니라 특정 순간까지, 특히 이벤트 처리가 완료될 때까지 연기하는 것입니다.

계산이 완료될 때까지 기다리십시오.

mql에는 불행히도 await 유형의 그러한 기능이 없습니다.
Sleep() 으로 실험을 시도할 수 있지만 sleep은 완료의 명확한 신호가 아니므로 매우 적합하지 않습니다.
(계산 완료) 강제 완료를 시작하면 다른 방식으로 조건을 생성해 보십시오.

 
Alexey Viktorov :

그래서 제안된 옵션은

정확히 동일하게 작동합니다. 그리고 다시 "막다른 길"이 나타납니다. 그러나 막다른 골목은 mql이 아니라 머리에 있습니다. 당신은 그런 프로그래밍을 할 수 없습니다. 코드에서 무언가를 기대하기 전에 자신이 바보가 되는 것을 상상하고 컴퓨터가 하는 것처럼 전체 코드를 여러 번 어리석게 살펴봐야 합니다. 어떤 경우에 실행이 전송되어야 하는지 확인하십시오. 이 경우 또는 그 경우에 수신해야 하는 매개변수. 그런 다음 실행을 시작하여 원하는 결과를 얻었는지 확인하십시오. 그렇지 않은 경우 디버깅 중에 볼 수 있는 위치를 찾아야 합니다.

그렇지 않으면 불가능합니다. 그리고 코드 조각으로 실행을 디버그하는 것은 절대 불가능합니다.

따라서 문제의 사실은 모든 것이 업데이트 전에 작동했으며 지금은 무엇을 해야할지 모르겠다는 것입니다.

또한 원칙적으로 모든 코드는 공개되어 있습니다.

게다가, 나는 이미 OnTester() 버전에 대해 토론하고 개선하기 위한 스레드를 열고 싶었습니다.

결과적으로 문제는 그 안에 있는 것이 아니라 TesterStop() 의 변경된 실행에 있습니다. 원칙적으로 OnTester()와 직접적인 관련이 없지만 분위기를 망쳤습니다...

이제 다른걸 해볼께요...

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

따라서 문제의 사실은 모든 것이 업데이트 전에 작동했으며 지금은 무엇을 해야할지 모르겠다는 것입니다.

또한 원칙적으로 모든 코드는 공개되어 있습니다.

게다가, 나는 이미 OnTester() 버전에 대해 토론하고 개선하기 위한 스레드를 열고 싶었습니다.

결과적으로 문제는 그 안에 있는 것이 아니라 TesterStop()의 변경된 실행에 있습니다. 원칙적으로 OnTester()와 직접적인 관련이 없지만 분위기를 망쳤습니다...

이제 다른걸 해볼께요...

결국 그들은 이전 빌드에 대한 링크를 제공했습니다. 파일을 교체하고 확인하십시오. 그런 다음 모든 사람에게 어떤 빌드에서 작동하는지 알릴 수 있습니다. 작동하지 않으면 이러한 매개변수가 단순히 일치하여 문제가 발생한 코드의 이 부분으로 이어지지 않았음을 의미합니다.

 
Alexey Viktorov :

결국 그들은 이전 빌드에 대한 링크를 제공했습니다. 파일을 교체하고 확인하십시오. 그런 다음 모든 사람에게 어떤 빌드에서 작동하는지 알릴 수 있습니다. 작동하지 않으면 이러한 매개변수가 단순히 일치하여 문제가 발생한 코드의 이 부분으로 이어지지 않았음을 의미합니다.

그래서 나는 시도했다. 2007 빌드를 제공했으며 이러한 모든 문제는 존재하지 않습니다. 최적화 후 전체 로그를 구체적으로 검토했습니다. 0으로 나누기 오류 4개(단 4개!)를 찾았습니다. 거래가 없을 때 나타난 것들입니다. 이것은 물론 수정했어야 했지만 전체 최적화 결과에는 영향을 미치지 않았습니다! 그리고 새 빌드에서는 오류만 쌓여서 최적화가 불가능해졌습니다.

이제 @Roman 의 팁에 대해 .

감사합니다, 그것은 올바른 메시지로 밝혀졌습니다. 내 경우에만 TesterStop()의 경우 TesterStop()이 테스트가 이미 some_unknown_percentage에 의해 통과되어야 하기 때문에 쓸모없는 것으로 판명되었습니다. 그리고 문서에는 이에 대한 언급이 없습니다.

그러나 ExsprtRemove()를 사용하면 작동했습니다. 이 기능의 경우 통과한 테스트 수는 중요하지 않습니다. 사실, 모든 작업 코드를 다음과 같이 래핑해야 했습니다.

   if (! IsStopped ())
   {
      тут рабочий код
   }

일반적으로 목발을 사용하면 코드의 견고성이 복원되었습니다. 다시 한번 감사합니다.

추신 실은 다른 목발을 위해 목발을 만들어야 했다. 미소))))

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

추신 실은 다른 목발을 위해 목발을 만들어야 했다. 미소))))

나는 옵션이 없다고 생각하지 않습니다. 목발을 목발로 프로그래밍하는 것을 좋아한다면 나는 간섭할 권리가 없습니다. 슬라바는 이에 대해

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

슬라바 , 2019.06.16 14:04

Expert Advisor의 즉시 중지는 메모리 손상을 의미합니다. Expert Advisor를 즉시 중지한 후 해제되지 않은 메모리 블록이 남아 있을 수 있습니다. 따라서 Expert Advisor의 즉시 정지는 클라이언트 단말 또는 테스트 에이전트가 종료된 경우에만 Expert Advisor가 정지 플래그를 처리하지 않고 계속 실행하는 경우에만 사용된다.

TesterStop은 테스트를 종료하는 명령을 제공합니다. 즉, 현재 OnInit, OnTick, OnTimer, OnChartEvent 핸들러가 완료된 후 처리 루프가 완료되므로 테스터 이벤트가 더 이상 처리되지 않습니다. 그리고 OnTester와 OnDeinit가 호출됩니다.

아마도 이전 빌드에서 개발자가 허용한 Jamb를 사용했을 것입니다. 이제 이 캔트가 수정되었으며 올바른 솔루션을 찾아야 합니다.
 
Сергей Таболин :

그래서 나는 시도했다. 2007 빌드를 제공했으며 이러한 모든 문제는 존재하지 않습니다. 최적화 후 전체 로그를 구체적으로 검토했습니다. 0으로 나누기 오류 4개(단 4개!)를 찾았습니다. 이것들은 거래가 없을 때 나타난 것들입니다. 이것은 물론 수정했어야 했지만 전체 최적화 결과에는 영향을 미치지 않았습니다! 그리고 새 빌드에서는 오류만 쌓여서 최적화가 불가능해졌습니다.

이제 @Roman 의 팁에 대해.

감사합니다, 그것은 올바른 메시지로 밝혀졌습니다. 내 경우에만 TesterStop()의 경우 TesterStop()이 테스트가 이미 some_unknown_percentage에 의해 통과되어야 하기 때문에 쓸모없는 것으로 판명되었습니다. 그리고 문서에는 이에 대한 언급이 없습니다.

그러나 ExsprtRemove()를 사용하면 작동했습니다. 이 기능의 경우 통과한 테스트 수는 중요하지 않습니다. 사실, 모든 작업 코드를 다음과 같이 래핑해야 했습니다.

일반적으로 목발을 사용하면 코드의 견고성이 복원되었습니다. 다시 한번 감사합니다.

추신 실은 다른 목발을 위해 목발을 만들어야 했다. 미소))))

이것은 목발이 아니라 개발자가 권장하는 방법입니다.
while 루프에 대한 설명에서 이 기능을 찾았습니다.

 while (! IsStopped ())
{

}

그래서 이 함수가 프로그램의 강제 종료 사실을 확인하면 TesterStop()에 사용하지 않는 이유를 생각해 냈습니다.
TesterStop()에서 작동하지 않는 것은 유감입니다. 이제 이에 대해 알게 될 것입니다.
개발자들에게 물어보는 것이 공정하지만, IsStopped () 함수는 TesterStop() 함수 에 대해 실행되어야 합니까?
버그가 아닐까요?

그러나 가장 중요한 것은 문제에 대한 해결책을 찾는 것이었습니다.

 
Alexey Viktorov :

나는 옵션이 없다고 생각하지 않습니다. 목발을 목발로 프로그래밍하는 것을 좋아한다면 나는 간섭할 권리가 없습니다. 슬라바는 이에 대해

아마도 이전 빌드에서 개발자가 허용한 Jamb를 사용했을 것입니다. 이제 이 캔트가 수정되었으며 올바른 솔루션을 찾아야 합니다.

나는 모든 것을 이해하고 목발이 필요하지 않습니다. 그리고 여기서 목발을 찾아야 했습니다. 무엇을 읽어야 합니까?

아마도. 그러나 나는 그것에 대해 불평하는 사람을 기억하지 못한다.