Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 147

 
Igor Makanu :

IsInf() ve IsNaN() çalışıyor,

IsEqual() ve IsZerro() şüpheli, bazı kaynaklardan "çift için hile" olarak googled

IsNan() çalışıyor ama IsInf() çalışmıyor

IsInf(DBL_MIN_DENORM) == true

Denormalize sayılar ne zamandan beri sonsuz oldu?

Eh, epsilon - epsilon ile yapılan tüm bu karşılaştırmalar, işlenenlerle orantılı olarak artırılmalıdır. Ve genel olarak, burada evrensel bir tarif yok, bu yüzden Point'i epsilon olarak kullanıyorum (işlenenlerin yuvarlanmasıyla), farkı DBL_EPSILON ile karşılaştırma arzusu yok (ve gerekli değil).

 
Vict :

Eh, epsilon - epsilon ile yapılan tüm bu karşılaştırmalar, işlenenlerle orantılı olarak artırılmalıdır. Ve genel olarak, burada evrensel bir tarif yok, bu yüzden Point'i epsilon olarak kullanıyorum (işlenenlerin yuvarlanmasıyla), farkı DBL_EPSILON ile karşılaştırma arzusu yok (ve gerekli değil).

dün TV'den okuduğum bir makale buldum https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

evet, karşılaştırma doğruluğunu nerede ayarlayacağınızı kullanmak için başka bir örneğe ihtiyacınız var

kurban :

IsNan() çalışıyor ama IsInf() çalışmıyor

Denormalize sayılar ne zamandan beri sonsuz oldu?

MQL'deki normalizasyon 8. basamağa kadar görünüyor, yani. IsInf() öğesine NormalizeDouble() eklenirse, sonuç yine de daha iyi olmaz

 
Igor Makanu :

MQL'deki normalizasyon 8. basamağa kadar görünüyor, yani. IsInf() öğesine NormalizeDouble() eklenirse, sonuç yine de daha iyi olmaz

µl'de normalizasyon hiç değil, fonksiyonun neden böyle adlandırıldığını bilmiyorum. 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

 
ME'de yanlışlıkla CTRL+1, CTRL+2, ... ile yer imleri oluşturabileceğinizi ve bunlar arasında ALT+1, ALT+2, ... ile geçiş yapabileceğinizi keşfettim.
 
// Количество успешных OrderSend.
int GetOrderSendSucceeded()
{
   MqlTradeRequest Request = { 0 };
   MqlTradeResult Result;

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

Terminalde (lansmandan bu yana) kaç başarılı senkronize ticaret emrinin (OrderSend) gönderildiğini ve kaç tane asenkron siparişin oluşturulduğunu gösterir.

Siparişleri kaç kez değiştirdiğimi anlamak için Test Cihazında (sonda) kullanıyorum.

 
Örneğin, kendi On-olaylarıyla TS sınıflarının nasıl oluşturulacağını kim bilebilir?

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

onTick() sınıf örneği üzerinde çalışmıyor mu?

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'den devral, sonra sınıflardaki OnTick yöntemleri otomatik olarak çağrılır.

 

X Makro kullanımına bir örnek (çalışma kodundan yırtılmış anlaşılmaz türler için beni suçlamayın. Vektör dinamik bir dizidir ):

Örneğin:

   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. Sabit tahsislerin önlenmesi için bir döngünün arkasındaki vektörlerin tanımlanması arzu edilir.

2. Testlerin her biri kapatılabilir (aslında birçoğu vardır).

3. restore_image() ve restore_subimages(), ağır ve çok zaman alan bir işlevdir (bir grafikten grafik nesnelerini okuma).

4. Örneğin, testlerin hiçbiri seg2 kullanmıyorsa, vektör tanımlandığında, ancak yorum nedeniyle boş olduğunda durumu önlemek için tek bir eylemde hem tanımı hem de karşılık gelen restore...() öğesini kaldırmak istiyorsunuz. restore...( ), bu hatalı sonuçlar verecektir.

Ne yapalım?

 #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'te sadece gereksiz segx'i yorumladık. Bu, ilk koddakiyle aynı şeyi üretecektir. Genel olarak, derleyicinin işlemci çıktısını gösterememesi üzücü (gcc -E'nin analogu).

 

Bazen, genetik optimizasyonla, sonucu az çok anlamak için ilk birkaç bin geçiş yeterlidir.

Otomatik olarak çok sayıda optimizasyon çalıştırdığınızda, her şeyin daha hızlı sonuçlanmasını istersiniz. Bu nedenle, bir optimizasyon kesme mekanizması gereklidir.

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

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


Başvuru.

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

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 karakterli bir grafik açma talimatları.


  1. Piyasa İzleme'den tüm çizelgeleri silin.
  2. Bir çerçeve Uzman Danışmanının Optimizasyonunu (örneğin, bu ) matematiksel modda çalıştırın.
  3. Optimizasyonu durdurun ve Uzman Danışman çerçevesini Boş sembol tablosundan kaldırın.
Böyle bir çizelge, kaynakları korumak için faydalı olabilir.
 
Böyle bir özellik ile karşı karşıya.
 class A
{
   static int i;
} a; // unresolved static variable 'A::i'

static int A::i = 0 ;

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


Statik alanlara sahip bir sınıfın tanımı sırasında nesnesi hemen oluşturulursa, bir derleme hatası olacaktır.

Neden: