Miracoli con il tester. - pagina 2

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

File:
MQL5.zip  269 kb
 
1CMaster:
C'è un link per un uso corretto di iCustom() che tenga conto di queste sfumature? Perché sono stanco di controllare e cercare cosa c'è che non va.

Date un'occhiata all'articolo Indicatore per indicatore in MQL5:

È necessario inizializzare i buffer degli indicatori?

Le matrici in MQL5 non sono inizializzate di default con nessun valore, e questo vale certamente per le matrici che sono assegnate ai buffer di indicatori usando SetIndexBuffer(). Se un array è un buffer indicatore, la sua dimensione dipenderà dal parametro rates_total nel gestore OnCalculate().

Ci può essere la tentazione di inizializzare tutti i buffer degli indicatori con un valore vuoto EMPTY_VALUE usando la funzione ArrayInitialize(), per esempio, una volta all'inizio di OnCalculate().

...

 

Caro Rosh - ho letto questo articolo, ma non ho potuto applicarlo, perché uso la seconda forma di chiamata OnCalculate, perché ho bisogno del tempo di ogni barra, non solo del prezzo.

La ragione è che c'è della spazzatura nel buffer dell'indicatore. E l'inizializzazione del buffer con valori vuoti non dà nulla, perché nel tester, quando appaiono nuovi dati, il buffer dell'indicatore cresce automaticamente e all'inizio contiene davvero spazzatura, e se il buffer non viene riempito su ogni barra, la spazzatura rimane lì.

Il mio EA funziona su timer - è molto più veloce di OnTick() per qualche motivo. E posso testarlo nel fine settimana.

Sto cercando di scoprire cosa si trova nel buffer di ogni indicatore. La complessità è che un indicatore ne chiama un altro in base ai suoi valori.

Cercherò di selezionare un periodo chiaro e di impostare la dimensione dei buffer. Determinerò la causa dei falsi positivi nel tester. Eh - è un peccato che il tester non abbia un debugger - tutti lo stavano aspettando.

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

Ho un EA che gira su un timer - è molto più veloce di OnTick() per qualche motivo. Puoi testarlo anche durante il fine settimana.

C'è un articolo tester di base in MetaTrader 5 dove viene mostrato:

Abbiamo misurato il tempo di prova a diversi valori del parametro del timer (il periodo dell'evento Timer). Un grafico che mostra la dipendenza del tempo di prova T dal valore di periodicità è stato tracciato sui dati ottenuti.


È chiaro che più piccolo è il parametro del timer all'inizializzazione del timer da parte della funzione EventSetTimer(timer), minore è il periodo tra le chiamate del gestore OnTimer() e maggiore è il tempo di test T nelle stesse condizioni.
 
1CMaster:

Se la vera spazzatura appare in iCustom(), il problema è sicuramente nell'inizializzazione.

Inizializza il buffer con zero piuttosto che con Empty_Value. Quando appare ogni nuova barra, non dimenticare di azzerare la cella del buffer corrispondente.

 
MoneyJinn:

Se la vera spazzatura appare in iCustom(), il problema è sicuramente nell'inizializzazione.

Inizializza il buffer con zero invece di Empty_Value. Quando appare ogni nuova barra, non dimenticare di azzerare la cella del buffer corrispondente.

Sì, l'ho fatto. In ogni indicatore mi assicuro di azzerare i valori prima - ha aiutato a sbarazzarsi della spazzatura.

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

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

ExitBuffer[i]=0;

....

}

Ora lo sto testando sul grafico a minuti. Sul grafico orario tutto funziona come un orologio )))) Ho alcune domande sull'EA sul grafico a 1 minuto.

 

Come previsto - nessuna inizializzazione. Nell'indicatore FB.

Prima di tutto, all'inizio della funzione OnCalculate dovremmo aggiungere l'inizializzazione degli array

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

Perché l'inizializzazione che avete, non sempre funziona

In secondo luogo, nel ciclo di calcolo principale, proprio all'inizio del ciclo, aggiungere l'inizializzazione degli elementi zero degli array (perché quando una nuova barra viene aggiunta al grafico, gli array di indicatori vengono automaticamente aumentati, e questi nuovi elementi non sono inizializzati in alcun modo, né esplicitamente perché prev_calculated>0, né implicitamente)

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

Inoltre, in CustomOptimisation.mqh nella classe TBalanceSlopeCriterion deve essere aggiunto un distruttore (non influenza il risultato, ma porta a perdite di memoria durante i test)

                    ~TBalanceSlopeCriterion() { delete(balance_Ptr); }
 
Grazie a tutti. Farò altri test.
 

Anche io ho avuto un miracolo con il tester.

Testato EA con un nome: il tester disegna oggetti

...ho salvato e compilato l'EA sotto un altro nome::no objects

Ma ho notato che ho spostato il terminale in un'altra unità

 
I risultati dell'ottimizzazione e del singolo passaggio non corrispondono (service-desk - #329165 + EA lì)