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

 

Kalıtsal yapıların özellikleri

 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;
}
 

Pencerede Ayarlar --> Grafikler --> Maksimum çubuklar'da "Sınırsız" bayrağının etkinleştirilip etkinleştirilmediğini öğrenmeniz gerekirse, aşağıdaki yapıyı kullanıyorum :

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

Bazı genel yöntemlerin parlamasını istemediğimde (örneğin bir nesnenin adından sonra bir nokta yazarken), bu yöntemi genel operatör olarak yapıyorum. Doğru, böyle bir koltuk değneği kullanmak her zaman mümkün değildir.

 
fxsaber :

Bazı genel yöntemlerin parlamasını istemediğimde (örneğin bir nesnenin adından sonra bir nokta yazarken), bu yöntemi genel operatör olarak yapıyorum. Doğru, böyle bir koltuk değneği kullanmak her zaman mümkün değildir.

Koddaki bir örneğe ne dersiniz? Rica ederim.

 
Artyom Trishkin :

Koddaki bir örneğe ne dersiniz? Rica ederim.

 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()
}
 

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

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

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()
}

Ve bu

 class A
{
 private :
 void AddCalculate( void ) const
  {
   Print ( __FUNCSIG__ );
  }
 public :
 int GetValue( void ) const
  {
   this .AddCalculate();
   return ( 0 );
  }
 
};
aynı şey değil mi


 
Alexey Viktorov :

Ve bu

aynı şey değil mi

Tabii ki değil. Değer1, Değer2, ..., GetValue1(), GetValue2() - benzer şekilde birçok alan vardır. Her GetValue'da ek yapın. hesaplamalar mantıksız. Birden fazla kez çağrılan bir GetValue'da bile hesaplamalar işe yaramaz.

 

Basit bir yapının dizi alanının boyutunu nasıl ayarlayacağımı çözemedim. Bu nedenle, şişirilmiş böyle bir koltuk değneği

 // Простая структура - не имеет сложных объектов
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());
}


Kısacası makrolar aracılığıyla. MQL5'te muhtemelen başka bir şey yok. C++'da bu doğru mu? Şablon türü şablonu <typesize S>.

 

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

Kitaplıklar: MT4Orders

fxsaber , 2017.09.14 08:52

MQL5'te Neden işaretleri görünmeden önce bile, SL/TP tetikleyicisi forumda yayınlandı . Mantığı, bir açık pozisyonun SL/TP/SO seviyeleri alım satım sunucusu tarafından kabul edildiğinde, yürütülene kadar MT5 açık emir tablosunda bulunan ilgili piyasa emrinin üretildiğini açıkça gösterdi.


Bu nedenle, MT5'te, saf MQL5'te bile, bu tür emirlerin değiştirilmesi/silinmesi imkansızdır ve MT5'teki işlem mantığı, açık bir emrin gerçekten donmuş olup olmadığını kontrol etmeyi gerektirir.


 // Триггер 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 emrinin çeyrek saniyeden fazla açık emirler arasında asılı kaldığı görülüyor. Herhangi bir değiştirme/kaldırma girişimi hatalara neden olur.

MT5'in bu özelliğini düşünün.

 
fxsaber :

Bazı genel yöntemlerin parlamasını istemediğimde (örneğin bir nesnenin adından sonra bir nokta yazarken), bu yöntemi genel operatör olarak yapıyorum. Doğru, böyle bir koltuk değneği kullanmak her zaman mümkün değildir.

Evet, bu genellikle bir tür mega koltuk değneğidir. O zaman bu tür bilgi vermeyen operatörlerin dürtüldüğü kodunuzu nasıl ayrıştıracaksınız, ne yaptıkları belli değil.

Bu bir tasarım hatası gibi görünüyor. Sınıf başlangıçta dışarıdan değiştirilmek üzere tasarlanmadıysa, ancak yalnızca Get yöntemlerini içeriyorsa, öyle olmalıdır. Ve tüm değişiklikler ondan miras alınan sınıflar aracılığıyla gerçekleştirilir.

Ayrıca, tüm yöntemler temel sınıfta yazıldığında ve yalnızca devralınan sınıfta Get'i gösterdiğinizde, korumalı kalıtımın olması daha uygun olacaktır. Ve gerektiğinde üsse getirirsiniz. Ancak Metaeditor, mevcut olmasa bile tüm bu yöntemlerin listede yer alması hatasını henüz düzeltmedi.

Her GetValue'da ek yapın. hesaplamalar mantıksız. Birden fazla kez çağrılan bir GetValue'da bile hesaplamalar işe yaramaz

Peki Recalculate() yönteminin yapılmasını gerçekten engelleyen nedir? İşin mantığı bunun üzerine kuruluysa, çünkü sınıfın kendisi ne zaman yeniden hesaplanacağını belirleyemez, bu da kullanıcının sınıfın çalışmasını kontrol ettiği anlamına gelir.