OOP, mql5'te şablonlar ve makrolar, incelikler ve kullanım teknikleri - sayfa 14

 
Artyom Trishkin :

1. Yine de, bu "bir şeyin" olduğu yerde hemen bir şey hakkında konuşmak ve moderatörün bunu nasıl yapacağını düşünmemek daha iyidir. Ve sonra her şey gerçekten iki dalda bulanıklaştı ve şimdi, moderatör tartışmanın orada veya orada olması gerektiğine karar verse bile, gönderilerin sırasını ve anlamlarını koruyarak tartışmayı aktarmak normaldir, çok zaman alıcıdır. görev.

2. Moderatörün eylemlerinin tartışılması her hapşırma değildir ... Bu, eylemlerinin genel ve kamuya açık bir yarışması başlarsa, ayrıca düzeni yeniden sağlamak veya öfkeli olanları sakinleştirmek için eylemler başlar. Ve eğer kendi fikriniz varsa, o zaman bunu ifade etmenizi kim yasaklıyor? Belki fikriniz çok mantıklı bir öneri ama moderatörün sevilmeyen menüsü altına girmemek için söylemekten çekiniyorsunuz? Yani bu saçmalık :)

Açıklama için teşekkürler. Sözde değerli bilgileri ana konuya sızdırmamak için tartışmayı ayrı bir başlıkta tutmanın en iyisi olduğunu düşündüm. Gönderileri taşımaya karar verirseniz, nereye taşınacağınızı tartışırım.

 
Ilya Malev :

Görünüşe göre henüz hangi dalda daha uygun olduğuna karar verecek bir moderatör değilsin. Ve moderatörler, özelliklerin tartışılmasının özelliklerin kendi başlığında değil, ayrı bir başlıkta, yani. burada.

Açıklamanızda, bir sınıf yöntemine referansa ve T tipinin değerine göre tek tip bir şekilde nasıl erişileceği hiç açık değil. Neden bahsettiğinizi bilmiyorum, ama ben orada bundan bahsediyordum.

Durum şu: Her şeyin forum üyelerinin o başlıkta görmeyi beklediği özelliklere göre düzenlenemeyeceğini anladım. Burada (ve orada devam ediyordu, bu yüzden buraya taşıdım) ayrı bir konuya ayırmaya karar verdiğim oldukça spesifik bir konu hakkında bir tartışma var. Çoğu için daha genel ve anlaşılır özellikler olsun ve burada - sınıflar, makrolar da dahil olmak üzere onlarla çalışmak için zor hileler (ki bu hala birçokları için bir bilmecedir).

 
Ilya Malev :

Açıklama için teşekkürler. Sözde değerli bilgileri ana konuya sızdırmamak için tartışmayı ayrı bir başlıkta tutmanın en iyisi olduğunu düşündüm. Gönderileri taşımaya karar verirseniz, nereye taşınacağınızı tartışırım.

Bırak şimdi öyle kalsın. Sadece - mümkünse - tartışılan örneği oradan gönderinize kopyalayın, bu örneğe atıfta bulunur (burada nasıl başladığını anlamak benim için zor). Peki, ya da artık gönderinizi düzenleyemiyorsanız, kişisel bir mesajda neyi nereye ekleyeceğimi söyleyin.

 
Artyom Trishkin :

Bırak şimdi öyle kalsın. Sadece - mümkünse - tartışılan örneği oradan gönderinize kopyalayın, bu örneğe atıfta bulunur (burada nasıl başladığını anlamak benim için zor). Peki, ya da artık gönderinizi düzenleyemiyorsanız, kişisel bir mesajda neyi nereye ekleyeceğimi söyleyin.

Kodu birkaç mesaj önce bu konudan buraya kopyaladım, bu yüzden IMHO ek adım gerekli değil.

 
Ilya Malev :

Kodu birkaç mesaj önce bu konudan buraya kopyaladım, bu yüzden IMHO ek adım gerekli değil.

İyi.

 

Şablonlar ve istatistikler aracılığıyla arayüzler konusunda güncelleme. Daha doğrusu, arayüzler değil, diyelim ki, harici sınıflar aracılığıyla uygulanan keyfi türler üzerinde uygun şekilde parametreli işlemler. Bu durumda karşılaştırma (Karşılaştırıcı) ve tip döküm (Caster)

Önceki eleştiriyi kısmen dikkate aldım, "arayüz" sınıfı (arayüz olmasa da) parametre sınıfından miras alınmadı (böyle bir yöntem kök salmadı ...) ve elbette dynamic_cast kullanmadan. Umarım bu model daha mantıklı görünür.

#property strict

#define tnm typename
#define ttt template <tnm T>
#define ttf template <tnm F>
#define ttr template <tnm R>
#define tft template <tnm T,tnm F>
#define up(P) ( CheckPointer (P)!= POINTER_INVALID )

enum ECMP{ EQUAL= 0 , GREATER= 1 , LESSER=- 1 , UNDEF= INT_MAX };

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

ttt class Type
 {
private :
  T item;
public :
  Type(){ ZeroMemory ( item ); }
  Type * operator = (T par){ item = par; return & this ; }
  T Get(){ return item; }
  
  ttf int operator != ( Type<F>&par )
   { 
       int r = Comparer< Type< T > *, Type< F > * >::Get().Compare( & this , &par );
      
       if ( r == UNDEF ) printf ( "Cannot compare %s to %s!" ,tnm(T),tnm(F));
       else {
         printf ( "%s (%s) to %s (%s) is %s" ,
          Caster<Type<T>*, string >::Get().Cast(& this ), tnm(T),
          Caster<Type<F>*, string >::Get().Cast(&par),  tnm(F), Caster<ECMP, string >::Get().Cast((ECMP)r)); }
       return r; 
   }
 };

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

tft class Comparer
 {
private :
   static Comparer *handle;
public :
  Comparer(){ if ( handle == NULL ) handle = & this ; }
   static Comparer *Get(){ return handle ; }
   virtual ECMP Compare( T, F ){ return UNDEF; }
 };

//---

tft Comparer *Comparer::handle= NULL ;

tft class Caster
 {
private :
   static Caster *handle;
public :
  Caster(){ if ( handle == NULL ) handle = & this ; }
   static Caster *Get(){ return handle ; }
   virtual F Cast( T ){ F r; ZeroMemory (r); return r; }
 };

//---

tft Caster *Caster::handle= NULL ;

ttt class ToStrCaster: public Caster<T, string >
 {
public :
   virtual string Cast( T ){ return "N/A" ; }
 };

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

class CmpIntToInt: public Comparer<Type< int >*,Type< int >*>
 {
public :
   virtual ECMP Compare( Type< int >* op1, Type< int >* op2 ){ return ECMP(up(op1)&&up(op2)?(op1.Get()>op2.Get())-(op1.Get()<op2.Get()):UNDEF); }
 }
citi;

class CmpDoubleToDouble: public Comparer<Type< double >*,Type< double >*>
 {
public :
   virtual ECMP Compare( Type< double >* op1, Type< double >* op2 ){ 
       return ECMP(up(op1)&&up(op2)? int (op1.Get()-op2.Get()> DBL_EPSILON )- int (op2.Get()-op1.Get()> DBL_EPSILON ):UNDEF); }
 }
cdtd;

class CmpStrToStr: public Comparer<Type< string >*,Type< string >*>
 {
public :
   virtual ECMP Compare( Type< string >* op1, Type< string >* op2 ){ 
       return ECMP(up(op1)&&up(op2)? StringCompare (op1.Get(),op2.Get()):UNDEF); }
 }
csts;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

class IntToStrCaster: public ToStrCaster<Type< int >*>
 {
public :
   virtual string Cast( Type< int >* par ){ return up(par)? IntegerToString (par.Get()): NULL ; }
 }
itsc;

class DoubleToStrCaster: public ToStrCaster<Type< double >*>
 {
public :
   virtual string Cast( Type< double >* par ){ return up(par)? DoubleToString (par.Get(), 6 ): NULL ; }
 }
dtsc;

class StringToStrCaster: public ToStrCaster<Type< string >*>
 {
public :
   virtual string Cast( Type< string >* par ){ return up(par)?par.Get(): NULL ; }
 }
stsc;

class ECMPToStrCaster: public ToStrCaster<ECMP>
 {
public :
   virtual string Cast( ECMP par ){ return EnumToString (par); }
 }
etsc;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

void OnStart ()
 {
  Type< int > t1= AccountNumber (), t2= AccountLeverage ();
  Type< double > t3= Ask , t4= Bid ;
  Type< string > t5= _Symbol ;
  
  t1!=t2;
  t4!=t3;
  t5!=t5;
  t1!=t3;
  t2!=t5;
 }


 

böyle bir kod parçası için bir makro oluşturmak ne kadar gerçekçi:

 input int    InDealType_01= 17 ;
input int    InDealType_02= 22 ;
.....
input double InVolume_01 = 0.1 ;
input double InVolume_02 = 0.3 ;
.....    
   EA.AddDealsSettings(InDealType_01,InVolType_01,InVolume_01,InPrice_01,InVolCoeff_01,InClosePips_01,Mirror);
   EA.AddDealsSettings(InDealType_02,InVolType_02,InVolume_02,InPrice_02,InVolCoeff_02,InClosePips_02,Mirror);
   EA.AddDealsSettings(InDealType_03,InVolType_03,InVolume_03,InPrice_03,InVolCoeff_03,InClosePips_03,Mirror);
   EA.AddDealsSettings(InDealType_04,InVolType_04,InVolume_04,InPrice_04,InVolCoeff_04,InClosePips_04,Mirror);
   EA.AddDealsSettings(InDealType_05,InVolType_05,InVolume_05,InPrice_05,InVolCoeff_05,InClosePips_05,Mirror);
   EA.AddDealsSettings(InDealType_06,InVolType_06,InVolume_06,InPrice_06,InVolCoeff_06,InClosePips_06,Mirror);
   EA.AddDealsSettings(InDealType_07,InVolType_07,InVolume_07,InPrice_07,InVolCoeff_07,InClosePips_07,Mirror);
   EA.AddDealsSettings(InDealType_08,InVolType_08,InVolume_08,InPrice_08,InVolCoeff_08,InClosePips_08,Mirror);
   EA.AddDealsSettings(InDealType_09,InVolType_09,InVolume_09,InPrice_09,InVolCoeff_09,InClosePips_09,Mirror);
   EA.AddDealsSettings(InDealType_10,InVolType_10,InVolume_10,InPrice_10,InVolCoeff_10,InClosePips_10,Mirror);

Girdi değişkenlerinin ( input ) sayısına henüz karar vermedim, seçili alanı düzenlemekten yoruldum , tek satırlık makro sorun değil ama 10-15 ile çarpmayı bilmiyorum çizgiler

 
Igor Makanu :

böyle bir kod parçası için bir makro oluşturmak ne kadar gerçekçi:

Girdi değişkenlerinin ( input ) sayısına henüz karar vermedim, seçili alanı düzenlemekten yoruldum , tek satırlık makro sorun değil ama 10-15 ile çarpmayı bilmiyorum çizgiler

Hemen söylüyorum - µl için kontrol etmedim, sadece kontrol etmek için C-serisi önişlemciden geçirdim, çünkü MKL'nin özellikleri var, varsa tamamlayın.

 #define ARGS HLP(InDealType_)    \
             HLP(InVolType_),    \
             HLP(InVolume_),     \
             HLP(InPrice_),      \
             HLP(InVolCoeff_),   \
             HLP(InClosePips_),  \
             Mirror
#define _CAT(L, R) L ##R
#define CAT(L, R) _CAT(L, R)
#define HLP(ARG)  CAT(ARG, INDEX)

#define INDEX 01
EA.AddDealsSettings(ARGS);
#undef INDEX
#define INDEX 02
EA.AddDealsSettings(ARGS);
#undef INDEX
#define INDEX 03
EA.AddDealsSettings(ARGS);
#undef INDEX

egzozu aldım (gcc -E):

EA.AddDealsSettings(InDealType_01 InVolType_01, InVolume_01, InPrice_01, InVolCoeff_01, InClosePips_01, Mirror);
EA.AddDealsSettings(InDealType_02 InVolType_02, InVolume_02, InPrice_02, InVolCoeff_02, InClosePips_02, Mirror);
EA.AddDealsSettings(InDealType_03 InVolType_03, InVolume_03, InPrice_03, InVolCoeff_03, InClosePips_03, Mirror);

bağımsız değişkenler listesine eklediğiniz/attığınız ek argümanlar.

 
Igor Makanu :

böyle bir kod parçası için bir makro oluşturmak ne kadar gerçekçi:

Girdi değişkenlerinin ( input ) sayısına henüz karar vermedim, seçili alanı düzenlemekten yoruldum , tek satırlık makro sorun değil ama 10-15 ile çarpmayı bilmiyorum çizgiler

 #define TEST(dId) EA.AddDealsSettings(InDealType_ ##dId,InVolType_##dId,InVolume_##dId,InPrice_##dId,InVolCoeff_##dId,InClosePips_##dId,Mirror)
#define TEST2(d1,d2) do {TEST(d1);TEST(d2);} while ( false )
#define TEST3(d1,d2,d3) do {TEST2(d1,d2);TEST(d3);} while ( false )
#define TEST4(d1,d2,d3,d4) do {TEST2(d1,d2);TEST(d3,d4);} while ( false )
....
#define TEST100(d1,...d100) do {TEST50(d1,...d50);TEST50(d51,...d100);} while ( false )

void OnStart ()
  {
....
TEST4( 01 , 02 , 03 , 04 );
......
}

Şimdiye kadar sadece anladım. Şimdi, geliştiriciler C'de olduğu gibi değişken sayıda parametreyi vidalasaydı, o zaman kısaltmak mümkün olabilirdi.

 
Vladimir Simakov :

Şimdiye kadar sadece anladım. Şimdi, geliştiriciler C'de olduğu gibi değişken sayıda parametreyi vidalasaydı, o zaman kısaltmak mümkün olabilirdi.

Fazla karmaşıklaştırdığım bir şey)).

Eh, muhtemelen ilk, en uygun olanı kullanmasına izin verin.

 #define TEST(dId)
Sonuçta birkaç kez TEST yazmak sorun değil.