Hatalar, hatalar, sorular - sayfa 741

 
ivandurak :

incir benim açıklayıcı. Tekrar deneyeceğim. Görev, her para biriminin kendi parametreleri olan bir para birimi portföyü oluşturmaktır. Optimize edilmiş bir portföyde para birimi katılmayabilir. Her para birimi için 21 optimizasyon adımıyla altı para biriminin birkaç hesaplaması, toplamda milyarlarca incir hesabına kadar.

Şimdi bir soru. Para biriminin bayrakla ticaret yapmasını yasaklarsak, parametrelerini optimize etmenin bir anlamı yoktur, zaten, sonucu hiçbir şekilde etkilemeyecektir, ancak optimize edici düzenli olarak sonucu etkilemeyen parametreleri seçmeye çalışacaktır, bu boş koşu biraz can sıkıcı (üçüncü gün çoktan geçti). İmkansız olduğunu kendim biliyormuşum gibi görünüyor, ama umut hala parlıyor.

Evet, doğru. Fazladan geçişler olacak. Ancak bu, karmaşık bir optimizasyon başlatmasının bir çeşididir.

TS izin veriyorsa, daha önce cevaplandığı gibi, her çifti ayrı ayrı optimize edin ve kendiniz için, göstermek için, tek bir çoklu para birimi çalışması yapın.

Genel optimizasyon, IMHO'nun sihirli korunma tuzağına düştüğünü ima eder))).

Başka bir çözüm daha var, benim önerdiğimin tersi yönde ama gereksiz koşuları azaltıyor.

Örneğin, 100 parametresini yinelemeniz 50-150 aralığında. Yanlış için bir değer seçin.

Böylece seçeneklerin sayısı bir boyut azaltılır, genetik yerleşir.

 input bool trpar2= true ; // вЫключен флажок
input int grusdchf= 100 ; // включен флажок перебора 49-150
input int grusdjpy= 100 ; // включен флажок перебора 50-150

if (grusdchf== 49 )   // если 49 то запрет торговли
  {
   x_trpar2= false ;
  }
 else                // иначе берет установленное значение флага и параметров
  {
   x_trpar2=trpar2;
  }

// далее по коду для запрета используем x_trpar2
 
ivandurak :

incir benim açıklayıcı. Tekrar deneyeceğim. Görev, her para biriminin kendi parametreleri olan bir para birimi portföyü oluşturmaktır. Optimize edilmiş bir portföyde para birimi katılmayabilir. Her para birimi için 21 optimizasyon adımıyla altı para biriminin birkaç hesaplaması, toplamda milyarlarca incir hesabına kadar.

Şimdi bir soru. Para biriminin bayrakla ticaret yapmasını yasaklarsak, parametrelerini optimize etmenin bir anlamı yoktur, zaten, sonucu hiçbir şekilde etkilemeyecektir, ancak optimize edici düzenli olarak sonucu etkilemeyen parametreleri seçmeye çalışacaktır, bu boş koşu biraz can sıkıcı (üçüncü gün çoktan geçti). İmkansız olduğunu kendim biliyormuşum gibi görünüyor, ama umut hala parlıyor.

Init() ve Trade() gibi bir şeye sahipseniz, her bir çift için + parametreler zaten seçilmişse, sadece paylaşımları belirlemek için kalır, o zaman sorun çözülür. Ne yazık ki, genel anlamda, herhangi bir sayıda sistem için çözmek mümkün değildi.

Bu nedenle, "sistemin payı" adımını ayarlamanız gerekir. 6 sistem için geçiş sayısı f-s ile hesaplanır:

 int PartCount6( double _mult) {
   int __= ( int )( 1.0 / _mult) + 1 ;
   int x, y, z, t, t1, t2, count = 0 ;
   for (t = 0 ; t < __; ++t) for (x = 0 ; x < __; ++x) 
       for (y = 0 ; y < __; ++y) for (z = 0 ; z < __; ++z) 
         for (t1 = 0 ; t1 < __; ++t1) for (t2 = 0 ; t2 < __; ++t2) 
             if (x + y + z + t + t1 + t2 == __- 1 ) ++count;
   return (count);     
}

Bunun için bir komut dosyası oluşturabilirsiniz:

 input double Mult = 0.04 ;

void OnStart () {
   Alert (PartCount6(Mult));
}

ayrıca, optimize edilecek görevin iki parametresi vardır - Mult (optimize edilmemiş) ve kısım - 1'den PartCount6(Mult)'a 1'lik bir adımla. Peki, o halde bir örnek üzerinde:

 input double Mult  = 0.04 ;
input int     part = 3276 ;

CZ1 gbp;
CZ2 jpy;
CZ3 eursek, eur;
CZ4 audcad, sek;

