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

 
Igor Makanu :

IsInf() 및 IsNaN()이 작동 중입니다.

IsEqual() 및 IsZerro() 의심스러운, 일부 출처에서 "트릭을 위한 트릭"으로 Google 검색

IsNan()은 작동하지만 IsInf()는 작동하지 않습니다.

IsInf(DBL_MIN_DENORM) == true

비정규화 된 숫자는 언제부터 무한대가 되었습니까?

음, 엡실론과의 이러한 모든 비교는 피연산자에 비례하여 증가해야 합니다. 그리고 일반적으로 여기에는 보편적인 방법이 없으므로 Point를 엡실론으로 사용합니다(피연산자의 반올림 포함). 차이점을 DBL_EPSILON 과 비교할 필요가 없습니다(필요하지 않음).

 
Vict :

음, 엡실론과의 이러한 모든 비교는 피연산자에 비례하여 증가해야 합니다. 그리고 일반적으로 여기에는 보편적인 방법이 없으므로 Point를 엡실론으로 사용합니다(피연산자의 반올림 포함). 차이점을 DBL_EPSILON 과 비교할 필요가 없습니다(필요하지 않음).

어제 TV에서 읽은 기사를 찾았습니다. https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

예, 비교 정확도를 설정할 위치를 사용하려면 다른 예가 필요합니다.

빅트 :

IsNan()은 작동하지만 IsInf()는 작동하지 않습니다.

비정규화 된 숫자는 언제부터 무한대가 되었습니까?

MQL의 정규화는 최대 8자리인 것 같습니다. IsInf()에 NormalizeDouble()을 추가해도 결과는 여전히 좋지 않습니다.

 
Igor Makanu :

MQL의 정규화는 최대 8자리인 것 같습니다. IsInf()에 NormalizeDouble()을 추가해도 결과는 여전히 좋지 않습니다.

µl의 정규화는 전혀 아닙니다. 왜 그 함수를 그렇게 불렀는지 모르겠습니다. https://en.wikipedia.org/wiki/%D0%94%D0%B5%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D0%B8%D0 %B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0

 
CTRL+1, CTRL+2, ....를 통해 책갈피를 만들 수 있고 ALT+1, ALT+2, ...를 통해 책갈피를 전환할 수 있다는 것을 ME에서 우연히 발견했습니다.
 
// Количество успешных OrderSend.
int GetOrderSendSucceeded()
{
   MqlTradeRequest Request = { 0 };
   MqlTradeResult Result;

   return ( OrderSend (Request, Result) ? 0 : ( int )Result.request_id + 1 );
}

(런칭 이후) 터미널에서 성공적으로 전송된 동기 거래 주문 (OrderSend)의 수와 생성된 비동기 거래 주문의 수를 보여줍니다.

나는 테스터(마지막에)에서 주문을 수정한 횟수를 이해하는 데 사용합니다.

 
예를 들어 자체 On-event를 사용하여 TS 클래스를 만드는 방법을 누가 압니까?

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

onTick()이 클래스 인스턴스에서 작동하지 않습니까?

fxsaber , 2019.10.31 23:45

 class BASE
{  
private :
   static BASE* Objects[];
  
public :
  BASE()
  {
    BASE::Objects[:: ArrayResize (BASE::Objects, :: ArraySize (BASE::Objects) + 1 ) - 1 ] = & this ;
  }
  
  ~BASE()
  {
     const int Size = :: ArraySize (BASE::Objects);
    
     for ( int i = Size - 1 ; i >= 0 ; i--)
       if (BASE::Objects[i] == & this )
      {
         for ( int j = i; j < Size - 1 ; j++)
          BASE::Objects[j] = BASE::Objects[j + 1 ];
          
        :: ArrayResize (BASE::Objects, Size - 1 );
        
         break ;
      }
  } 
    
   virtual void OnTick () = 0 ;
  
   static void AllTick()
  {
     for ( int i = :: ArraySize (BASE::Objects) - 1 ; i >= 0 ; i--)
      BASE::Objects[i]. OnTick ();
  }
};

static BASE* BASE::Objects[];


class A : BASE
{
   virtual void OnTick ()
  {
     Print ( __FUNCSIG__ );
  }
};

class B : BASE
{
   virtual void OnTick ()
  {
     Print ( __FUNCSIG__ );
  }
};

A a;
B b;

void OnTick ()
{
  BASE::AllTick();
}


BASE에서 상속하면 클래스의 OnTick 메서드가 자동으로 호출됩니다.

 

X 매크로 를 사용하는 예

예를 들어:

   vector_fund<upindex_t> seg2; vector_ref<vector_fund<upindex_t>> seg2_sub;
   vector_fund<upindex_t> seg3; vector_ref<vector_fund<upindex_t>> seg3_sub;
   vector_fund<upindex_t> seg4; vector_ref<vector_fund<upindex_t>> seg4_sub;
   for ( uint i = 0 ;  i < 5114 ;  ++ i) {
      restore_image(seg2, "seg2" ); restore_subimages(seg2_sub, "seg2" );
      restore_image(seg3, "seg3" ); restore_subimages(seg3_sub, "seg3" );
      restore_image(seg4, "seg4" ); restore_subimages(seg4_sub, "seg4" );
      
       if ( true ) {} // тест №1, использует seg2 и seg2_sub
       if ( true ) {} // тест №2, использует seg3 и seg3_sub
       if ( true ) {} // тест №3, использует seg4 и seg4_sub
   }

1. 일정한 할당을 방지하기 위해 사이클 뒤에 벡터를 정의하는 것이 바람직할 것입니다.

2. 각 테스트는 끌 수 있습니다(사실 많은 테스트가 있습니다).

3. restore_image() 및 restore_subimages(), 무겁고 시간 소모적인 함수(그래프에서 그래프 객체 읽기).

4. 예를 들어 seg2를 사용하는 테스트가 없는 경우 벡터가 정의되지만 주석 처리로 인해 비어 있는 상황을 방지하기 위해 정의와 해당 restore...()를 한 작업에서 모두 제거하려고 합니다. 복원...( ), 잘못된 결과를 제공합니다.

무엇을 할까요?

 #define DEFSEG_LIST    \
   DEFSEG_HELPER(seg2) \
   DEFSEG_HELPER(seg3) \
   DEFSEG_HELPER(seg4)
   
#define DEFSEG_HELPER(SEG) vector_fund<upindex_t> SEG; vector_ref<vector_fund<upindex_t>> SEG ##_sub;
   DEFSEG_LIST;
#undef DEFSEG_HELPER
   
   for ( uint i = 0 ;  i < 5114 ;  ++ i) {
#define DEFSEG_HELPER(SEG) restore_image(SEG, #SEG); restore_subimages(SEG ##_sub, #SEG);
   DEFSEG_LIST;
#undef DEFSEG_HELPER
      ...
   }

DEFSEG_LIST에서 불필요한 segx를 주석 처리합니다. 이것은 첫 번째 코드와 동일하게 생성됩니다. 일반적으로 컴파일러가 프로세서 배기(gcc -E의 유사)를 표시할 수 없는 것은 유감입니다.

 

때로는 유전자 최적화를 통해 처음 몇 천 번의 패스만으로도 결과를 어느 정도 이해하기에 충분합니다.

많은 최적화를 자동으로 실행할 때 모든 것이 더 빨리 해결되기를 원합니다. 따라서 최적화 인터럽트 메커니즘이 필요합니다.

 #include <fxsaber\MultiTester\MTTester.mqh>   // https://www.mql5.com/ru/code/26132

// Выключает Оптимизацию ( и одиночный проход)
bool OptimizationStop( void )
{
   return (!MTTESTER::IsReady() && MTTESTER::ClickStart( false ));
}


애플리케이션.

 // Демонстрация прерывания Оптимизации.

sinput int inAmountPasses = 20 ; // Через сколько проходов закончить
input int Range = 0 ; // 0..10000

double OnTester ()
{
   int Data[];
  
   return ( FrameAdd ( NULL , 0 , 0 , Data)); // Сгенерировали TesterPass
}

void OnTesterPass ()
{
   static int Amount = 0 ;
  
   ulong Pass;
   string Name;
   long ID;
   double Value;
   int Data[];

   while ( FrameNext (Pass, Name, ID, Value, Data))
     if (++Amount > inAmountPasses)
    {
       OptimizationStop(); // Как достигли нужного количества проходов, выключили оптимизатор.
      
       break ;
    }
}
 

Null 문자가 있는 차트를 여는 방법에 대한 지침입니다.


  1. Market Watch에서 모든 차트를 삭제합니다.
  2. 수학적 모드에서 프레임 Expert Advisor(예: this one)의 최적화를 실행합니다.
  3. 최적화를 중지하고 Null 기호 차트에서 Expert Advisor 프레임을 제거합니다.
이러한 차트는 자원을 절약하는 데 유용할 수 있습니다.
 
그러한 기능에 직면했습니다.
 class A
{
   static int i;
} a; // unresolved static variable 'A::i'

static int A::i = 0 ;

A b; // Надо прописывать после static


정적 필드가 있는 클래스를 정의하는 동안 해당 개체가 즉시 생성되면 컴파일 오류가 발생 합니다.

사유: