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

 

상속된 구조의 특징

 struct A
{
private : 
   int i;
};

struct B : public A
{
   int i; // A::i в private, поэтому никакого пересечения по именам
};

void OnStart ()
{
  A a;
  B b;
  
   Print ( sizeof (a)); // 4
   Print ( sizeof (b)); // 8 - при любом наследовании размер только увеличивается
  
   // Кастинг в обе стороны без union
  a = b;
  b = a;
}
 

설정 --> 차트 --> 창의 최대 막대 에서 "무제한" 플래그가 활성화되어 있는지 확인해야 하는 경우 다음 구성을 사용합니다 .

   int max_bars= TerminalInfoInteger ( TERMINAL_MAXBARS );
   if (max_bars< 1 e7)
     {
       Print ( "Макс.баров в окне должно быть Unlimited!" );
       return false ;
     }
 

어떤 public 메소드가 빛나기를 원하지 않을 때(예를 들어, 객체 이름 뒤에 점을 입력할 때), 나는 이 메소드를 public operator로 만듭니다. 사실, 그러한 목발을 사용하는 것이 항상 가능한 것은 아닙니다.

 
fxsaber :

어떤 public 메소드가 빛나기를 원하지 않을 때(예를 들어, 객체 이름 뒤에 점을 입력할 때), 나는 이 메소드를 public operator로 만듭니다. 사실, 그러한 목발을 사용하는 것이 항상 가능한 것은 아닙니다.

코드의 예는 어떻습니까? 물론이죠.

 
Artyom Trishkin :

코드의 예는 어떻습니까? 물론이죠.

 struct A
{
private :  
   int Value;
  
public :
   int GetValue( void ) const
  {
     return ( this .Value);
  }
};

struct B : public A
{
private :
   // Делает доп. расчеты
   void AddCalculate( void )
  {
     Print ( __FUNCSIG__ );
  }
  
public :
   // Так "спрятали" метод доп. расчетов
   void operator ~( void )
  {
     this .AddCalculate();
  }
};

void OnStart ()
{
  A a;
  B b;
  
  b = a; // После присвоения требуется вызвать доп. расчеты.
  
  ~b;    // Провели доп. расчеты
  
  b.GetValue(); // После точки попрежнему виден только GetValue()
}
 

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

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

fxsaber , 2017.09.08 13:20

 struct A
{
private :  
   int Value;
  
public :
   int GetValue( void ) const
  {
     return ( this .Value);
  }
};

struct B : public A
{
private :
   // Делает доп. расчеты
   void AddCalculate( void )
  {
     Print ( __FUNCSIG__ );
  }
  
public :
   // Так "спрятали" метод доп. расчетов
   void operator ~( void )
  {
     this .AddCalculate();
  }
};

void OnStart ()
{
  A a;
  B b;
  
  b = a; // После присвоения требуется вызвать доп. расчеты.
  
  ~b;    // Провели доп. расчеты
  
  b.GetValue(); // После точки попрежнему виден только GetValue()
}

 class A
{
 private :
 void AddCalculate( void ) const
  {
   Print ( __FUNCSIG__ );
  }
 public :
 int GetValue( void ) const
  {
   this .AddCalculate();
   return ( 0 );
  }
 
};
똑같은거 아니야?


 
알렉세이 빅토로프 :

똑같은거 아니야?

당연히 아니지. 유사하게 Value1, Value2, ..., GetValue1(), GetValue2() 필드가 많이 있습니다. 각 GetValue에서 추가 작업을 수행합니다. 계산이 비합리적입니다. 두 번 이상 호출된 하나의 GetValue에서도 계산은 쓸모가 없습니다.

 

간단한 구조 의 배열 필드 크기를 설정하는 방법을 알 수 없었습니다. 따라서 그러한 목발을 부풀려

 // Простая структура - не имеет сложных объектов
template < typename T>
struct STRING // : public T
{
   int i;
   uchar Array[ sizeof (T) - sizeof ( int )];

   void operator =( const string Str )
  {
     StringToCharArray (Str, this .Array);    
  }
  
   template < typename T1>
   void operator =( const T1 &Str )
  {
     ArrayCopy ( this .Array, Str.Array);
  }
  
   string ToString( void ) const
  {
     return ( CharArrayToString ( this .Array));
  }

// много методов, работающих с this.Array и this.i
// ....

};

#define SET_STRING(SIZE) \
   struct STRUCT ##SIZE     \
  {                      \
     uchar Array[SIZE];   \
  };                     \
                         \
  STRING<STRUCT ##SIZE>

void OnStart ()
{  
  SET_STRING( 20 ) Str[ 1 ];   // Массив "строк", каждая длиной 20 байтов
  SET_STRING( 50 ) Str2[ 2 ]; // Массив "строк", каждая длиной 50 байтов
  
  Str[ 0 ] = "Hello World!" ;
  Str2[ 0 ] = Str[ 0 ];
  
   Print ( sizeof (Str));
   Print ( sizeof (Str2));
  
   Print (Str[ 0 ].ToString());
   Print (Str2[ 0 ].ToString());
}


간단히 말해서 매크로를 통해. MQL5에서는 아마도 다른 것이 없을 것입니다. C++에서 이게 맞나요? 템플릿 유형 템플릿 <typesize S>.

 

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

라이브러리: MT4Orders

fxsaber , 2017.09.14 08:52

SL/TP 트리거는 MQL5에 Reason 플래그가 나타나기 전에도 포럼에 게시 되었습니다. 그 논리 는 오픈 포지션 의 SL/TP/SO 레벨이 거래 서버에 의해 수락될 때 해당 시장 주문이 생성되고 실행될 때까지 MT5 오픈 주문 테이블에 있음을 분명히 보여줍니다.


따라서 MT5에서는 순수 MQL5에서도 이러한 주문의 수정/삭제가 불가능하며 MT5의 거래 로직은 열린 주문이 실제로 동결되었는지 여부를 확인해야 합니다.


 // Триггер SL/TP/SO
void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest &Request, const MqlTradeResult &Result )
{ 
   if ((Trans.type == TRADE_TRANSACTION_ORDER_ADD ) && OrderSelect (Trans.order))
  {
     const ENUM_ORDER_REASON Reason = ( ENUM_ORDER_REASON ) OrderGetInteger ( ORDER_REASON );
    
     if (Reason == ORDER_REASON_TP )
       Print ( "Position #" + ( string )Trans.position + " - triggered TP." );    
     else if (Reason == ORDER_REASON_SL )
       Print ( "Position #" + ( string )Trans.position + " - triggered SL." );    
     else if (Reason == ORDER_REASON_SO )
       Print ( "Position #" + ( string )Trans.position + " - triggered StopOut." );    
  }
}


...오픈 오더 중에 TP 오더가 4분의 1초 이상 걸린 것을 볼 수 있습니다. 수정/제거를 시도하면 오류가 발생합니다.

MT5의 이 기능을 고려하십시오.

 
fxsaber :

어떤 public 메소드가 빛나기를 원하지 않을 때(예를 들어, 객체 이름 뒤에 점을 입력할 때), 나는 이 메소드를 public operator로 만듭니다. 사실, 그러한 목발을 사용하는 것이 항상 가능한 것은 아닙니다.

예, 이것은 일반적으로 일종의 메가 목발입니다. 그런 다음 이러한 정보가 없는 연산자가 찔리는 코드를 어떻게 구문 분석할 것인가? 그들이 무엇을 하는지 명확하지 않습니다.

이것은 설계 오류로 보입니다. 클래스가 원래 외부에서 수정하도록 의도된 것이 아니라 Get 메서드만 포함하는 경우 그렇게 해야 합니다. 그리고 모든 수정은 상속받은 클래스를 통해 수행됩니다.

또한 모든 메서드가 기본 클래스에 작성되고 상속된 클래스에 Get만 표시하는 경우 보호 상속을 갖는 것이 더 편리합니다. 그리고 필요한 경우 기지로 가져옵니다. 그러나 Metaeditor는 이러한 모든 방법을 사용할 수 없는 경우에도 목록에 포함되지 않는 버그를 아직 수정하지 않았습니다.

각 GetValue에서 추가 작업을 수행합니다. 계산이 비합리적입니다. 두 번 이상 호출된 하나의 GetValue에서도 계산은 쓸모가 없습니다.

그렇다면 실제로 Recalculate() 메서드가 수행되는 것을 방지하는 것은 무엇입니까? 일의 논리가 이것에 기초한다면, 왜냐하면 클래스 자체는 재계산 시점을 결정할 수 없습니다. 이는 사용자가 클래스의 작업을 제어한다는 것을 의미합니다.