Hatalar, hatalar, sorular - sayfa 221

 
vikulin :

aynı sonuç! bu noktalar için giriş parametreleri aynıdır!

Lütfen açıklayın. "Bu noktalar için giriş parametreleri aynı" konusunu anlamadım. Optimize edicinin işini anladığım kadarıyla, her geçiş benzersiz bir giriş parametresi kümesine karşılık gelir. Yoksa bir genetik algoritma kullanırken , optimize edici tarafından benzersiz bir giriş parametresi setinin birkaç kez işlenebileceği durumlar olabileceğini mi söylemek istiyorsunuz?

... Evet, aynen öyle diyor. O zaman, "önbellekten" sonraki tüm noktaların, optimizasyon sonuçlarının görsel algısını bozan bir kurgu olduğu ortaya çıkıyor mu?

 
sultanm :

Garip. Bir kez daha. Grafikte birbirine yakın iki nokta var ve sonuçlarda sadece bir tane var.

İpucu: Lütfen istenen göstergeye göre sıralayın ve tablonun dikey kaydırma çubuğunu göstermeyi unutmayın.

 

Bu sorun hiç çözülmeyecek mi???

Bu onun hakkında üçüncü kez konuşuyorum ve tepki sıfır!


 
vikulin :


Bu arada, bana öyle geliyor ki, yeniden alıntı modelleme seçilirse, bu önbellek kullanılmamalıdır. geliştiriciler bu konuda ne düşünüyor?

ve başka bir hata : genetik algoritmam 10496'nın ötesine geçtiğinde, grafik yanlış görüntülenmeye başladı - dikey olarak doğru ölçeklendi, daha yüksek sonuçların bulunduğunu anlamak mümkün oldu, ancak yatay olarak güncellenmedi. noktalar sağda bir yere, grafiğin sınırlarının ötesine eklenmiş gibiydi.

Lütfen servis masasına yazınız. Ayrıca, 2. paragrafta tam bilgi ilgi çekicidir. EA, terminal yapısı, optimizasyon ayarları...
 
kod:
 int symbols = SymbolsTotal (false);
for ( int i= 0 ; i<symbols; i++) {
   Print ( "Символ №" +i+ " значение=" + SymbolName (i,false));
}

Terminalde sonuç

 2010.12 . 06 13 : 18 : 49    Expert (EURUSD,H1)    Символ № 11 значение=GBPJPY
2010.12 . 06 13 : 18 : 49    Expert (EURUSD,H1)    Символ № 10 значение=GBPCHF
2010.12 . 06 13 : 18 : 49    Expert (EURUSD,H1)    Символ № 9 значение=EURJPY
2010.12 . 06 13 : 18 : 49    Expert (EURUSD,H1)    Символ № 8 значение=EURCHF
2010.12 . 06 13 : 18 : 49    Expert (EURUSD,H1)    Символ № 7 значение=EURAUD
2010.12 . 06 13 : 18 : 49    Expert (EURUSD,H1)    Символ № 6 значение=EURGBP
2010.12 . 06 13 : 18 : 49    Expert (EURUSD,H1)    Символ № 5 значение=AUDUSD
2010.12 . 06 13 : 18 : 49    Expert (EURUSD,H1)    Символ № 4 значение=USDCAD
2010.12 . 06 13 : 18 : 49    Expert (EURUSD,H1)    Символ № 3 значение=USDJPY
2010.12 . 06 13 : 18 : 49    Expert (EURUSD,H1)    Символ № 2 значение=USDCHF
2010.12 . 06 13 : 18 : 49    Expert (EURUSD,H1)    Символ № 1 значение=GBPUSD
2010.12 . 06 13 : 18 : 49    Expert (EURUSD,H1)    Символ № 0 значение=EURUSD

Test cihazında sonuç:

 2010.12 . 06 13 : 21 : 20      Core 1    2010.11 . 01 00 : 00 : 00    Символ № 11 значение=USDJPY
