MQL5'te OOP hakkında sorular - sayfa 39

 

Şimdi Volchansky'nin burada neden yeterli olmadığı garip değil, güçlü bir adam Insider önizlemesi veya ne kullanırsa kullansın))


3 ay önce win 10home'u site dışından indirdim, temel ayarları yapmaya bile zamanım olmadı, başlat simgesi Ayarlar açılmıyor, evet ***********

 
Koldun Zloy :

İşte bir örnek:

Örneğinizi görevim için tam olarak uygulamaya çalıştım, ancak yine aynı komisyon - Temel sınıftan yeni bir çocuk oluştururken "kayıt gerekli" bayrağıyla bitirmek istiyorum:

 //+------------------------------------------------------------------+
class CStrategy
{
private :
   int f_save_required;
protected :
   int set;
   void               SaveRequiredFlags ( const bool flag)                      { f_save_required++;  }
   int                SaveRequiredFlags ( void ) const                            { return (f_save_required); }
public :
                     CStrategy():f_save_required( 0 )                           {   Print ( __FUNCSIG__ , "save = " ,f_save_required);  }
                     CStrategy( int setting):set(setting),f_save_required( 0 )   {   Print ( __FUNCSIG__ , "save = " ,f_save_required);  }
                    ~CStrategy(){}

};
//+------------------------------------------------------------------+
class A: public CStrategy
{
public :
   void               SaveRequired ( void )                                      { SaveRequiredFlags( true );                         }
   int                getSaveRequired ( void ) const                              { return (SaveRequiredFlags());                     }
                     A( int st_setting) : CStrategy(st_setting){}
                    ~A(){}
};
//+------------------------------------------------------------------+
class B: public CStrategy
{
public :
   void               SaveRequired( void )                                       { SaveRequiredFlags( true );                         }
   int                getSaveRequired ( void ) const                              { return (SaveRequiredFlags());                     }
                     B( int st_setting) : CStrategy(st_setting){}
                    ~B(){}
};
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   A *a = new A( 1 );
   B *b = new B( 2 );
   a.SaveRequired();
   a.SaveRequired();
   a.SaveRequired();
   a.SaveRequired();
   b.SaveRequired();
   Print (a.getSaveRequired());
   Print (b.getSaveRequired());
//---
   return ( INIT_SUCCEEDED );
  }

2019.09.14 16:07:26.856 Builder_v1.00 (EURUSD,H1) CStrategy::CSstrategy (int)save = 0

2019.09.14 16:07:26.856 Builder_v1.00 (EURUSD,H1) CStrategy::CSstrategy(int)save = 0

2019.09.14 16:07:26.856 Builder_v1.00 (EURUSD,H1) 4

2019.09.14 16:07:26.856 Builder_v1.00 (EURUSD,H1) 1

şimdiye kadar hepsi işe yaradı:

1. arayüzleri bildirmemek - hiç sorun değildi

2. Çok fazla ayarlayıcı ve alıcı üretiyorum, ancak statik değişkenden kurtulamadım


Tekrar denedim ve kodu şu şekilde yeniden yazdım:

 //+------------------------------------------------------------------+
class CStrategy
{
private :
   int f_save_required;
protected :
   int set;
   void               SaveRequiredFlags ( const bool flag)                      { f_save_required++;  }
   int                SaveRequiredFlags ( void ) const                            { return (f_save_required); }
public :
virtual    void         SaveRequired ( void )                                      { SaveRequiredFlags( true );                         }
virtual    int          getSaveRequired ( void ) const                              { return (SaveRequiredFlags());                     }
                     CStrategy():f_save_required( 0 )                           {   Print ( __FUNCSIG__ , "save = " ,f_save_required);  }
                     CStrategy( int setting):set(setting),f_save_required( 0 )   {   Print ( __FUNCSIG__ , "save = " ,f_save_required);  }
                    ~CStrategy(){}

};
//+------------------------------------------------------------------+
class A: public CStrategy
{
public :
                     A( int st_setting) : CStrategy(st_setting){}
                    ~A(){}
};
//+------------------------------------------------------------------+
class B: public CStrategy
{
public :
                     B( int st_setting) : CStrategy(st_setting){}
                    ~B(){}
};
//+------------------------------------------------------------------+



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   CStrategy *a = new A( 1 );
   CStrategy *b = new B( 2 );
   
   a.SaveRequired();
   a.SaveRequired();
   a.SaveRequired();
   a.SaveRequired();
   b.SaveRequired();
   Print (a.getSaveRequired());
   Print (b.getSaveRequired());
//---
   return ( INIT_SUCCEEDED );
  }

sonuç ilk sürümde olduğu gibi bire bir tek şey kesinlikle arayüzlerden çıkmış olması

 
Almak için hedef nedir?
 
Dmitry Fedoseev :
Almak için hedef nedir?

her şey çalışıyor ama amaç bilgi edinmek))))

nasıl yaptım:

- tüm hesaplamaların saklandığı ve araç ayarlarını sakladığı bir temel sınıf vardır, ondan kendi araçlarında çalışan alt sınıfları devralırız

- Açık dosyanın tanıtıcısını tüm torunlara ileterek bir dosyaya kaydetmenin uygun olduğunu düşünüyorum, bu durumda save () yöntemi yine temel sınıftadır

- bir olayın / bayrağın ne zaman meydana geldiğini kaydetmeniz önerilir - torunlardan hangisi ve ne zaman başladığı bilinmemektedir, ancak bir düzine yapıyı yeni bir dosyaya yazmak bir şey bulmaktan daha hızlıdır

- neden bir sınıf ve bir dizi ayar yapmıyorsunuz? - sanal olarak bildirilmesi için bir veya iki yöntem gerekiyor ve bunları her araç için ekliyorum

- sorun: Bilmediğim bir Jedi OOP hilesi olduğu umuduyla statik değişkenden uzaklaşmaya çalışıyorum





Not: const değiştiricileri iyi bir şeydir, harcanan zamandan pişman değilim - faydalı, tartışanlara tekrar teşekkürler!

 

Bu sınıfın tüm nesnelerinden bir kez açılan bir dosyaya veri yazmanız gerekiyorsa, statik değişken olmadan hiçbir yol yoktur. Ve bu sorunu çözmek için en uygunsa neden ondan kurtulalım? Elbette, global bir değişken de bildirebilirsiniz.

Şimdi, her nesne bir dosya açtıysa, yazdı ve kapattı. O zaman her nesnede bir dosya adı olması yeterli olacaktır... Ama bu durumda bile statik bir değişken kullanmak daha iyidir, çünkü değişkenin değeri her zaman ve her yerde aynıdır.

Ya da anlamadım)

 
Dmitry Fedoseev :

Bu sınıfın tüm nesnelerinden bir kez açılan bir dosyaya veri yazmanız gerekiyorsa, statik değişken olmadan hiçbir yol yoktur. Ve bu sorunu çözmek için en uygunsa neden ondan kurtulalım? Elbette, global bir değişken de bildirebilirsiniz.

Şimdi, her nesne bir dosya açtıysa, onu yazdı ve kapattı. O zaman her nesnede bir dosya adı olması yeterli olacaktır... Ama bu durumda bile statik bir değişken kullanmak daha iyidir, çünkü değişkenin değeri her zaman ve her yerde aynıdır.

Ya da anlamadım)

bir kez açılan bir dosyada, ona veri yazıyoruz ve terminal kilitlenirse veri kaybetmemek için hemen kapatıyoruz, dakikada bir ila saatte bir kayıt yapıyoruz - açık bir dosyayı bu kadar uzun süre tutmak hiç mantıklı değil zaman

hadi koda girelim, şimdi şöyle:

 // это один файл, его не трогаю, тут только конструктор и 3 метода из интерфейсов, чтобы дать стратегиям тик, чтобы закрыть их и вот чтобы записать все ТС в файл

//____________________________________________________________________
void EA:: OnTick ( double &profit[])
{
       for ( int i = 0 ; i < StrategyCount; i++) profit[i] = Strategy[i].Strategy();   // запустили зоопарк стратегий и тут нам интересно дать им волю и узнать их профит, если ТС завершилась       
                                                                                   // она самостоятельно запустит "пустую стратегию", но профит будет возвращать первоначальный
       if (CStrategy::GetSaveRequired()) Save();                                     // вот тут узнаем состояние флага требуется ли запись состояния любой из ТС
}
//____________________________________________________________________
//это структура которая умеет открыть и записать файл, пример от fxsaber
struct FILE
{   const int handle;

