MQL5'te OOP hakkında sorular - sayfa 78

 

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

MQL5'te OOP hakkında sorular

Vladimir Simakov , 2020.06.10 19:06

 #define LOG(dText) CLog::Ptr().Log(( string ) __LINE__ , __FUNCSIG__ ,dText)

class CLog{
   int cHndl;
   CLog():cHndl( FileOpen ( MQLInfoString ( MQL_PROGRAM_NAME )+ _Symbol +( string )( int ) TimeCurrent ()+ ".log" , FILE_TXT | FILE_WRITE )){}
  ~CLog() { FileClose (cHndl);}
public :
   static CLog* Ptr() { static CLog _log; return &_log;}
   void Log( string line, string sig, string text){
       string _text= StringFormat ( "Line: %s. Signature: %s. %s" ,line,sig,text);
       PrintFormat (_text);
       FileWrite (cHndl,_text);}
};


Seçili olanın yerine, nesneye doğrudan erişilmemesi için aşağıdakini yapın?

 #define LOG(dText) CLog::_log.Log(( string ) __LINE__ , __FUNCSIG__ ,dText)

class CLog{
   int cHndl;
   CLog():cHndl( FileOpen ( MQLInfoString ( MQL_PROGRAM_NAME )+ _Symbol +( string )( int ) TimeCurrent ()+ ".log" , FILE_TXT | FILE_WRITE )){}
  ~CLog() { FileClose (cHndl);}
public :
   static CLog _log;  
   void Log( string line, string sig, string text){
       string _text= StringFormat ( "Line: %s. Signature: %s. %s" ,line,sig,text);
       PrintFormat (_text);
       FileWrite (cHndl,_text);}
};

static CLog CLog::_log;


Bu tasarım çok uygun değil çünkü. yaygın olarak uygulanamaz.

 int f() { return ( 1 ); }

if (LOG(LOG(f()) - 1 ) || LOG(LOG(f()) + 1 ))
  LOG(f());


Benzer şekilde gerekli aramaların profilini çıkarıyorum.

 
Vladimir Simakov :

Aferin! Doğru şekilde! Ama bu?

Zaten daha zor olduğunu kabul edin)))

Kullanıcı dosyayı bilinmeyen bir düzenleyicide açar ve yeni bir test başlatırsa ne olur? Kodda bir hata arayacak, düzeltecek, loga bakacak ama log değişmiyor...

Peki ya büyük bir sorun varsa ve terminalin acil olarak kapatılması durumunda? Günlüklerdeki en ilginç şey kaydedilmeyecek.

 
Dmitry Fedoseev :

Kullanıcı dosyayı bilinmeyen bir düzenleyicide açar ve yeni bir test başlatırsa ne olur? Kodda bir hata arayacak, düzeltecek, loga bakacak ama log değişmiyor...

Peki ya büyük bir sorun varsa ve terminalin acil olarak kapatılması durumunda? Günlüklerdeki en ilginç ve kaydedilmeyecek.

Ve FileFlush yapmanızı kim engelliyor? Bu bir örnek için bir prototip, o zaman herkes kendi mutluluğunun demircisidir ve tamamlanmış çözümler için genellikle para isterler)))) Yani herhangi bir şeyde açın))) Bu uygulamada, her lansmanın kendi dosyası vardır) ))

UPD: OOP'nin hayatı kolaylaştırdığı bir örnek gösterdim ve sonra istediğiniz gibi yazın, kimse mastürbasyonla ilgili sözü iptal etmedi))).
 
Vladimir Simakov :

Ve FileFlush yapmanızı kim engelliyor? Bu bir örnek için bir prototip, o zaman herkes kendi mutluluğunun demircisidir ve tamamlanmış çözümler için genellikle para isterler)))) Yani herhangi bir şeyde açın))) Bu uygulamada, her lansmanın kendi dosyası vardır) ))

UPD: OOP'nin hayatı kolaylaştırdığı bir örnek gösterdim ve sonra istediğiniz gibi yazın, kimse mastürbasyonla ilgili sözü iptal etmedi))).

Aw, dosya adının her seferinde yeni olduğunu fark etmedim. Ardından FileFlush() ekleyin ve birayla birlikte çekin.

 
Dmitry Fedoseev :

Aw, dosya adının her seferinde yeni olduğunu fark etmedim. Ardından FileFlush() ekleyin ve birayla birlikte çekin.

Hatırladığım kadarıyla, MQL'deki FileFlush uzun zamandır bir kuklaydı. Onu aramak faydasız.
 
Alexey Navoykov :
Hatırladığım kadarıyla, MQL'deki FileFlush uzun zamandır bir kuklaydı. Onu aramak faydasız.

HZ. Test etmeden söyleyemem.

 
FileFlush ve FileClose olmadan disk temizlenir. Terminali görev yöneticisinden kapattım.
 
Alexey Navoykov :
Hatırladığım kadarıyla, MQL'deki FileFlush uzun zamandır bir kuklaydı. Onu aramak faydasız.

boş değil, MQL4'te FileFlush olmadan çevrim içi çizelgeler oluşturmanın mümkün olmayacağından eminim (çevrimdışı..çevrimiçi... Rusça harika ve güçlü! ))))

yeni verileri geçmişe sıfırlayana kadar çevrimdışı grafikte yeni bir şey olmayacak

başka bir soru ise, kullanıcı bunu yapmadıysa terminalin dosyayı otomatik olarak sıfırlayıp kapatması .... yılın başında test cihazında, dosyayı kapattıktan sonra bile açabilirsiniz .... daha sonra kontrol et


sadece MQL5'te kontrol edildi - her 3 saniyede bir satır yazıyoruz, ayar false ise günlükte sayacı gösteriyoruz, ardından not defteri ile açılıyoruz - boş bir dosya olacak, eğer doğruysa, dosyanın içeriği her an okunabilir

onlar. FileFlush reklamı yapıldığı gibi çalışır

 #property script_show_inputs
#include <Files\FileTxt.mqh>

input bool UseFileFlush = true ;
//+------------------------------------------------------------------+
void OnStart ()
{
   CFileTxt f;
   f.Open( "tstFileFlush.txt" , FILE_WRITE | FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_COMMON );
   int cnt = 0 ;
   while (! IsStopped ())
   {
      f.WriteString( string (++cnt) + " : QWERTY\n" );
       if (UseFileFlush) f.Flush();
       printf ( "cnt = %i" , cnt);
       Sleep ( 3000 );
   }
}
//+------------------------------------------------------------------+
 

konuya göre

ve sınıf işaretçisinin üst türe aktarılması nasıl gerçekleşir?

daha doğrusu nasıl değil ama tip döküm ne kadar maliyetli? veya derleme zamanında üretilecek ve işlev çağrıları (yöntemler) tablosu karşılaştırılacaktır.

 
Igor Makanu :

konuya göre

ve sınıf işaretçisinin üst türe aktarılması nasıl gerçekleşir?

daha doğrusu nasıl değil ama tip döküm ne kadar maliyetli? veya derleme zamanında üretilecek ve işlev çağrıları (yöntemler) tablosu karşılaştırılacaktır.

Bu durumda maliyet yok. Pahalı (erişirken bir başvuru için) sanal yöntemlere çağrılar.