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

 
Vladimir Simakov :

Bir nesneye işaretçi.

Alınma ama bu tür makrolarla senin için çok erken, boğulacaksın. İlk önce, bunu neden yaptığımı anlayın:

Ve bu işaretçiyle, sınıfın içindeki bir nesnenin nereye aktarılacağı ile ne yapmalı.

Makrolara gelince, onlarla çalışmak çok daha kolay.

 
Seric29 :

Ve bu işaretçiyle, sınıfın içindeki bir nesnenin nereye aktarılacağı ile ne yapmalı.

Makrolara gelince, onlarla çalışmak çok daha kolay.

Üzerinde herhangi bir yerde oluşturulan nesneye hitap edersiniz. Örneğimde, global düzeyde oluşturulan bir nesneye yönelik bir işaretçi yapıcıya iletilir, ancak bu sınıfın kendisi başka bir sınıfa (nesnenin oluşturulduğu) yuvalanabilir.

İşte makronuzu kullanmanın bir örneği:

 #define foor1(a,b,v,g) \
for (;Funkziya(a,b,v)&&g;b++)

...

foor(a,b,c,isSomething?a>b:b>c){
    DoSomething();
}
...

Neyin ortaya çıkacağına bakın, netlik için parantez ekliyorum:

 for (; ( Funkziya(a,b,c)&&isSomething ) ?a>b:b>c;b++){
    DoSomething();
}

Sonuç olarak, derleyici için kesinlikle geçerli bir kod elde ettiniz, ancak programın davranışı amaçlanandan kategorik olarak farklı. Ve şimdi bir hata fark edeceğiniz bir gerçek değil, kod çalışıyor ve sonra aptalca terminale bakıp merak edeceksiniz: robot neden tüm depozito ile girdi ve hesabı birleştirdi?)))))

Makrolarda çok iyiyim ama bu yüzden makroları pek sevmiyorum (geliştiriciler, bir kez daha constexpr ve aynı zamanda SFINAE'ye soruyorum). Bu yüzden size tavsiyem, kodunuzdaki harfleri azaltmak için bunları kullanmayın. Bu, aslında, kısaltılmış bir mql versiyonunda bile güçlü bir araçtır, ancak çok disiplinli bir yaklaşım gerektirir.

 

Geliştiriciler, makrolar ve işlevler içinde sınırsız sayıda bağımsız değişken kullanma yeteneği ekler. Bu statik saçmalıktan bıktınız. Bir makro için 8 argüman nedir ve 108'e ihtiyacınız varsa o zaman en az 10 yapın. Ayrıca makrolarla yeni adlar üretmek zorunda kalmamak için makroları aşırı yüklemeyi mümkün kılın. Ayrıca organize ederlerse çok iyi olur.

 #define Znah 0
#define PrmI int     Peremen= 6 ;
#define PrmD double Peremen= 3.345 ;

#if Znah //если больше 0 то появится переменная int Peremen
   PrmI
#else
   PrmD //иначе появится переменная double Peremen
#endif

#if makrosu

 
Vladimir Simakov :

ancak programın davranışı, amaçlanandan kategorik olarak farklıdır. Ve şimdi bir hata fark edeceğiniz bir gerçek değil, kod çalışıyor ve sonra aptalca terminale bakıp merak edeceksiniz: robot neden tüm depozito ile girdi ve hesabı birleştirdi?)))))

Makrolarda çok iyiyim ama bu yüzden makroları pek sevmiyorum (geliştiriciler, bir kez daha constexpr ve aynı zamanda SFINAE'ye soruyorum). Bu yüzden size tavsiyem, kodunuzdaki harfleri azaltmak için bunları kullanmayın. Bu, aslında, kısaltılmış bir mql versiyonunda bile güçlü bir araçtır, ancak çok disiplinli bir yaklaşım gerektirir.

Hiçbir şey tahmin etmeyeceğim, işimi güvenilir bir şekilde yaparım.

CDataManager*  m_data;

m_data işaretçisiyle ne yapıyorsunuz? m_data öğesine erişiyor musunuz? Ve sana ne veriyor? Bunun burada olduğunu anlıyorum.

   CNewBar(CDataManager* data= NULL ):m_data(!data? new CDataManager:data),cIsDelData(!data){}
   CNewBar( string symbol, ENUM_TIMEFRAMES frame):m_data( new CDataManager(symbol,frame)),cIsDelData( true ){}

Sadece net değil (çok zor) neyi başarmaya çalışıyorsunuz?

Bu hat olsaydı ne olurdu

CDataManager*  m_data;

halka yazılacak

Sınıflar benim için karanlık bir orman. 2 yıl boyunca hala onlarla nasıl başa çıkacağımı anlamadım.

 

bir veritabanı tablosuna test sonuçlarının istatistiklerini yazmaya ihtiyaç vardır,

Veritabanı önceden oluşturuldu, ilgilenilen geçişleri EA ayarlarında sinput değişkenini açarak yazıyorum

DB:

CREATE TABLE " TesterStatistics " (
        "id"    INTEGER,
        "MD5"   TEXT,
        " STAT_PROFIT "   REAL,
        " STAT_GROSS_PROFIT "     REAL,
        " STAT_GROSS_LOSS "       REAL,
        " STAT_MAX_PROFITTRADE "  REAL,
        " STAT_MAX_LOSSTRADE "    REAL,
        " STAT_CONPROFITMAX "     REAL,
        " STAT_CONPROFITMAX_TRADES "      INTEGER,
        " STAT_MAX_CONWINS "      REAL,
        " STAT_MAX_CONPROFIT_TRADES "     INTEGER,
        " STAT_CONLOSSMAX "       REAL,
        " STAT_CONLOSSMAX_TRADES "        INTEGER,
        " STAT_MAX_CONLOSSES "    REAL,
        " STAT_MAX_CONLOSS_TRADES "       INTEGER,
        " STAT_BALANCEMIN "       REAL,
        " STAT_BALANCE_DD "       REAL,
        " STAT_BALANCEDD_PERCENT "        REAL,
        " STAT_BALANCE_DDREL_PERCENT "    REAL,
        " STAT_BALANCE_DD_RELATIVE "      REAL,
        " STAT_EQUITYMIN "        REAL,
        " STAT_EQUITY_DD "        REAL,
        " STAT_EQUITYDD_PERCENT " REAL,
        " STAT_EQUITY_DDREL_PERCENT "     REAL,
        " STAT_EQUITY_DD_RELATIVE "       REAL,
        " STAT_EXPECTED_PAYOFF "  REAL,
        " STAT_PROFIT_FACTOR "    REAL,
        " STAT_RECOVERY_FACTOR "  REAL,
        " STAT_SHARPE_RATIO "     REAL,
        " STAT_MIN_MARGINLEVEL "  REAL,
        " STAT_CUSTOM_ONTESTER "  REAL,
        " STAT_DEALS "    INTEGER,
        " STAT_TRADES "   INTEGER,
        " STAT_PROFIT_TRADES "    INTEGER,
        " STAT_LOSS_TRADES "      INTEGER,
        " STAT_SHORT_TRADES "     INTEGER,
        " STAT_LONG_TRADES "      INTEGER,
        " STAT_PROFIT_SHORTTRADES "       INTEGER,
        " STAT_PROFIT_LONGTRADES "        INTEGER,
        " STAT_PROFITTRADES_AVGCON "      INTEGER,
        " STAT_LOSSTRADES_AVGCON "        INTEGER,
        PRIMARY KEY("id" AUTOINCREMENT)
)

Bu tabloya aşağıdaki kodla yazıyorum:

 DatabaseExecute (handleDB, StringFormat ("INSERT INTO \" TesterStatistics \" "
                                             "VALUES ( NULL , \'%s\',%G, %G, %G, %G, %G, %G, %d, %G, %d, %G, %d, %G, %d, "
                                             "%G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d);",
                                             md5txt, TesterStatistics ( STAT_PROFIT ),             TesterStatistics ( STAT_GROSS_PROFIT ),
                                             TesterStatistics ( STAT_GROSS_LOSS ),                 TesterStatistics ( STAT_MAX_PROFITTRADE ),
                                             TesterStatistics ( STAT_MAX_LOSSTRADE ),               TesterStatistics ( STAT_CONPROFITMAX ),
                                             ( int ) TesterStatistics ( STAT_CONPROFITMAX_TRADES ),   TesterStatistics ( STAT_MAX_CONWINS ),
                                             ( int ) TesterStatistics ( STAT_MAX_CONPROFIT_TRADES ),   TesterStatistics ( STAT_CONLOSSMAX ),
                                             ( int ) TesterStatistics ( STAT_CONLOSSMAX_TRADES ),     TesterStatistics ( STAT_MAX_CONLOSSES ),
                                             ( int ) TesterStatistics ( STAT_MAX_CONLOSS_TRADES ),     TesterStatistics ( STAT_BALANCEMIN ),
                                             TesterStatistics ( STAT_BALANCE_DD ),                 TesterStatistics ( STAT_BALANCEDD_PERCENT ),
                                             TesterStatistics ( STAT_BALANCE_DDREL_PERCENT ),       TesterStatistics ( STAT_BALANCE_DD_RELATIVE ),
                                             TesterStatistics ( STAT_EQUITYMIN ),                   TesterStatistics ( STAT_EQUITY_DD ),
                                             TesterStatistics ( STAT_EQUITYDD_PERCENT ),           TesterStatistics ( STAT_EQUITY_DDREL_PERCENT ),
                                             TesterStatistics ( STAT_EQUITY_DD_RELATIVE ),         TesterStatistics ( STAT_EXPECTED_PAYOFF ),
                                             TesterStatistics ( STAT_PROFIT_FACTOR ),               TesterStatistics ( STAT_RECOVERY_FACTOR ),
                                             TesterStatistics ( STAT_SHARPE_RATIO ),               TesterStatistics ( STAT_MIN_MARGINLEVEL ),
                                             TesterStatistics ( STAT_CUSTOM_ONTESTER ),            ( int ) TesterStatistics ( STAT_DEALS ),
                                             ( int ) TesterStatistics ( STAT_TRADES ),                ( int ) TesterStatistics ( STAT_PROFIT_TRADES ),
                                             ( int ) TesterStatistics ( STAT_LOSS_TRADES ),           ( int ) TesterStatistics ( STAT_SHORT_TRADES ),
                                             ( int ) TesterStatistics ( STAT_LONG_TRADES ),           ( int ) TesterStatistics ( STAT_PROFIT_SHORTTRADES ),
                                             ( int ) TesterStatistics ( STAT_PROFIT_LONGTRADES ),     ( int ) TesterStatistics ( STAT_PROFITTRADES_AVGCON ),
                                             ( int ) TesterStatistics ( STAT_LOSSTRADES_AVGCON )));


ENUM_STATISTICS numaralandırması yardımdaki gibi sıraya sahiptir, komut dosyası kontrol edilecek:

 void OnStart ()
{
   for ( int i = 0 ; i <= ( int ) STAT_LOSSTRADES_AVGCON ; i++)
       printf ( "%d ^ %s" , i, EnumToString (( ENUM_STATISTICS )i));
}


her şey çalışıyor, AMA kodun metni oldukça hacimli, yüksek bir yazım hatası olasılığı var, bu sorguyu veritabanına daha güvenilir bir şekilde nasıl alabilirim - asıl sorun StringFormat'a nasıl girileceğidir

 
Igor Makanu :

bir veritabanı tablosuna test sonuçlarının istatistiklerini yazmaya ihtiyaç vardır,

Veritabanı önceden oluşturuldu, ilgilenilen geçişleri EA ayarlarında sinput değişkenini açarak yazıyorum

DB:

Bu tabloya aşağıdaki kodla yazıyorum:


ENUM_STATISTICS numaralandırması yardımdaki gibi sıraya sahiptir, komut dosyası kontrol edilecek:


her şey çalışıyor, AMA kodun metni oldukça hacimli, yüksek bir yazım hatası olasılığı var, bu sorguyu veritabanına daha güvenilir bir şekilde nasıl alabilirim - asıl sorun StringFormat'a nasıl girileceğidir

Tanımlamak için!!! (burada olağan aşırı yük gidecek olsa da)

Ve neden bu dize biçimine ihtiyacımız var?

Asla normal bir eklemeden daha hızlı değildir.... (Onlarca konser için metin dosyaları yaptım =)....


Bunu doğrudan bu normal işlev aracılığıyla yapmak önemliyse, sorun da net değil))

 
Alexandr Andreev :

Ve neden bu dize biçimine ihtiyacımız var?

Asla normal bir eklemeden daha hızlı değildir.... (Onlarca konser için metin dosyaları yaptım =)....

bilmiyorum

Yardımı ve makaleyi okuyun, örnekler kullanarak veritabanına bir sorgu oluşturun

her şey çalışıyor gibi görünüyor, ancak bu kodu kısmen kullanırsam yazım hataları yapabileceğimden şüpheleniyorum

genel olarak, bu tasarım aptal görünüyor, bu yüzden onu nasıl daha kompakt hale getireceğimi ve onu mahvetmeyeceğimi soruyorum)))

 
Igor Makanu :

bir veritabanı tablosuna test sonuçlarının istatistiklerini yazmaya ihtiyaç vardır,

Veritabanı önceden oluşturuldu, ilgilenilen geçişleri EA ayarlarında sinput değişkenini açarak yazıyorum

DB:

Bu tabloya aşağıdaki kodla yazıyorum:


ENUM_STATISTICS numaralandırması yardımdaki gibi sıraya sahiptir, komut dosyası kontrol edilecek:


her şey çalışıyor, AMA kodun metni oldukça hacimli, yüksek bir yazım hatası olasılığı var, bu sorguyu veritabanına daha güvenilir bir şekilde nasıl alabilirim - asıl sorun StringFormat'a nasıl girileceğidir

Unutmayın, öncelikle SQLite'de alan türleri isteğe bağlıdır ve yazım ve işaretleme konusunda endişelenmenize gerek yoktur. O sadece "Lite" değil

uzun bir sorgu 3-4-5'e bölünebilir :-)

BEGIN TRANSACTION

INSERT INTO myTable VALUES (...); --- тут можно получить PrimaryKey

UPDATE myTable .... ; --- обновить по Primary

UPDATE myTable ...  ; --- ещё...

COMMIT ; --- это если все запросы удачны.. иначе ROLLBACK

bu eski hafızadan, yani sertifikada açıklığa kavuşturmak gerekiyor

 
Igor Makanu :

bilmiyorum

Yardımı ve makaleyi okuyun, örnekler kullanarak veritabanına bir sorgu oluşturun

her şey çalışıyor gibi görünüyor, ancak bu kodu kısmen kullanırsam yazım hataları yapabileceğimden şüpheleniyorum

genel olarak, bu tasarım aptal görünüyor, bu yüzden onu nasıl daha kompakt hale getireceğimi ve onu mahvetmeyeceğimi soruyorum)))

Spesifik olarak, göreviniz şöyle bir şey olmalıdır:

 string MakeRequest( string md5txt){
   static ENUM_STATISTICS intIndex[]={ STAT_CONPROFITMAX_TRADES ,
                                       STAT_MAX_CONPROFIT_TRADES ,
                                       STAT_CONLOSSMAX_TRADES ,
                                       STAT_MAX_CONLOSS_TRADES ,
                                       STAT_DEALS ,
                                       STAT_TRADES ,
                                       STAT_PROFIT_TRADES ,
                                       STAT_LOSS_TRADES ,
                                       STAT_SHORT_TRADES ,
                                       STAT_LONG_TRADES ,
                                       STAT_PROFIT_SHORTTRADES ,
                                       STAT_PROFIT_LONGTRADES ,
                                       STAT_PROFITTRADES_AVGCON ,
                                       STAT_LOSSTRADES_AVGCON };
   string ret="INSERT INTO \" TesterStatistics \" VALUES ( NULL ,"+md5txt;
   for ( int i= 0 ,ii= 0 ;i<= STAT_LOSSTRADES_AVGCON ;++i){
      ret+=",";
       if (i==intIndex[ii]){
         ret+= StringFormat ("%d",( int ) TesterStatistics (( ENUM_STATISTICS )i));
         ++ii;}
       else ret+= StringFormat ("%G", TesterStatistics (( ENUM_STATISTICS )i));}
   return ret;}
   
DatabaseExecute (handleDB, MakeRequest("md5txt"));
 
Vladimir Simakov :

Spesifik olarak, göreviniz şöyle bir şey olmalıdır:

Gözleme!

kesinlikle! diziler!

TEŞEKKÜR EDERİM!!!!!