2010.12 . 06 13 : 21 : 20      Core 1    2010.11 . 01 00 : 00 : 00    Символ № 10 значение=USDCHF
2010.12 . 06 13 : 21 : 20      Core 1    2010.11 . 01 00 : 00 : 00    Символ № 9 значение=USDCAD
2010.12 . 06 13 : 21 : 20      Core 1    2010.11 . 01 00 : 00 : 00    Символ № 8 значение=GBPUSD
2010.12 . 06 13 : 21 : 20      Core 1    2010.11 . 01 00 : 00 : 00    Символ № 7 значение=GBPJPY
2010.12 . 06 13 : 21 : 20      Core 1    2010.11 . 01 00 : 00 : 00    Символ № 6 значение=GBPCHF
2010.12 . 06 13 : 21 : 20      Core 1    2010.11 . 01 00 : 00 : 00    Символ № 5 значение=EURUSD
2010.12 . 06 13 : 21 : 20      Core 1    2010.11 . 01 00 : 00 : 00    Символ № 4 значение=EURJPY
2010.12 . 06 13 : 21 : 20      Core 1    2010.11 . 01 00 : 00 : 00    Символ № 3 значение=EURGBP
2010.12 . 06 13 : 21 : 20      Core 1    2010.11 . 01 00 : 00 : 00    Символ № 2 значение=EURCHF
2010.12 . 06 13 : 21 : 20      Core 1    2010.11 . 01 00 : 00 : 00    Символ № 1 значение=EURAUD
2010.12 . 06 13 : 21 : 20      Core 1    2010.11 . 01 00 : 00 : 00    Символ № 0 значение=AUDUSD

SymbolName (i) işlevinin tüm cazibesi gitti

 
vyv :

Geliştiricilere istek. MT5 üzerindeki çalışmalar tüm hızıyla devam ederken ve hala değişiklikler yapılırken, optimizasyon geçişlerinin sayısını artırmak harika olurdu.

Anladığım kadarıyla bir çok problemin çözümü 10.000 civarında seçenek, belki biraz daha fazla belki biraz daha az. Bir işlemcide birkaç saat arama ve en iyi seçenekler bulunur.

MQL5+OOP+Çok çekirdekli testin evrenselliği, MT5 aracılığıyla çözülebilecek yeni görev ufuklarına (örneğin, kalıp arama) bakmanıza olanak tanır.

Ama sorun şu:

Sitenizde yayınlanan makale bir genetik algoritma örneği içeriyor https://www.mql5.com/ru/articles/55 , burada 100 çubukta arama sorununu çözmek için 3^100 doğrudan numaralandırma yapıldı - işte bu LongInt'ten biraz daha fazla :) ve çözüm 17.000 yinelemede bulundu. Genetik algoritma, LongInt'e göre daha birçok seçenek arasından çözümler bulabilmektedir. Ve bu kısıtlama tamamen mantıksız ve modası geçmiş. Eh, bunun dışında, MT5 üzerindeki çalışmanın bu son aşamasında bunu yapmak zor olacak.

Geliştiricilerden büyük bir istek, bu çok zor değilse, lütfen geçiş sayısını en az 2^LongInt (güçte 2) yapın.

Biri bana cevap verecek mi?
 

kod:

 //+------------------------------------------------------------------+
//|                                                      testInd.mq5 |
//|                                                                  |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link       "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   
   int handle1 = iMA ( NULL , 0 , 17 , 0 , MODE_LWMA , PRICE_CLOSE ); //
   int handle2 = iMA ( NULL , 0 , 17 , 0 , MODE_LWMA , PRICE_CLOSE ); //абсолютно идентичные параметры
   if (handle1 == INVALID_HANDLE ) {
                 Print ( "Error Creating Handles for indicators" , GetLastError ());
        } else {
                 Print ( "Handle1 =" +handle1);
        }
         if (handle2 == INVALID_HANDLE ) {
                 Print ( "Error Creating Handles for indicators" , GetLastError ());
        } else {
                 Print ( "Handle2 =" +handle2);
        }
        
   IndicatorRelease (handle2);
   handle2 = INVALID_HANDLE; //добавил для "надежности"
   handle2 = iMA ( NULL , 0 , 33 , 0 , MODE_LWMA , PRICE_CLOSE ); //другой период
         if (handle2 == INVALID_HANDLE ) {
                 Print ( "Error Creating Handles for indicators" , GetLastError ());
        } else {
                 Print ( "Измененный? Handle2 =" +handle2); //все обращения к данным handle2 возвращают данные с handle1
        }
   
   
//---
   return ( 0 );
  }

Kayıt:

2010.12.06 18:07:52 testInd (EURUSD,H1) Değişti mi? tutamaç2=10
2010.12.06 18:07:52 testInd (EURUSD,H1) Tutamak2 =10
2010.12.06 18:07:52 testInd (EURUSD,H1) Tutamak1 =10

Buna göre, işleme2'ye yönelik tüm veri çağrıları, süre değişse de, işleme1'e yapılan çağrılara eşdeğerdir.

Uzman Danışmanın çalışması sırasında, aynı özelliklere sahip göstergelerin oluşturulması göz ardı edilmez ve bir tutamağa böyle bir optimizasyon makuldür, ancak tutamağın bir değişkene bu şekilde "yapışması" hayatı çok bozar.

PS Nedenini buldum. Bu bir hatadır - bir tutamaç numarasına yapılan optimizasyonun bir sonucudur.

 IndicatorRelease (handle2); //уменьшает счетчик хендлов на единицу и в итоге следующий созданный хэндл(с любой переменной) - опять 10
 
Vigor :

kod:

Kayıt:

2010.12.06 18:07:52 testInd (EURUSD,H1) Değişti mi? tutamaç2=10
2010.12.06 18:07:52 testInd (EURUSD,H1) Tutamak2 =10
2010.12.06 18:07:52 testInd (EURUSD,H1) Tutamak1 =10

Buna göre, işleme2'ye yönelik tüm veri çağrıları, süre değişse de, işleme1'e yapılan çağrılara eşdeğerdir.

Uzman Danışmanın çalışması sırasında, aynı özelliklere sahip göstergelerin oluşturulması göz ardı edilmez ve bir tutamağa böyle bir optimizasyon mantıklıdır, ancak tutamağın bir değişkene bu şekilde "yapışması" hayatı çok bozar.

PS Nedenini buldum. Bu bir hatadır - bir tutamaç numarasına yapılan optimizasyonun bir sonucudur.

Sizce bu neden bir bug?

 
alexvd :

Sizce bu neden bir bug?

İyi. Bu bir özelliktir. Ama bilmek daha iyi bir şey.

Örneğin, kullanıcı arayüzden MA için dönem değerleri girerse, göstergeler için tutamaçlar oluşturur ve gösterge arabelleklerinin değerlerini kullanırsa, o zaman tesadüfen de olsa yaratmışsa (örneğin, bu konuda varsayılan ayarlarım var). form) aynı özelliklere sahip 2 gösterge (tutamaçları bir nesne sargısına yerleştirilir), bu özelliğin bir sonucu olarak ikinci gösterge için ilk göstergenin tutamaç numarasını alır.

Aşağıdaki olası olay zincirleri.

Durum 1. İlk göstergeyi siler (ve program bir IndicatorRelease yapar) ve sonuç olarak ikinci gösterge otomatik olarak çalışmaz - arabellek kopyalama hatası.

Durum 2. İkinci göstergeyi kaldırır (ve program bir IndicatorRelease yapar), tutamaç sayacı azalır. İlki harika hissettiriyor. Farklı bir nokta ile üçüncü bir gösterge oluşturur. Kendisine bir tutamaç sayacı + 1 verilir, yani. yeni silinen göstergenin tutamaç numarası. Sonuç olarak, en kötüsü, farklı bir periyoda sahip, başarıyla oluşturulan üçüncü göstergenin, ilk , hala silinmemiş göstergenin değerlerini arabelleğe almasıdır .

Tutamaç numaralarını birleştirme özelliği, birleştirilmiş iki tanıtıcıdan birini silerken ve ardından yeni tutamaçlar oluştururken belirsiz durumlara yol açar.

 //+------------------------------------------------------------------+
//|                                                      testInd.mq5 |
//|                                                                  |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link       "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   
   int handle1 = iMA ( NULL , 0 , 17 , 0 , MODE_LWMA , PRICE_CLOSE ); //
   int handle2 = iMA ( NULL , 0 , 17 , 0 , MODE_LWMA , PRICE_CLOSE ); //абсолютно идентичные параметры
   if (handle1 == INVALID_HANDLE ) {
                 Print ( "Error Creating Handles for indicators" , GetLastError ());
        } else {
                 Print ( "Handle1 =" +handle1);
        }
         if (handle2 == INVALID_HANDLE ) {
                 Print ( "Error Creating Handles for indicators" , GetLastError ());
        } else {
                 Print ( "Handle2 =" +handle2);
        }
        
   IndicatorRelease (handle2);

   handle3 = iMA ( NULL , 0 , 33 , 0 , MODE_LWMA , PRICE_CLOSE ); //другой период
         if (handle3 == INVALID_HANDLE ) {
                 Print ( "Error Creating Handles for indicators" , GetLastError ());
        } else {
                 Print ( "Новый handle3 =" +handle3); //все обращения к данным handle3 возвращают данные с handle1
        }
   
   
//---
   return ( 0 );
  }
 
vyv :
Biri bana cevap verecek mi?

Burada bahsetmişler. https://www.mql5.com/en/forum/1997/page6/#comment_31644

Belki de soruyu oraya taşımak daha iyidir - taşınma önerisi.

Оптимизация в Тестере стратегий
Оптимизация в Тестере стратегий
  • www.mql5.com
из которых ТОЛЬКО 546 ms было затрачено именно на тестирование эксперта.