MQL5'te OOP hakkında sorular - sayfa 35

 
Roman :

Nesne amacına hizmet ettiyse, neden hafızada tutuyor?
Bellek sızıntısı olacak mı?

Özellikle OnDeinit'te bile silinmezse ortaya çıkacaktır.
Gerçekten artık gerekli değilse, hafızada saklayamazsınız. Ama daha sık olarak, bir nesne bir yinelemede yaratılır ve kullanılır... Ve sonra ikincisinde... Ve böyle devam eder. Ve sonra, belirli koşullar altında, aynı sınıftan başka bir nesne oluşturulur ve zaten bu sınıfın iki veya daha fazla nesnesiyle çalışırsınız, bunların her biri danışmanın ömrü boyunca gereklidir.

 
BlackTomcat :

Özellikle OnDeinit'te bile silinmezse ortaya çıkacaktır.
Gerçekten artık gerekli değilse, hafızada saklayamazsınız. Ama daha sık olarak, bir nesne bir yinelemede yaratılır ve kullanılır... Ve sonra ikincisinde... Ve böyle devam eder. Ve sonra, belirli koşullar altında, aynı sınıftan başka bir nesne oluşturulur ve zaten bu sınıfın iki veya daha fazla nesnesiyle çalışırsınız, bunların her biri danışmanın ömrü boyunca gereklidir.

Yani, kontrollü bir bellek sızıntısının nesneleri yeniden oluşturmaktan daha iyi olduğunu mu söylemek istiyorsunuz?
Yani, kontrollü iblisler karşılığında zaman kazanmak mı?
Onları daha sonra kaybetmemek tehlikelidir.

 

uzmanın şablonuna göre yazdı https://www.mql5.com/en/forum/85652/page24#comment_13054686

oldukça esnek bir şablon, "2 tıklama" ile farklı "çörekler" eklemenize izin veriyor ve kodun okunabilir ve mantıklı olduğu ortaya çıkıyor, ancak... yine iyi bir sınıfın sahip olmaması gereken tartışılan paradigmaya geri döndü. statik yöntemler

teoride kulağa hoş geliyor, pratikte ... bence, hiçbir şey, en azından MQL görevleri için, IMHO

EA sınıfı şablona göre yazılmıştır, OnTick()'te bir genel yöntem başlatılır, ancak EA'yı başlatırken, açık sipariş olup olmadığını kontrol etmeniz ve bunları almanız gerekir, 2 yol görüyorum:

1. Aşağıdaki OnTick()'e, sihirle açık emirler bulduktan sonra, her zamanki gibi bir EA nesnesi yaratacak bir fonksiyon yazın, eğer bir sipariş bulamazsa, ana mantığa göre buna göre başlatırız - EA nesnesi yalnızca işlem saatlerinde oluşturulur ve gelecekte TS mantığını uygular

2. EA'da 1. maddeyi yapacak statik bir sınıf yazın


aslında, 1. ve 2. paragraflar aynıdır, tek farkla 1. paragrafta yalnızca Expert Advisor başlatıldığında (ilk çalıştırma) anlamlı olacak bir işlev ekleyeceğim, ancak IMHO, bu kodu karıştırıyor - bir işlev ve tüm yürütme programları için bir kez çağrılacaktır!

statik bir yöntem (madde 2) yaparsanız, IMHO her şey mantıklı ve okunabilir olacaktır, yöntem yalnızca başlatma için gereklidir ve yalnızca bir EA nesnesi oluşturmanız gereken anı belirler - yalnızca sihirli sayıyı iletmeniz gerekir bu yöntem, kısaca


bence, uygun olduğunda statik yöntemler kullanmayı kendinize yasaklayın ... eh, hafifçe söylemek gerekirse, bu doğru değil!

 
Igor Makanu :

Statik yöntemler , işlevlerden yalnızca kapsam bakımından farklıdır.


Bu uygulama tehlikeli

 input int inInput = 0 ;

const bool Init = EventSetTimer ( 1 );

void OnTimer ()
{
   static int Input = inInput;
  
   Print (Input);
}


EA çalışırken girişi değiştirirseniz, Giriş değişmez.

Buna göre, dolu

 input long inMagic = 0 ;

void OnTick ()
{
   static ORDER Orders[]; // Список ордеров по мэджику или что-то подобное, зависящая от входных.
}
 
fxsaber :

EA çalışırken girişi değiştirirseniz, Giriş değişmez.

Evet, bunun farkındayım ve TS'me göre, EA çalışırken giriş parametrelerini değiştirmek imkansız, çalışma süresi TS mantığından ayrı olarak hesaplanıyor

Burada sorum tamamen teorik, kodu karıştırmak istemiyorum, bu yüzden bir çarpışmadan sonra aracı geri yükleme, bir yere yapıştırma olasılığını arıyorum, bu arada şöyle görüyorum:

 input int EAMagicNumber = 12345 ;
class CEA
{
public :
   static bool        NeedRecovery( int magic_)            {   return ( true );    }
   bool               Recovery( int magic_, int inputparam) {   return ( true );    }
                     CEA()                               {                    }
                     CEA( int inputparam)                 {                    }
                    ~CEA()                               {                    }
};

CEA *ea;

void OnStart ()
{
   if ( CheckPointer (ea)== POINTER_INVALID )
   {
       if (CEA::NeedRecovery(EAMagicNumber))   //если нашли открытые ордера с магиком
      {
         ea = new CEA();         // создали объект
         ea.Recovery(EAMagicNumber, 11111 );   // запустили восстановление ТС
      } else ea = new CEA( 2222222 );           //обычный запуск
   }
 
Igor Makanu

Bu mantığı kurucuya sokmak daha mantıklı.

 
fxsaber :

Statik yöntemler , işlevlerden yalnızca kapsam bakımından farklıdır.

yanlış. ayrıca sınıfın genel olmayan üyelerine ve yöntemlerine erişim.
 
TheXpert :
yanlış. ayrıca sınıfın genel olmayan üyelerine ve yöntemlerine erişim.

Burada terminolojik bir yanlış anlama var. "Kapsam" sadece yöntemi kimin gördüğüyle ilgili değildir. Ama ne görüyor?

 
fxsaber :

Burada terminolojik bir yanlış anlama var.

sonuçta kapsam ve erişim farklı kavramlardır ve bunları karıştırmamak daha iyidir
 
fxsaber :

Bu mantığı kurucuya sokmak daha mantıklı.

Evet, bu daha iyi bir çözüm! bir yöntemin daha az olması

sonra şöyle:

 input int EAMagicNumber = 12345 ;
class CEA
{
public :
   static bool        NeedRecovery( int magic_)            {   return ( true );    }   //тут проверки
                     CEA( int magic_)                     {                    }   //это обычный запуск если все ОК
                     CEA( int magic_, int recoveryparam)  {                    }   //тут аварийное восстановление
                    ~CEA()                               {                    } };

CEA *ea;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
{   if ( CheckPointer (ea)== POINTER_INVALID )
   {   if (CEA::NeedRecovery(EAMagicNumber))   //если нашли откртые ордера с магиком
      {  
         ea = new CEA(EAMagicNumber, 11111 );   // запустили востановление ТС
      }
       else ea = new CEA(EAMagicNumber);       //обычный запуск
   } 
}
TheXpert :
sonuçta kapsam ve erişim farklı kavramlardır ve bunları karıştırmamak daha iyidir
bu yüzden bir sorum vardı, son başlatmanın anormal bir şekilde tamamlandığını tespit etmek için bir yöntemi nereye yapıştıracağım, şimdi kod yapımım kompakt, yukarıda gösterilen şablona göre her şey açık