그래, 무슨 일이야??? - 페이지 2

 

또 다른 농담이 있습니다. EA 장소는 매 시간이 열릴 때 판매됩니다. 유로의 경우 모든 것이 올바르게 작동하지만 사용자 지정 기호의 경우 방법이 명확하지 않습니다.

시각 모드에서 일부 양초가 누락되었습니다.


파일:
MySymbol.mq5  4 kb
Test.mq5  2 kb
 
Сергей Таболин :

이것은 다시 한번 테스터/옵티마이저에 관한 것입니다...

최적화 및 단일 테스트 결과에서 불일치를 발견했습니다. 터미널을 재부팅하고 매개변수 설정을 변경했습니다(확실히). 최적화를 시작했습니다.

단일 테스트 시작...

네, 어때요? 이 말도 안되는 소리는 어디서 나오는 걸까요?

도 있었다. 최적화 단계 사이에서 변수는 단일 단계 이전과 같이 항상 초기화되지 않거나 모두 초기화되지 않습니다. 나는 모든 것을 초기화하기 시작했고 문제는 사라졌습니다.

다시 한 번 최소한의 단계에서 iSAR로 인해 유사한 문제가 발생했습니다.

 

한 클라이언트에게 문제가 있었습니다. 그의 Expert Advisor는 테스트를 거쳐 테스터에 결과를 제공했으며 최적화 프로그램에서는 모든 실행이 0이었습니다.

거래를 여는 측면에서 그의 Expert Advisor의 알고리즘은 상황에 따라 변경되는 버튼의 비문을 읽는 것을 기반으로 했습니다. 그리고 최적화하는 동안 그래픽 개체가 렌더링되지 않기 때문에 이 쿼리는 항상 실패했습니다.

Expert Advisor의 알고리즘이 그래픽 개체의 데이터를 사용하는 경우 테스트와 최적화 간에 상당한 불일치가 있을 수도 있습니다.

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


어떤가요? 그리고 거기에, 그리고 같은 것이 있습니다. 어떻게 차이가 있을 수 있습니까? 또한 거의 모든 데이터의 초기화는 루프에서 발생합니다. 그리고 무언가가 거기에서 초기화되지 않은 경우 - 오류가 있는 출력.


가능한 경우 - 더 자세히. 루프에서 초기화를 보고 싶습니다. 내 손녀를 보여줄게.

 
절대 그렇게 하지 않기 위해.
 
Алексей Тарабанов :

가능한 경우 - 더 자세히. 루프에서 초기화를 보고 싶습니다. 내 손녀를 보여줄게.

 int sum = 0 ;

for ()

  sum = 0 ;

   for ()

    sum += ....

하지만 이렇게 하는 것이 좋습니다. 그렇지 않으면 손녀가 의미를 이해하지 못할 것입니다.

 int sum;

for ()

  sum = 0 ;

   for ()

    sum += ....
 
Andrey Barinov :
코드에서 무언가를 초기화하는 것을 잊는 것으로 충분하며 차이가 있을 것입니다. 코드를 확인하십시오.

모든 것을 다시 확인했습니다. 모든 변수가 초기화되었습니다.

@Andrey Kaunov , 감사합니다. 하지만 그래픽 개체를 전혀 사용하지 않습니다.

알렉세이 타라바노프 :

가능한 경우 - 더 자세히. 루프에서 초기화를 보고 싶습니다. 내 손녀를 보여줄게.

예, 맙소사 ))) 물론 전부는 아니지만 표시기 핸들 만 약간 과도하게 사용했습니다 )))

 int       ind_handle[];

int OnInit ()
{
...........
   if (!nc_getHandles()) return ( INIT_FAILED );
...........
}
//+------------------------------------------------------------------+
bool   nc_getHandles( void )
{
   ind_nums = ArraySize (indicators);
   ArrayResize (ind_handle, ind_nums);

   for ( int i = 0 ; i < ind_nums; i++)
   {
      ind_handle[i]  = iCustom ( Symbol (), Period (), folder+indicators[i]);
       if (ind_handle[i] == INVALID_HANDLE )
      {
         Print ( "Ошибка получения хандла индикатора >>> " +indicators[i]);
         writeErrorFile(program_name,program_version, "Ошибка получения хандла индикатора >>> " +indicators[i]);
         return ( false );
      }
   }
   Print ( "Получены хэндлы всех индикаторов >> " , ArraySize (indicators));
//-----------------------------------
   return ( true );
}
 

이제 요점으로.

모든 로그와 캐시를 완전히 지웠습니다.

편집기를 시작하고 고문을 다시 컴파일했습니다.

터미널을 열었습니다.

유전자 최적화를 시작했습니다.

우리는 기다립니다...


단독 테스트를 진행하고 있습니다.

전송된 매개변수의 정확성을 확인합니다 - 올바르게 전송되었습니다.

백테스트 탭을 엽니다.

이익 - 697 / 247

거래 - 44 / 56

이제 로그를 수집하고 첨부하겠습니다.

파일:
mt5logs.zip  288 kb
 

코드를 살펴보고 최적화 내부에서 단일 전달자에게 어떤 일이 발생하는지 알아내십시오.

출력하여 직접 파일로 출력합니다.

프로그램 내부의 논리에 관한 것입니다. 당신 외에는 아무도 볼 수 없으므로 도움이되지 않습니다.

 
Renat Fatkhullin :

코드를 살펴보고 최적화 내부에서 단일 전달자에게 어떤 일이 발생하는지 알아내십시오.

출력하여 직접 파일로 출력합니다.

프로그램 내부의 논리에 관한 것입니다. 당신 외에는 아무도 볼 수 없으므로 도움이 없을 것입니다.

레나트, 고마워. 여기에서만 나에게 어둡게 설명합니다. 옵티마이저의 2 * 2 + 2 * 3과 단일 패스의 차이점은 무엇입니까? 글쎄요, 적어도 정확히 어디에 불일치가 있을지 힌트를 줍니까?

글쎄, 당신이 이것을 언급했다면 동시에 테스터와 실제 계정 에서 고문의 작업에서 불일치를 찾을 위치와 내용을 암시하십시오.

나는 분명히 내 자신의 어리석음 때문에 작성된 코드(오류가 있는지 없는지, 최적화되었는지 여부는 중요하지 않음)가 결국 컴파일되고 따라서 동일한 방식으로 작동해야 한다고 항상 확고하게 믿었습니다. 옵티마이저, 테스터 및 실제 ...

글쎄, 간단한 프로그래머의 입장을 취하십시오 - 이 세 가지 상태에서 하나의 (컴파일된) 코드 실행의 차이점이 무엇인지 명확하지 않은 위치, 방법 및 수단을 찾아야 합니다.

나는 사용자로서 옵티마이저와 테스터에서 하나의 실행 파일이 다르게 작동한다는 것을 알았습니다.


당신이 고문을 테스트하고 그는 ... 글쎄, 아니요. 그리고 현실에서 던진다면? 성배라면? ))))