  FILE( const string FileName, const int Flags ) : handle(:: FileOpen (FileName, Flags)) {}
 ~FILE( void ) { if ( this .handle != INVALID_HANDLE ) :: FileClose ( this .handle);   Print ( __FUNCTION__ );} 
};

//____________________________________________________________________
// метод для записи в файл состояния всех ТС, но проще записать все ТС один раз в файл, чем искать одну ТС..... в общем считаем, что скорость доступа к диску намного меньше чем работа с памятью
// используем структуру FILE - ну это просто удобно, объявили и забыли, она сама закроет файл когда уйдет из области видимости
void   EA::Save( void )
{  FILE f(DEF_PREFIX_FILE_NAME + IntegerToString (m_magic)+ ".bin" , FILE_WRITE | FILE_BIN );
   for ( int i = 0 ; i < StrategyCount; i++)
      Strategy[i].SaveSelfStatus(f.handle); 

}





// это основной файл (инклудник) в котором работаю, тут ТС 

//____________________________________________________________________
здесь опять все кратко и лаконично, но сделаю вывод в лог ошибки если возникнут при записи, сделаю именно здесь, т.к. только тут все модификации 
void CStrategy::SaveSelfStatus( const int handle)
{   FileWriteStruct (handle,m_setting);
   FileWriteStruct (handle,m_order_info);

}

 
Dmitry Fedoseev :

ya ben anlamadım

Sanırım hiçbir şey anlamadım, geçen ay “çapraz” makaleyi okudum, bu ay tekrar döndüm, ancak uygunluğu görmek için test etmem gerekiyor

Habr: Singleton (Singleton) veya statik bir sınıf?

Singleton (Одиночка) или статический класс?
Singleton (Одиночка) или статический класс?
  • habr.com
Статья будет полезна в первую очередь разработчикам, которые теряются на собеседованиях когда слышат вопрос «Назовите основные отличия синглтона от статического класса, и когда следует использовать один, а когда другой?». И безусловно будет полезна для тех разработчиков, которые при слове «паттерн» впадают в уныние или просят прекратить...
 
Igor Makanu :

- sorun: Bilmediğim bir Jedi OOP hilesi olduğu umuduyla statik değişkenden uzaklaşmaya çalışıyorum

Bu neden bir sorun? Gerekirse statik bir değişkenden uzaklaşmanıza gerek yok.

Hala kayıt ihtiyacının bayrağının neye bağlı olduğunu anlamıyorum.

Benim örneğimde, değişiklik olup olmadığı belirlenir.

Ve nasıl ihtiyacın var?

 
Koldun Zloy :

Bu neden bir sorun? Gerekirse statik bir değişkenden uzaklaşmanıza gerek yok.

o zaman sorun çözülür! - başlangıçta her şeyi yaptı

Not: Statik bir yapı ile denemeye şimdiden başladım ... Yalnızca başlatma ile ilgili sorunlar görüyorum, ardından kod okunabilirliği ile ilgili olarak flag.saveRequired, ardından flagsave.Required seçeneklerini denedim, sonra zaten = operatörünü aşırı yüklemekten acı çektim. General, tüm bunlar saçmalık. Sonuç olarak, özel bir statik değişken aracılığıyla yapıp ona bir ayarlayıcı ve bir alıcı eklerseniz, kod çok daha basit ve daha okunaklı olur, ancak dedikleri gibi: kolay yollar aramıyoruz .... en iyisi anlaşılmaz videoların yazarlarına ...

 
Fast235 :

Şimdi Volchansky'nin burada neden yeterli olmadığı garip değil, güçlü bir adam Insider önizlemesi veya ne kullanırsa kullansın))

3 ay önce win 10home'u site dışından indirdim, temel ayarları yapmaya bile zamanım olmadı, başlat simgesi Ayarlar açılmıyor, evet ***********

Sadece meşgul ve forum çok zaman alıyor.   Bir Insider önizlemesi yüklemenizi önermiyorum, şimdi Winda haftada bir yeni bir yapı kuruyor. MS web sitesinden kararlı bir yapı indirmek daha iyidir. Bir yerde daha oynamak çocukça merakım :)

Neden: