Wunder mit dem Testgerät. - Seite 2

 
Verschiedene Wege ausprobiert - und
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. А будет тестер выдавать первые разы короче хрень.
Я не вижу ошибки в коде - вот как бы в чем дело. Часть кода из статей, часть свой.
Хочеться конечно найти причину и доверять тестеру с первого раза - особенно это касается оптимизации.

Dateien:
MQL5.zip  269 kb
 
1CMaster:
Gibt es einen Link zur korrekten Verwendung von iCustom() unter Berücksichtigung dieser Nuancen? Weil ich es leid bin, ihn zu überprüfen und nach Fehlern zu suchen.

Werfen Sie einen Blick auf den Artikel Indikator für Indikator in MQL5:

Ist es notwendig, Indikatorpuffer zu initialisieren?

Arrays in MQL5 werden standardmäßig nicht mit einem Wert initialisiert, und das gilt natürlich auch für Arrays, die mit SetIndexBuffer() Indikatorpuffern zugewiesen werden. Wenn ein Array ein Indikatorpuffer ist, hängt seine Größe vom Parameter rates_total im OnCalculate() Handler ab.

Man könnte versucht sein, alle Indikatorpuffer mit dem leeren Wert EMPTY_VALUE zu initialisieren, indem man die Funktion ArrayInitialize() verwendet, zum Beispiel einmal zu Beginn von OnCalculate().

...

 

Lieber Rosh - ich habe diesen Artikel gelesen, konnte ihn aber nicht anwenden, weil ich die zweite Form des OnCalculate-Aufrufs verwende, weil ich die Zeit jedes Balkens brauche, nicht nur den Preis.

Der eigentliche Grund ist, dass sich im Indikatorpuffer Müll befindet. Und die Initialisierung des Puffers mit leeren Werten bringt nichts, denn im Tester wächst der Indikatorpuffer automatisch, wenn neue Daten erscheinen, und am Anfang enthält er wirklich Müll, und wenn der Puffer nicht bei jedem Takt gefüllt wird, bleibt der Müll dort.

Mein EA läuft auf Timer - es ist viel schneller als OnTick() aus irgendeinem Grund. Und ich kann es am Wochenende testen.

Ich versuche herauszufinden, was sich in den einzelnen Indikatorpuffern befindet. Die Komplexität besteht darin, dass ein Indikator einen anderen Indikator auf der Grundlage seiner Werte aufruft.

Ich werde versuchen, einen klaren Zeitraum zu wählen und die Größe der Puffer festzulegen. Ich werde die Ursache für falsch-positive Ergebnisse im Prüfgerät ermitteln. Schade, dass der Tester nicht über einen Debugger verfügt - darauf haben alle gewartet.

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

Ich habe einen EA, der mit einem Timer läuft, der aus irgendeinem Grund viel schneller ist als OnTick(). Sie können es auch an Wochenenden testen.

Es gibt einen Artikel Tester Grundlagen in MetaTrader 5, wo es gezeigt wird:

Wir haben die Testzeit bei verschiedenen Werten des Timer-Parameters (der Timer-Ereignisperiode) gemessen. Ein Diagramm, das die Abhängigkeit der Prüfzeit T vom Periodizitätswert zeigt, wurde auf die erhaltenen Daten aufgetragen.


Je kleiner der Timer-Parameter bei der Initialisierung des Timers durch die Funktion EventSetTimer(timer) ist, desto kürzer ist der Zeitraum zwischen den Aufrufen des OnTimer()-Handlers und desto länger ist die Testzeit T unter denselben Bedingungen.
 
1CMaster:

Wenn in iCustom() echter Müll erscheint, liegt das Problem definitiv in der Initialisierung.

Initialisieren Sie den Puffer mit Null und nicht mit Empty_Value. Vergessen Sie nicht, bei jedem neuen Balken die entsprechende Pufferzelle auf Null zu setzen.

 
MoneyJinn:

Wenn in iCustom() echter Müll erscheint, liegt das Problem definitiv in der Initialisierung.

Initialisieren Sie den Puffer mit Null anstelle von Empty_Value. Wenn ein neuer Balken erscheint, vergessen Sie nicht, die entsprechende Pufferzelle auf Null zu setzen.

Ja, das habe ich. Bei jedem Indikator achte ich darauf, dass ich die Werte zuerst auf Null stelle - das hilft, den Müll loszuwerden.

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

{
EingabePuffer[i]=0;
BearbeitenPuffer[i]=0;

ExitBuffer[i]=0;

....

}

Jetzt teste ich es im Minutenchart. Auf dem Stundenchart läuft alles wie am Schnürchen)))) Ich habe einige Fragen zum EA auf dem 1-Minuten-Chart.

 

Wie erwartet - keine Initialisierung. Im FB-Indikator.

Zuallererst sollten wir am Anfang der OnCalculate-Funktion die Initialisierung des Arrays hinzufügen

   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);
     }

Denn die Initialisierung, die Sie haben, funktioniert nicht immer

Zweitens, fügen Sie im Hauptberechnungszyklus ganz am Anfang des Zyklus die Initialisierung von Nullelementen der Arrays hinzu (denn wenn ein neuer Balken zum Diagramm hinzugefügt wird, werden die Indikator-Arrays automatisch vergrößert, und diese neuen Elemente werden in keiner Weise initialisiert, weder explizit, weil prev_calculated>0, noch implizit)

//---- основной цикл расчета
   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]) {

Außerdem muss in CustomOptimisation.mqh in der Klasse TBalanceSlopeCriterion ein Destruktor hinzugefügt werden (dies hat keinen Einfluss auf das Ergebnis, führt aber zu Speicherverlusten beim Testen)

                    ~TBalanceSlopeCriterion() { delete(balance_Ptr); }
 
Ich danke Ihnen allen. Ich werde weitere Tests durchführen.
 

Ich hatte auch ein Wunder mit dem Testgerät.

Ich teste einen EA mit einem Namen: Der Tester zeichnet Objekte

...Ich habe den EA unter einem anderen Namen gespeichert und kompiliert::no objects

Aber ich habe festgestellt, dass ich das Terminal auf ein anderes Laufwerk verschoben habe

 
Optimierungs- und Single-Pass-Ergebnisse stimmen nicht überein (Service-Desk - #329165 + EA dort)