Des miracles avec le testeur. - page 2

 
J'ai essayé différentes méthodes - et
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. А будет тестер выдавать первые разы короче хрень.
Я не вижу ошибки в коде - вот как бы в чем дело. Часть кода из статей, часть свой.
Хочеться конечно найти причину и доверять тестеру с первого раза - особенно это касается оптимизации.

Dossiers :
MQL5.zip  269 kb
 
1CMaster:
Existe-t-il un lien permettant d'utiliser correctement la fonction iCustom() en tenant compte de ces nuances ? Parce que je suis fatigué de le vérifier et de chercher ce qui ne va pas.

Consultez l'article Indicateur par indicateur dans MQL5:

Est-il nécessaire d'initialiser les tampons indicateurs ?

Les tableaux dans MQL5 ne sont pas initialisés par défaut avec une valeur quelconque, et cela s'applique certainement aux tableaux qui sont assignés aux tampons d'indicateurs en utilisant SetIndexBuffer(). Si un tableau est un tampon indicateur, sa taille dépendra du paramètre rates_total du gestionnaire OnCalculate().

On peut être tenté d'initialiser tous les tampons d'indicateurs avec la valeur vide EMPTY_VALUE en utilisant la fonction ArrayInitialize(), par exemple, une fois au début de OnCalculate().

...

 

Cher Rosh - J'ai lu cet article, mais je n'ai pas pu l'appliquer, car j'utilise la deuxième forme de l'appel OnCalculate, parce que j'ai besoin du temps de chaque barre, et pas seulement du prix.

La raison en est qu'il y a des déchets dans le tampon de l'indicateur. Et l'initialisation du tampon avec des valeurs vides ne donne rien, car dans le testeur, lorsque de nouvelles données apparaissent, le tampon de l'indicateur grandit automatiquement et au début il contient vraiment des déchets, et si le tampon n'est pas rempli à chaque barre, les déchets restent là.

Mon EA fonctionne sur le timer - il est beaucoup plus rapide que OnTick() pour une raison quelconque. Et je peux le tester le week-end.

J'essaie de savoir ce qui se trouve dans chaque tampon d'indicateur. La complexité réside dans le fait qu'un indicateur en appelle un autre en fonction de ses valeurs.

J'essaierai de sélectionner une période claire et de définir la taille des tampons. Je vais déterminer la cause des faux positifs dans le testeur. Eh - c'est dommage que le testeur ne dispose pas d'un débogueur - tout le monde l'attendait.

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

J'ai un EA qui fonctionne sur un timer - il est beaucoup plus rapide que OnTick() pour une raison quelconque. Vous pouvez également le tester le week-end.

Il y a un article testeur de base dans MetaTrader 5 où il est montré :

Nous avons mesuré le temps de test pour différentes valeurs du paramètre de la minuterie (la période de l'événement de la minuterie). Un graphique montrant la dépendance du temps d'essai T par rapport à la valeur de périodicité a été tracé sur les données obtenues.


Il est clair que plus le paramètre du timer est petit lors de l'initialisation du timer par la fonction EventSetTimer(timer), plus la période entre les appels du handler OnTimer() est courte et plus le temps de test T dans les mêmes conditions est long.
 
1CMaster:

Si de véritables déchets apparaissent dans iCustom(), le problème se situe certainement dans l'initialisation.

Initialiser le tampon avec zéro plutôt que Empty_Value. Lorsque chaque nouvelle barre apparaît, n'oubliez pas de mettre à zéro la cellule tampon correspondante.

 
MoneyJinn:

Si de véritables déchets apparaissent dans iCustom(), le problème se situe certainement dans l'initialisation.

Initialiser le tampon avec zéro au lieu de Empty_Value. Lorsque chaque nouvelle barre apparaît, n'oubliez pas de mettre à zéro la cellule tampon correspondante.

Oui, je l'ai fait. Dans chaque indicateur, je m'assure d'abord de remettre les valeurs à zéro - ce qui permet de se débarrasser des déchets.

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

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

ExitBuffer[i]=0 ;

....

}

Maintenant, je le teste sur le graphique en minutes. Sur le graphique horaire, tout fonctionne comme sur des roulettes. )))) J'ai quelques questions concernant l'EA sur le graphique 1 minute.

 

Comme prévu - pas d'initialisation. Dans l'indicateur FB.

Tout d'abord, au début de la fonction OnCalculate nous devons ajouter l'initialisation des tableaux

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

Parce que l'initialisation que vous avez, ne fonctionne pas toujours...

Deuxièmement, dans le cycle de calcul principal, au tout début du cycle, ajouter l'initialisation des éléments nuls des tableaux (car lorsqu'une nouvelle barre est ajoutée au graphique, les tableaux d'indicateurs sont automatiquement augmentés, et ces nouveaux éléments ne sont initialisés d'aucune manière, ni explicitement parce que prev_calculated>0, ni implicitement).

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

En outre, dans CustomOptimisation.mqh, dans la classe TBalanceSlopeCriterion, un destructeur doit être ajouté (cela n'affecte pas le résultat, mais entraîne une fuite de mémoire pendant les tests).

                    ~TBalanceSlopeCriterion() { delete(balance_Ptr); }
 
Merci à tous. Je vais faire d'autres tests.
 

J'ai eu un miracle avec le testeur aussi.

Je teste un EA avec un seul nom : le testeur dessine des objets.

...j'ai sauvegardé et compilé l'EA sous un autre nom::pas d'objets

Mais j'ai remarqué que j'ai déplacé le terminal sur un autre disque.

 
Les résultats de l'optimisation et de la passe unique ne correspondent pas (service-desk - #329165 + EA là)
Raison: