mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 61

 
블라디슬라프 안드루셴코 :

히스토리에 1000건 이상의 거래가 있을 때 히스토리 수익을 계산하는 히스토리 처리 기능을 호출 할 때 문제가 발생했습니다. + 현재 거래의 이익 추가 - 차트의 정보가 느려지기 시작하고 터미널이 멈춥니다. 저것들. 견적이 지연됩니다.

코드가 없으면 추측만 할 수 있습니다.

 

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

mql5 언어의 특징, 미묘함 및 작업 방법

알렉세이 나보이코프 , 2017.07.21 17:04

MQL에 다중 상속이 없다는 것은 물론 우울합니다. 그러나 즉석에서 나갈 수 있습니다: 템플릿과 매크로 - 그것들이 없는 곳)

여기에 옵션이 쌓여 있습니다. 모든 소스 클래스는 상위 클래스를 정의하는 템플릿으로 선언되어야 합니다 .

 class CBase { };   // базовый класс

// Макросы, задающие список наследования:

#define INHERIT1(T)  T<CBase>

#define INHERIT2(T1, T2)  T2<INHERIT1(T1)>

#define INHERIT3(T1, T2, T3)  T3<INHERIT2(T1,T2)>

#define INHERIT4(T1, T2, T3, T4)  T4<INHERIT3(T1,T2,T3)>


// Различные пользовательские классы:

template < typename TParent>
class A : public TParent { public : void a() { Print ( "A" ); } };

template < typename TParent>
class B : public TParent { public : void b() { Print ( "B" ); } };

template < typename TParent>
class C : public TParent { public : void c() { Print ( "C" ); } };


class X : public INHERIT3(A, B, C)  {  };   // Объявляем класс, наследуемый от A, B, C


template < typename T>
void SomeFunc(B<T>& obj)  { obj.b(); }   // Проверочная функция, принимающая класс B


void OnInit ()
{
  X x;
  x.a();
  x.b();
  x.c();
  
  SomeFunc(x);
}

물론 여기에는 클래스가 병렬로 상속되지 않고(실제 다중 상속에서와 같이) 순차적으로(우리가 설정한 순서대로) 상속된다는 사실 때문에 뉘앙스가 있습니다. 특히 과부하가 발생하면 우선 순위가 다릅니다. 또한 동일한 템플릿 클래스가 상속 체인에 여러 번 참여하면 서로 관련이 없는 완전히 다른 클래스가 됩니다. 그래서 여기서 조심해야 합니다. 그러나 인터페이스에는 문제가 없으며 제한 없이 상속할 수 있습니다.

그리고 템플릿 형태의 선언이 없다면?

예를 들어, 두 개의 기성품 자급자족 라이브러리가 있습니다.

클래스 CLib1: 공개 CClass1 { }, 그리고
클래스 CLib2: 공개 CClass2 { };

그러한 상속이 있도록 프로그램 클래스에서 그것을 만드는 것이 필요합니다:

CLib1--> CLib2 --> CProgram 두 라이브러리를 모두 CProgram 클래스에서 사용할 수 있도록 합니다. 따라서 CLib1 라이브러리는 CLib2에서 사용할 수 있었습니다.

이 경우 두 라이브러리의 코드를 어떻게든 변경하는 것은 불가능합니다.

이게 가능해?

다중 상속을 사용하면 다음과 같이 보일 것입니다.
클래스 CProgram : 공개 CLib1,CLib2 { };

 
Artyom Trishkin :

그리고 템플릿 형태의 선언이 없다면?

예를 들어, 두 개의 기성품 자급자족 라이브러리가 있습니다.

클래스 CLib1: 공개 CClass1 { }, 그리고
클래스 CLib2: 공개 CClass2 { };

프로그램 클래스에서 다음과 같은 상속이 필요합니다.

CLib1--> CLib2 --> CProgram 두 라이브러리를 모두 CProgram 클래스에서 사용할 수 있도록 합니다. 따라서 CLib1 라이브러리는 CLib2에서 사용할 수 있었습니다.

이 경우 두 라이브러리의 코드를 어떻게든 변경하는 것은 불가능합니다.

이게 가능해?

다중 상속을 사용하면 다음과 같이 보일 것입니다.
클래스 CProgram : 공개 CLib1,CLib2 { };


다음과 같이 하면 아무것도 잃지 않을 것입니다.

 class CProgram
{
  CLib1 lib1;
  CLib2 lib2;
};
 
콜둔 즐로이 :

다음과 같이 하면 아무것도 잃지 않을 것입니다.

네. 그게 바로 내가 한 일이다. 불필요한 물건 없이 그냥 하고 싶었다.
 

비동기 복사 기능(CopyRates, CopyTicks 등)에서 데이터를 가져오는 가장 좋은 방법은 EventChartCustom 을 사용하는 것입니다.

지표의 경우 특히 그렇습니다.

 

계정뿐만 아니라 거래 서버에 변경 사항이 있음을 알 수 있습니다. OnDeinit(EA, 표시기가 아님)의 AccountInfoString (ACCOUNT_SERVER) 이 새 거래 서버를 반환합니다.

 

메모

액션/프로그램 종류 TF 또는 기호 변경 계정 변경
지시자 OnDeinit 및 OnInit를 실행하면 전역 클래스 개체가 변경됩니다(하드 다시 로드). prev_calculated를 재설정하는 것 외에는 아무 일도 일어나지 않습니다.
조언자 OnDeinit 및 OnInit를 실행하면 전역 클래스 개체가 변경 되지 않습니다 . OnDeinit 및 OnInit를 실행하면 전역 클래스 개체가 변경됩니다(하드 다시 로드).
 
파일 압축 및 범용 실행 시간 측정

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

전략 테스터에 대한 나의 불만. MQL 개발자에게

fxsaber , 2017.12.04 09:11

 #define BENCH(A)                                                              \
{                                                                             \
   const ulong StartTime = GetMicrosecondCount ();                              \
  A;                                                                          \
   Print ( "Time[" + #A + "] = " + ( string )( GetMicrosecondCount () - StartTime)); \
} 

void OnStart ()
{
   uchar Data[];
   uchar Key[ 1 ];
   uchar Result[];
  
   FileLoad ( "thousands_rubies_galaxy.bmp" , Data);  
  BENCH( Print ( CryptEncode ( CRYPT_ARCH_ZIP , Data, Key, Result)))
  
   ArrayFree (Data);
  
   FileLoad ( "space_wind.wav" , Data);  
  BENCH( Print ( CryptEncode ( CRYPT_ARCH_ZIP , Data, Key, Result)))
}

결과

 826534
Time [ Print ( CryptEncode ( CRYPT_ARCH_ZIP ,Data,Key,Result))] = 53334
306648
Time [ Print ( CryptEncode ( CRYPT_ARCH_ZIP ,Data,Key,Result))] = 29029
 

가격 차트에 다른 기호의 가격 차트를 겹치는 지표의 전체 클래스가 있습니다. 그것들은 표시기 버퍼 를 통해 균일하게 만들어집니다.

그러나 MT5에는 표시기 버퍼 없이 이 작업을 훨씬 더 아름답게 구현할 수 있는 멋진 OBJ_CHART가 있습니다.

예를 들어, 표시기를 던지고 즉시 다른 기호에서 어떻게 보이는지 확인할 수 있습니다.

슬레이브 방식 - 여러 개의 차트가 메인 차트의 배경으로 표시됩니다.

 
fxsaber :

예를 들어, 표시기를 던지고 즉시 다른 기호에서 어떻게 보이는지 확인할 수 있습니다.

슬레이브 방식 - 여러 개의 차트가 메인 차트의 배경으로 표시됩니다.

어떻게 생겼는지 그림이 있습니까? 그리고 OBJ_CHART 가 아직 사용되지 않았는지 완전히 명확하지 않습니다.