int x, y, z, t, t1, t2; 

int OnInit () {
   int __= ( int )( 1.0 / Mult) + 1 ;
   int count = 0 ;
   for (x = 0 ; x < __; ++x) {
       for (y = 0 ; y < __; ++y) {
         for (z = 0 ; z < __; ++z) {
             for (t = 0 ; t < __; ++t) {
               for (t1 = 0 ; t < __; ++t1) {
                   for (t2 = 0 ; t2 <__; ++t2) { 
                     if (x + y + z + t + t1 + t2 == __- 1 ) {
                        ++count;
                         if (count == part) break ; // Вот где goto был бы полезен, или break n
                     }
                  }
                   if (count == part) break ;
               }
               if (count == part) break ; 
            }
             if (count == part) break ;
         }
         if (count == part) break ;
      }
       if (count == part) break ;
   }
   if (x) gbp.Init(..); //его доля - x * Mult, т. е., нужно в Init долю передавать как параметр
   if (y) jpy.Init(..); 
   if (z) eur.Init(..);
   if (t) eursek.Init(..);
   if (t1) audcad.Init(..);
   if (t2) sek.Init(...);
}

void OnTick () {
   if (x) gbp.Trade();
   if (y) jpy.Trade();
   if (z) eur.Trade();
   if (t) eursek.Trade();
   if (t1) audcad.Trade();
   if (t2) sek.Init(Trade);
}

Adım ne kadar küçükse, döngüde o kadar fazla adım atmanız gerektiğini unutmayın. Örneğin, geçiş sayısını sayan komut dosyası 5 dakikadan fazla bir değer döndürmezse, adımı azaltmak daha iyidir. Adımı azaltmak istemiyorsanız, örneğin para birimlerini ikiye bölün, her grubu optimize edin ve ardından tekrar "gruplar olarak" birlikte. (ve sistem korelasyonlarını kullanmak ve çiftler halinde optimize etmek daha da iyidir - o zaman döngüler o kadar korkutucu değildir; ama bu başka bir hikaye).

Farklı sayıda sistem için (en azından daha küçük, en azından daha büyük) - her şey analojiye göredir.

 

Neredeyse unutuyordum - optimizasyondan sonra paylaşımları bulmanız gerekecek - bu yüzden en çok sevdiğimiz ve OnDeinit'te yazdığımız tek bir geçiş başlatıyoruz:

 void OnDeinit ( const int reason) {
   Print ( "x:" , x * Mult, "; y:" , y * Mult, "; z:" , z * Mult, "; t:" , t * Mult, "; t1:" , t1 * Mult, "; t2:" , t2 * Mult);
}
 

Bu hatayı bir yıl önce keşfettim ve test ettim ve hatta forumda bahsettim.

Anlaşıldığı üzere, o hala hayatta.

Alt satır: Bir yapıcıda sanal bir işlev çağrıldığında, çağrılan yerel işlev değil, ata işlevidir.

 class COracleTemplate
  {
private :
public :
   string             ClassName;
                     COracleTemplate(){Init();};
                    ~COracleTemplate(){DeInit();};
   virtual void       Init(){ClassName= this .Name(); Print ( "loadSettings from " ,ClassName);};
   virtual void       DeInit(){ Print ( "saveSettings to " ,ClassName);};
   virtual string     Name(){ return ( "Prpototype" );};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CCO2: public COracleTemplate
  {
   virtual string     Name(){ return ( "CO2" );};
  };
class CH2O: public COracleTemplate
  {
   virtual string     Name(){ return ( "H2O" );};
  };
COracleTemplate* CO2,*H2O;
void OnStart ()
  {
   CO2= new CCO2;
   CO2.Init();
   Print (CO2.Name(), " ClassName=" ,CO2.ClassName);
   delete CO2;
   
   H2O= new CH2O;
//   H2O.Init();
   Print (H2O.Name(), " ClassName=" ,H2O.ClassName);
   delete H2O;
  }

Baskılar:

 2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        saveSettings to Prpototype
2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        H2O ClassName=Prpototype
2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        loadSettings from Prpototype
2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        saveSettings to CO2
2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        CO2 ClassName=CO2
2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        loadSettings from CO2
2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        loadSettings from Prpototype

Bu bir hataysa, lütfen düzeltin.

Bu bir özellikse, yardımda ayrıntılı olarak vurgulayın ve faydalarının neler olduğunu açıklayın.

Kaçınılmaz bir kötülükse - özellikle özel bir kutudaki yardımda belirtin.

Aksi takdirde, programınızda bir hata aramak için uzun süre çıldırmazsınız.

Dosyalar:
 

Bir ata kurucu, çocukları ve onların sanal işlevleri hakkında hiçbir şey bilmez.

Bir nesne nasıl inşa edilir?

1. İlk olarak, "birincil hiyerarşi" yapıcısı çağrılır. Sanal işlevler tablosunu ortaya çıkarır. Ata, kalıtım hiyerarşisini izleyen soyundan gelenler hakkında hiçbir şey bilmiyor ve soyundan gelenlerin sanal işlev tabloları henüz mevcut değil.

2. Hiyerarşideki bir sonraki çocuğun kurucusu çağrılır. Bu çocuk kendi sanal fonksiyon tablosunu ortaya çıkarır. Aynı zamanda, ataların işlevleri (sanal olanlar dahil) soyundan gelende mevcuttur. Ama yine, bu soyundan gelen, hiyerarşide kendisini takip eden soyundan gelenler hakkında hiçbir şey bilmiyor (1. paragrafta olduğu gibi).

3. Adım 2, hiyerarşinin sonuna kadar tekrarlanır

Özet. Yapıcılarda sanal işlevler kullanmayın. Evet ve yıkıcılarda da.

 
MetaDriver :

Kaçınılmaz bir kötülükse - özellikle özel bir kutudaki yardımda belirtin.

Bu nedenle, yapıcı tamamlanmadan ve yıkıcı başladıktan sonra sanal işlevleri çağırmamak yaygın bir uygulamadır.
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Виртуальные функции - Документация по MQL5
 
stringo :

Bir ata kurucu, çocukları ve onların sanal işlevleri hakkında hiçbir şey bilmez.

Bir nesne nasıl inşa edilir?

1. İlk olarak, "birincil hiyerarşi" yapıcısı çağrılır. Sanal işlevler tablosunu ortaya çıkarır. Ata, kalıtım hiyerarşisini izleyen soyundan gelenler hakkında hiçbir şey bilmiyor ve soyundan gelenlerin sanal işlev tabloları henüz mevcut değil.

2. Hiyerarşideki bir sonraki çocuğun kurucusu çağrılır. Bu çocuk kendi sanal fonksiyon tablosunu ortaya çıkarır. Aynı zamanda, ataların işlevleri (sanal olanlar dahil) soyundan gelende mevcuttur. Ama yine, bu soyundan gelen, hiyerarşide kendisini takip eden soyundan gelenler hakkında hiçbir şey bilmiyor (1. paragrafta olduğu gibi).

3. Adım 2, hiyerarşinin sonuna kadar tekrarlanır

Özet. Yapıcılarda sanal işlevler kullanmayın. Evet ve yıkıcılarda da.

TAMAM. Ama yine de yardımda, her şey yolundaysa, belirgin bir yerde işaretleyin.

Genel olarak, bu (kendimi hayal ettiğim gibi) derlemenin hiyerarşisi ile ilgili değil, VMT'nin yapıcıda nereye eklendiği ile ilgili. Başta eklerseniz (kullanıcı tarafından yazılan koddan önce), bu sorun yok gibi görünüyor ve sonraki kod zaten sanal işlevleri çağırabilir. İmkansız mı, istenmeyen mi yoksa.. ?

TheXpert :
Bu nedenle, yapıcı tamamlanmadan ve yıkıcı başladıktan sonra sanal işlevleri çağırmamak yaygın bir uygulamadır.

Eh, bu konuda hiçbir şey bilmiyordum, diğer OO dillerinde biraz deneyimim olsa bile. Belki de bir kurucu içinde sanal çağrılar yapmak çoğu zaman gerekli olmadığı için.

 
MetaDriver :

TAMAM. Ama yine de yardımda, her şey yolundaysa, belirgin bir yerde işaretleyin.


Bu gerçek, çeşitli yerlerde belgelere yansıtılacaktır.
 
stringo :
Bu gerçek, çeşitli yerlerde belgelere yansıtılacaktır.

Tamam harika.

Teşekkürler, ancak (genel geliştirme için) yapıcının başlangıcında (ataların başlatılmasından sonra) sanal yöntemler tablosunu başlatmanın neden imkansız olduğunu sorabilirsiniz.

--

Bazı durumlarda, yapıcıda sanal çağrılar içeren kod oldukça kullanışlı olabilir. Yeni örnek: Bir dosyadan nesneleri doğrudan yapıcıya yüklemek istedim. Sanal fonksiyonlar tarafından döndürülen tip tanımlayıcıları ile karşılaştırılarak, tiplerin doğrudan yükleme sırasında kontrol edilmesi planlandı. Yapıcıdan sanal çağrıların imkansızlığı nedeniyle bir serseri vardı. Sorunu çözdü, ancak planlandığı kadar zarif değil.

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Виртуальные функции - Документация по MQL5
 
MetaDriver :
O zaman fabrika yap. Sorun çözülecek.
Neden: