Les résultats de l'optimisation diffèrent des tests individuels sur ces derniers - page 6

 

Je constate que la question des tests de propagation a été soulevée à maintes reprises. Je suis récemment arrivé à un système qui semble plus ou moins sérieux (en termes de trading réel) et qui nécessite donc des tests approfondis. Je me suis également préoccupé de cette question. En conséquence, j'ai écrit un script simple qui définit la propagation requise pour les tests hors ligne.

Le principe est bien connu, dans le fichier symbols.sel Ask est écrasé. Donc, dans le terminal hors ligne, copiez-le du dossier historique vers le dossier experts/files, lancez le script, puis fermez le terminal, recopiez symbols.sel et relancez le terminal.

P.S. Remplacé le script, un petit oubli était, si quelqu'un a soudainement eu le temps de prendre SetSpread et non SetSpread_1, besoin de télécharger à nouveau.

Dossiers :
 
Le même problème. J'obtiens les mêmes résultats lors de l'optimisation, mais des résultats radicalement différents lors des exécutions uniques. Merci à Mathemat de m'avoir orienté dans la bonne direction.

Mathemat:
Faites attention aux objets pendant les tests. Il est préférable de ne pas les utiliser du tout.

Je vais partager ce qui s'est passé et comment cela a été résolu, peut-être que quelqu'un trouvera cela utile. J'ai écrit mon propre indicateur, en utilisant des lignes de tendance. L'indicateur a transmis le nombre de lignes de tendance brisées à la variable globale du terminal. C'était comme ça :

GlobalVariableSet("GV_name", number);

et dans le conseiller expert, la valeur de

int dc = GlobalVariableGet("GV_name");

Tout allait bien dans le visualiseur et dans les tests individuels. J'ai donc décidé d'économiser la déclaration d'une variable "supplémentaire" pour réduire la taille du code. Après avoir corrigé le code de la manière suivante, tout a commencé à fonctionner avec des résultats identiques dans l'optimiseur et les tests individuels.

string GlobVar = "GV_name";  // объявил переменную в индикаторе на глобальном уровне программы

int start(){
  GlobalVariableSet(GlobVar, number);
}
string GlobVar;  // объявил переменную в советнике на глобальном уровне программы
int dc;

int start(){
  dc = GlobalVariableGet(GlobVar);
}

Ainsi, en définissant des variables globales dans l'indicateur et dans l'EA, tout fonctionne correctement.

 

Bonsoir, chers collègues.

J'ai décidé de réanimer ce sujet, car j'ai rencontré un problème identique.

Mon conseiller expert n'utilise pas d'objets graphiques. J'ai défini un écart personnalisé qui est le même partout. Cependant, les tests uniques sont très différents des résultats d'optimisation. De plus, j'ai effectué des tests uniques sur différents ordinateurs et ils se ressemblent tous mais ne coïncident pas avec les résultats d'optimisation.

Peut-être que quelqu'un a trouvé une solution ?

 
Andrey Kaunov:

Bonsoir, chers collègues.

J'ai décidé de réanimer ce sujet, car j'ai rencontré un problème identique.

Mon conseiller expert n'utilise pas d'objets graphiques. J'ai défini un écart personnalisé qui est le même partout. Cependant, les tests uniques sont très différents des résultats d'optimisation. De plus, j'ai effectué des tests uniques sur différents ordinateurs et ils se ressemblent tous mais ne coïncident pas avec les résultats d'optimisation.

Peut-être que quelqu'un a trouvé une solution ?

Pourquoi devraient-ils être les mêmes ? Sauf si vous devez passer en revue tous les paramètres et sélectionner la meilleure option. Mais cette démarche est coûteuse et nécessite des ressources importantes. C'est pourquoi nous utilisons des algorithmes génétiques. Et ils sont essentiellement construits de la manière suivante : échantillonnage aléatoire de jeux de paramètres parmi ceux qui sont optimisés, puis choix du meilleur et recherche plus détaillée à cet endroit. Par exemple 6 paramètres. Présenter la meilleure solution est comme la plus grande densité dans un espace à 6 dimensions. Et il peut y avoir de nombreux points de densification. Un bon algorithme donne des clairières volumétriques 6-dimensionnelles lisses avec peu de densités et l'optimisation les trouvera, et si l'algorithme donne des densités nettes, alors les résultats peuvent être aléatoires. c'est-à-dire que l'optimisation trouvera des densités mais pas le même ensemble de paramètres (mêmes modèles) à chaque fois.

 

Valery, au lieu de répondre juste pour citer, puis-je...

eugene-last:

Hum... Je pense que beaucoup de gens refusent simplement de comprendre le problème. Ou s'éloigner délibérément.

Qu'est-ce que l'optimisation et qu'est-ce qu'un test unique ? Réponse : l'optimisation consiste en plusieurs tests uniques.
Qu'est-ce que cela signifie ? Réponse : cela signifie théoriquement que la passe d'optimisation est la même et aboutit au même résultat que le test unique.

En pratique, il s'avère que ce n'est pas le cas. Et le conseiller expert (pas une maxime d'ailleurs, je vois que cela dérange certaines personnes ici) n'échoue pas parce que le test unique montre exactement le même résultat. Alors, pourquoi ce seul test d'optimisation donne-t-il un résultat différent ?

 
Andrey Kaunov:

Bonsoir, chers collègues.

J'ai décidé de réanimer ce sujet, car j'ai rencontré un problème identique.

Mon conseiller expert n'utilise pas d'objets graphiques. J'ai défini un écart personnalisé qui est le même partout. Cependant, les tests uniques sont très différents des résultats d'optimisation. De plus, j'ai effectué des tests uniques sur différents ordinateurs et ils se ressemblent tous mais ne coïncident pas avec les résultats d'optimisation.

Peut-être que quelqu'un a trouvé une solution ?

1. vérifier que toutes les variables sont initialisées, bien que dans le passé dans MQL4 - les variables non initialisées étaient égales à 0, maintenant je ne sais pas.

2, si vous utilisez des tableaux dynamiques - vous devez vérifier le résultat de ArrayResize() - j'ai eu un problème avec cela, j'ai fait une EA pour 4-5 indicateurs, il s'est avéré qu'un indicateur mangeait toute la mémoire, et dans mon EA, ArrayResize() ne donnait pas toujours la taille de tableau demandée - cela a fonctionné une fois ou pas. Si je ne me trompe pas, le MQL4 a environ 3Gb de mémoire max. pour les programmes MQL, le terminal est 32-bit.

 
Andrey Kaunov:

Valery, au lieu de répondre, je vais juste citer, puis-je...

Je ne sais pas exactement, je ne sais pas. Après tout, l'optimisation ne consiste pas en quelques tests uniques, mais bien en de nombreux tests. Pour aller au fond des choses, nous avons besoin de codes de problèmes simples et reproductibles. Alors peut-être que les développeurs répondront.

 
Igor Makanu:

1. vérifier que toutes les variables sont initialisées, bien qu'auparavant dans MQL4 - les variables non initialisées étaient égales à 0, maintenant je ne sais pas, d'ailleurs cela concerne aussi les indicateurs

2, si vous utilisez des tableaux dynamiques - vous devez vérifier le résultat de ArrayResize() - j'ai eu ce problème, j'ai fait EA pour 4-5 indicateurs, il s'est avéré qu'un indicateur mangeait toute la mémoire, et dans EA, je n'ai pas toujours ArrayResize() marqué la taille demandée du tableau - ça a marché et ça n'a pas marché une autre fois. Si je ne me trompe pas, le MQL4 a environ 3Gb de mémoire maximum pour les programmes MQL, le terminal a 32 bits.

Igor, merci pour le tuyau. Je vais essayer de faire des recherches dans ce sens.

Valeriy Yastremskiy:

Je ne suis pas sûr, je ne sais pas. Par conséquent, les données d'entrée peuvent être différentes pour des raisons de rapidité. Pour aller au fond des choses, nous avons besoin de codes de problèmes simples et reproductibles. Alors peut-être que les développeurs répondront.

Eh bien, rien ne devrait être différent, sinon tout l'intérêt de l'optimisation est perdu. Et les développeurs n'ont rien répondu depuis 10 ans...

 
Andrey Kaunov:

Igor, merci pour le tuyau. Je vais essayer de creuser dans cette direction.

Eh bien, rien ne devrait être différent, sinon tout l'intérêt de l'optimisation est perdu. Et les développeurs n'ont rien répondu depuis 10 ans...

Les développeurs ne comprennent pas les mots et les plaintes. Seulement le code compréhensible qui reproduit le problème).

 
Igor Makanu:

1. vérifier que toutes les variables sont initialisées, bien qu'auparavant dans MQL4 - les variables non initialisées étaient égales à 0, maintenant je ne sais pas, d'ailleurs cela concerne aussi les indicateurs

2, si vous utilisez des tableaux dynamiques - vous devez vérifier le résultat ArrayResize() - J'ai eu ce problème, j'ai fait une EA avec 4-5 indicateurs, il s'est avéré qu'un indicateur consommait toute la mémoire, et dans mon EA, ArrayResize() ne donnait pas toujours la taille de tableau demandée - cela a fonctionné une fois ou pas. Si je ne me trompe pas, dans MQL4 la mémoire est d'environ 3Gb max. pour les programmes MQL, le terminal est 32-bit.

Il y a des zéros dans 4 et des déchets dans 5. La dernière fois, de tels problèmes semblaient avoir été résolus exactement grâce à la découverte de variables initialisées en dehors de OnInit et modifiées au cours de l'exécution de l'optimisation, c'est-à-dire au cours de

au passage suivant, ils ne se sont pas retrouvés avec leur valeur initiale.

Raison: