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

 

나는 시장에서 제품의 자동 검증에 세부 사항을 추가할 것을 제안합니다. 검증자가 보고한 일반적인 오류 외에도 수행 중인 검증의 컨텍스트와 로그가 강력하게 필요합니다. 특히 "테스터가 너무 오래 걸립니다" 오류로 인해 몇 년 동안 하나의 지표를 업데이트할 수 없었습니다. 첫 번째 버전은 "인간적인" 중재로 업로드되었으며 어떤 불만도 일으키지 않았습니다. 이 오류를 발생시키는 자동 유효성 검사기의 기준은 완전히 불분명합니다.

다음은 그러한 구체적인 질문 입니다. "테스터가 너무 오래 걸립니다"가 발생하지 않도록 제품이 어떤 하드웨어에 얼마나 많은 시간을 제공해야 합니까?

표시기는 MapReduce 알고리즘으로 틱을 처리하기 위한 것이며 정수 계산이 사용되므로 알고리즘 자체를 폐기하지 않는 한 압축할 것이 없습니다. 프로파일러 가 사용되었으며 지정된 기간으로 새 틱 배열을 다시 계산하기 위해 조절이 추가되었습니다. 아무 소용이 없습니다.

내 컴퓨터에서 1년은 몇 분 안에 테스트됩니다. autovalidator에서 실제로 일어나는 일과 속도가 느려지는 이유는 현재로서는 알 수 없습니다.

적절한 제품 지원의 부족은 사용자와 MQ 모두에게 문제이며 구현에 영향을 미칩니다.

 

꼭 그래야 하는 걸까요?

 class cA
  {
public :
   int                Add( int i1, int i2)
     {
       return i1+i2;
     };
                     cA()
     {
       Print ( "+++" );
     };
                    ~cA()
     {
       Print ( "---" );
     };
  };

void OnStart ()
  {
   cA a=cA();
  }

통나무:

 2020.04 . 17 18 : 39 : 32.996 test3 (EURUSD,M1)       +++
2020.04 . 17 18 : 39 : 32.996 test3 (EURUSD,M1)       +++
2020.04 . 17 18 : 39 : 32.996 test3 (EURUSD,M1)       ---
2020.04 . 17 18 : 39 : 32.996 test3 (EURUSD,M1)       ---

두 개의 객체가 생성 및 삭제된 것처럼 생성자와 소멸자의 이중 호출. new 및 delete를 사용할 때 모든 것이 정상입니다.

빌드 2380.

 
Aliaksandr Hryshyn :

마치 두 개의 객체가 생성되고 삭제되는 것처럼.

그리고 있습니다.

 
fxsaber :

그리고 있습니다.

그리고 내 개체가 두 번째로 생성됩니다.

 class cA
  {
public :
   int                my_i;
   int                Add( int i1, int i2)
     {
       return i1+i2;
     };
                     cA()
     {
       static int i= 0 ;
      my_i=i;
      i++;
       Print ( "+++" );
     };
                    ~cA()
     {
       Print ( "---" );
     };
  };

void OnStart ()
  {
   cA a=cA();
   Print (a.my_i);
  }
 2020.04 . 17 18 : 47 : 34.771 test3 (EURUSD,M1)       +++
2020.04 . 17 18 : 47 : 34.771 test3 (EURUSD,M1)       +++
2020.04 . 17 18 : 47 : 34.771 test3 (EURUSD,M1)       ---
2020.04 . 17 18 : 47 : 34.771 test3 (EURUSD,M1)       1
2020.04 . 17 18 : 47 : 34.771 test3 (EURUSD,M1)       ---
 
Aliaksandr Hryshyn :

그리고 내 개체가 두 번째로 생성됩니다.

첫 번째 개체입니다.

cA a= cA() ;


두 번째 개체입니다.

 cA a =cA();
 

그러면 다음과 같아야 합니다.

cA a;
Print (a.my_i);
 
Stanislav Korotky :

내 컴퓨터에서 1년은 몇 분 안에 테스트됩니다. autovalidator에서 실제로 일어나는 일과 속도가 느려지는 이유는 현재로서는 알 수 없습니다.

몇 분 안에 1년은 많은 시간입니다. 아무도 기다리지 않았을 것입니다(고문이었다면).
시각적으로 괜찮아 보이나요? 테스터를 보면서 무언가를 이해할 수 있습니까?

시장에 대한 스텁을 추가하십시오 - 정확도를 희생 하면서 계산 속도를 높이 거나(가능한 경우) "비슷한 것"을 그리십시오. 제품은 명확하게 구체적이며 필요한 사람은 원하는 매개변수를 전환할 수 있습니다.

 
Andrey Khatimlianskii :

몇 분 안에 1년은 많은 시간입니다. 아무도 기다리지 않았을 것입니다(고문이었다면).
시각적으로 괜찮아 보이나요? 테스터를 보면서 무언가를 이해할 수 있습니까?

시장에 대한 스텁을 추가하십시오 - 정확도를 희생 하면서 계산 속도를 높이 거나(가능한 경우) "비슷한 것"을 그리십시오. 제품은 명확하게 구체적이며 필요한 사람은 원하는 매개변수를 전환할 수 있습니다.

제 생각에는 틱 모드에서 몇 분 안에 1년이 정상입니다. 챔피언십 초반에는 15~20분 제한이 있었습니다(정확히 기억나지 않음). 스텁이 이미 추가되었습니다(시간 조절). 틱은 건너뛸 수 있지만 그러면 제품의 의미가 사라집니다. 특정성은 상대적인 개념입니다. 많은 사람들이 틱 단위로 작업한다는 것을 알고 있습니다(모든 사람이 가격 및/또는 수량을 확인하는 부록이 있습니다). 그리고 더 정확한 기준과 자동 검증기의 피드백을 갖는 것이 더욱 중요합니다(포럼에서 "터미널이 작동하지 않습니다"라고 말하면 MQ에 대해 무엇을 요구합니까? - 재생산을 위한 로그와 조건을 제공하십시오. 여기에서 우리 제품이 작동하지 않는다는 말을 들었지만 구체적인 내용은 없었습니다). 그리고 더 정확하게 - 제품의 특성을 고려합니다. 결국 제품의 총 실행 시간은 MQL 코드의 시간일 뿐만 아니라 단말 자체의 시간이기도 하다. CopyTicksRange와 같은 더 비싼 호출이 있습니다. 이러한 오버헤드는 이제 MQL 제품의 결함으로 고려됩니다.

추신. 인디케이터의 경우 틱으로 작동하지 않고 버퍼의 수(작업의 특성으로 인해 많은 버퍼가 있음)로 작동하지 않는 것이 더 중요한 것 같습니다. 나는 테스터를 위해 그들의 수를 제한하려고 노력할 것입니다(이것은 제품을 복잡하게 만들고 조절과 같은 외부 조건에 의해 부과된 다른 플래그와 같이 오류로 가득 차 있습니다). 이것은 autovalidator가 여러 가지 방법으로 성능 점수를 변경해야 할 필요성을 다시 한 번 증명합니다.

추신 나는 마지막 날에 틱을 요청하고 테스터는 2년 동안 틱을 로드합니다. 이것도 시간이 걸립니다.

 
Stanislav Korotky :

추신 마지막 날에 틱을 요청하고 테스터는 2년 동안 틱을 로드합니다.

어떤 이유에서인지 이 동작은 공식적입니다.

아마도 지표를 사용하지 않거나 막대를 참조하지 않는 Expert Advisors에 대해 막대를 전혀 생성하지 않을 수 있습니다.

예를 들어 SymbolInfoTick만 있는 경우 - 막대를 생성하지 않고 카피틱에 대한 기록을 저장하지 마십시오.


이 바로-필리아는 Tester와 같은 진지한 알고리즘 거래 도구에 대해 전혀 명확하지 않습니다. 하지만 MO 매니아도 계속 이 선인장을 먹기 때문에 아마 이해가 되지 않을 것입니다.

 

MQL의 자체 팩토리 메소드에서 보호된 생성자를 호출할 수 없는 이유는 무엇입니까?

 class A1
{
   protected :
    A1( const bool x = false ){}
   public :  
     static A1 *creator()
    {
       return new A1( true );
    }
};

void OnStart ()
{
  A1 *a = A1::creator();
}

코드는 컴파일 오류 "'A1::A1' - 보호된 멤버 함수에 액세스할 수 없음"을 표시하고 생성자가 호출된 위치가 아니라 클래스 설명이 시작되는 행을 나타냅니다(즉, 문제는).

그러나 결론은 오류가 전혀 없어야 한다는 것입니다. C++는 문제 없이 컴파일됩니다.