Bir test cihazı ile mucizeler. - sayfa 2

 
Farklı şekillerde denedim ve
ArrayInitialize
и
Циклом 
// ===Если это первый запуск обнулим все буферы:)
if (prev_calculated <= 0 ) // проверка на первый старт расчёта индикатора
{
for ( int i= 0 ;i<=rates_total- 1 ;i++)
{
eeee[i]= EMPTY_VALUE ;
}
//Print("!!!Обнулили все буферные массивы!!!");
}

Запускаю первый тест - выдает фигню, второй раз - еще фигню, с третьего раза начинает выдавать правдивый результат уже постоянно.
Не могу понять в чем дело.

Тестировал сегодня с 13.02.12 - 25.02.12 - всего один сигнал на продажу и один сигнал на закрытие продажи.
Как и говорил - с третьего раза начинает постоянно выдавать уже правдивый результат - а до этого ерунду выдает.
А теперь представьте, что вы запускаете оптимизацию - я же не могу по три раза оптимизацию запускать, - короче я не знаю что делать.
Могу конечно код индюка вставить в советник - но вызывать его удобнее из другого индюка.
Кто еще что скажет.

Выкладываю исходники - они уже настроены. 
Запустите тест на ЕвроБакс с 13.02.12 - 25.02.12 - правильный результат -35.20. А будет тестер выдавать первые разы короче хрень.
Я не вижу ошибки в коде - вот как бы в чем дело. Часть кода из статей, часть свой.
Хочеться конечно найти причину и доверять тестеру с первого раза - особенно это касается оптимизации.

Dosyalar:
MQL5.zip  269 kb
 
1CMaster :
Bu nüanslar göz önünde bulundurularak iCustom()'un doğru kullanımına ilişkin bir bağlantı var mı??? Sonra kontrol etmekten ve sorunun ne olduğunu aramaktan yoruldum.

MQL5'teki bir göstergeden Gösterge makalesine bakın:

Gösterge arabelleklerini başlatmam gerekir mi?

MQL5'teki diziler varsayılan olarak herhangi bir değerle başlatılmaz ve bu kesinlikle SetIndexBuffer() işlevi tarafından gösterge arabelleklerine atanan diziler için geçerlidir. Dizi bir gösterge arabelleğiyse, işlem sırasında boyutu OnCalculate() işleyicisindeki Rates_total parametresine bağlı olacaktır.

ArrayInitialize() işlevini kullanarak, örneğin OnCalculate() öğesinin başında bir kez, tüm gösterge arabelleklerini boş bir EMPTY_VALUE değeriyle başlatmak cazip gelebilir.

...

 

Sevgili Rosh - Bu makaleyi okudum, ancak OnCalculate çağrısının ikinci formunu kullandığım için uygulayamadım, çünkü sadece fiyat değil, her bir çubuğun zamanına ihtiyacım var.

Bunun nedeni, gösterge arabelleğinde gerçekten çöp görünmesidir. Ve arabelleği boş değerlerle başlatmak hiçbir şey vermez, çünkü test cihazında, yeni veriler göründüğünde, gösterge arabelleği otomatik olarak büyür ve başlangıçta gerçekten çöp vardır ve göstergedeki arabellek her birinde doldurulmazsa bar, sonra çöp orada kalır.

Danışmanım bir zamanlayıcı üzerinde çalışıyor - bazı nedenlerden dolayı OnTick() işlevinden çok daha hızlı. Evet, hafta sonları test edebilirsiniz.

Şimdi her gösterge arabelleğinde ne olduğunu bulmaya çalışıyorum. Zorluk, bir göstergenin diğerinin değerlerine göre hesaplanmasına neden olması gerçeğinde yatmaktadır.

Net bir noktayı vurgulamaya ve arabelleklerin boyutunu ayarlamaya çalışacağım. Test cihazının yanlış pozitiflerinin nedenini belirleyeceğim. Eh - test cihazında hata ayıklayıcı olmaması üzücü - aksi takdirde herkes onu bekliyor ve bekliyordu.

Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 
1CMaster :

Danışmanım bir zamanlayıcı üzerinde çalışıyor - bazı nedenlerden dolayı OnTick() işlevinden çok daha hızlı. Evet, hafta sonları test edebilirsiniz.

MetaTrader 5'te aşağıdakileri gösteren Test Temelleri makalesi vardır:

Zamanlayıcı parametresinin çeşitli değerleri (Zamanlayıcı olayının periyodikliği) için test süresinin ölçümleri yapılmıştır. Elde edilen verilere dayanarak, T test süresinin Periyot değerine bağımlılığının bir grafiği oluşturulmuştur.


Zamanlayıcı EventSetTimer işlevi (zamanlayıcı) tarafından başlatıldığında zamanlayıcı parametresi ne kadar küçükse, OnTimer() işleyicisine yapılan çağrılar arasındaki sürenin (Periyot) o kadar kısa olduğu ve aynı diğeri altında test süresi T'nin daha uzun olduğu açıkça görülmektedir. koşullar.
 
1CMaster :

iCustom() içinde gerçek çöp görünüyorsa, sorun kesinlikle başlatmadadır.

Tamponu Empty_Value ile değil, sıfır ile başlatın. Her yeni çubuk göründüğünde, karşılık gelen arabellek hücresini sıfırlamayı unutmayın.

 
MoneyJinn :

iCustom() içinde gerçek çöp görünüyorsa, sorun kesinlikle başlatmadadır.

Tamponu Empty_Value ile değil, sıfır ile başlatın. Her yeni çubuk göründüğünde, karşılık gelen arabellek hücresini sıfırlamayı unutmayın.

Evet yaptı. Her göstergede, her zaman önce değerleri sıfırladım - çöplerden kurtulmaya yardımcı oldu.

for(i=first;i<rates_total-1 && !IsStopped();i++)

{
EnterBuffer[i]=0;
EditBuffer[i]=0;

ExitBuffer[i]=0;

....

}

Şimdi dakika grafiğine bakıyorum. Saatte, her şey zaten bir saat gibi çalışıyor))) Ve bir dakika içinde, danışmanın çalışmaları hakkında hala sorularım var.

 

Beklendiği gibi - başlatma eksikliği. FB göstergesinde

İlk olarak, OnCalculate işlevinin başında dizi başlatma eklemeniz gerekir.

   if (prev_calculated== 0 )
     {
       ArrayInitialize (SignalBuyBuffer, 0 );
       ArrayInitialize (SignalSellBuffer, 0 );
       ArrayInitialize (HighBuffer, 0 );
       ArrayInitialize (LowBuffer, 0 );
       ArrayInitialize (OpenBuffer, 0 );
       ArrayInitialize (CloseBuffer, 0 );
       ArrayInitialize (ColorBuffer, 0 );
       ArrayInitialize (TrendBuffer, 0 );
     }

Çünkü sahip olduğunuz başlatma her zaman çalışmıyor

İkinci olarak, ana hesaplama döngüsünde, en başta, dizilerin sıfır öğelerinin başlatılmasını ekleyin (çünkü çizelgeye yeni bir çubuk eklendiğinde, gösterge dizileri otomatik olarak artar ve bu yeni öğeler hiçbir şekilde başlatılmaz, ne de açıkça çünkü prev_calculated>0 veya dolaylı olarak )

 //---- основной цикл расчета
   for (i=first; i<rates_total && ! IsStopped (); i++)
     {     
       SignalBuyBuffer[i]= 0 ;
        SignalSellBuffer[i]= 0 ;
        HighBuffer[i]= 0 ;
        LowBuffer[i]= 0 ;
        OpenBuffer[i]= 0 ;
        CloseBuffer[i]= 0 ;
        ColorBuffer[i]= 0 ;
        TrendBuffer[i]= 0 ;

         if (i == 88366 )
        {
         Print ( "" +DoubleToString(maxHigh, 5 )+ ": " +DoubleToString(minLow, 5 ));
        }

        maxHigh=high[ iHighest (high,period,i- 1 )];
        minLow=low[ iLowest (low,period,i- 1 )];        
         if (open[i- 1 ] > close[i- 1 ]) {

Ayrıca TBalanceSlopeCriterion sınıfındaki CustomOptimization.mqh dosyasına bir yıkıcı eklenmelidir (bu sonucu etkilemez ancak test sırasında bellek sızıntısına neden olur)

                    ~TBalanceSlopeCriterion() { delete(balance_Ptr); }
 
Herkese teşekkürler. Daha fazla test edeceğim.
 

Ben de test cihazıyla bir mucize yaşadım.

Aynı ada sahip bir Uzman Danışmanı Test Etme: test cihazı nesneler çizer

...EA'yı farklı bir adla kaydetti ve derledi::nesneler görünmez

ama terminali başka bir diske taşıdığımı not ediyorum

 
Optimizasyon sırasında geçişlerin sonuçları ve tek geçiş eşleşmiyor (servis masası - #329165 + danışman aynı yerde)