Vos symboles et vos flux de données dans Metatrader 5 - page 11

 

Je vais ajouter une autre fonction de test contenant deux plateaux pairs de valeurs maximales :

z = abs(tanh(x) + tanh(y))

z = abs(tanh(x) + tanh(y))

Si vous modifiez X,Y de -20 à +20 avec un pas de 0,1, l'itération complète prend 160801 itérations.

Dans le test, les deux plateaux sont atteints en 1400 itérations, ce qui représente moins d'un pour cent de la recherche complète.

Est-ce que quelqu'un va le faire sur GA ? Intéressant de comparer.

 
event:

Je vais ajouter une autre fonction de test contenant deux plateaux pairs de valeurs maximales :

z = abs(tanh(x) + tanh(y))

Si vous modifiez X,Y de -20 à +20 avec un pas de 0,1, l'itération complète prend 160801 itérations.

Dans le test, les deux plateaux sont atteints en 1400 itérations, ce qui représente moins d'un pour cent de la recherche complète.

Est-ce que quelqu'un va le faire sur GA ? Intéressant de comparer.

Tu ne regardes pas avec GA ?

Travailler avec deux arguments d'une fonction optimisée n'est pas du tout indicatif. Non seulement parce que l'espace de recherche est petit, mais aussi parce que les "mauvaises" propriétés de l'algorithme de recherche lui-même peuvent apparaître.

Convertissez la formule en une forme comportant au moins 10 arguments et toutes les propriétés positives et négatives de l'algorithme apparaîtront.

 
joo:

Tu ne cherches pas avec des GA ?

Travailler avec deux arguments d'une fonction optimisée n'est pas du tout indicatif. Non seulement parce que l'espace de recherche est petit, mais aussi parce que les "mauvaises" propriétés de l'algorithme de recherche lui-même peuvent apparaître.

Convertissez la formule en une forme qui comporterait au moins 10 arguments - toutes les propriétés positives et négatives de l'algorithme apparaîtront en même temps.

Ce n'est pas GA, il y a un lien vers l'article dans le fil de discussion.

J'ai posté ci-dessus un exemple avec six paramètres. C'est toute la difficulté d'afficher un grand nombre de paramètres.

Si vous proposez une fonction avec plus de paramètres - je ferai un test.

 
event:

Si vous proposez une fonction avec plus de paramètres - je ferai un test.

Y=a+b ;

où :

a=Skin(x1, y1)+Skin(x2, y2)+Skin(x3, y3)+Skin(x4, y4)+Skin(x5, y5) ;

b=Skin(x6, y6)+Skin(x7, y7)+Skin(x8, y8)+Skin(x9, y9)+Skin(x10, y10) ;

Vous savez déjà où chercher la fonction Skin.

Il y a donc 20 variables, et la fonction Y est très facile à visualiser. Vous pouvez utiliser ce principe pour construire une fonction avec un nombre illimité d'arguments, tout en étant capable de la visualiser.

Et par conséquent, le résultat final est vérifié comme Y*2/n par rapport à la valeur connue de l'extremum, où n est le nombre total d'arguments.

 
Laryx:

Et pouvez-vous me donner un exemple d'un algorithme où dans un "sous-virage" un sur-virage complet se fait en une douzaine d'heures et dans MT en plusieurs mois ?

Il est également réaliste d'obtenir une recherche complète plus rapide que l'heuristique d'optimisation. Une attaque par force brute complète dans MT est représentée comme un ensemble d'exécutions indépendantes. En fait, il est toujours possible de considérer l'optimisation comme un seul problème de calcul et de lui appliquer l'optimisation algorithmique.

Dans cette approche, la séquence des passages est d'une grande importance car presque tous les calculs sont mis en cache. Pour presque tous les paramètres d'entrée (tous indépendants) de TC, il existe toujours des tampons globaux dans l'optimiseur qui stockent les valeurs des passages précédents.

Par exemple, vous utilisez le MA MA et PriceChannel. Pour chacun de ces indicateurs, il existe des paramètres d'entrée indépendants. C'est pourquoi pour chaque indicateur nous prescrivons (quelques lignes en fait, avec la POO cela devrait être encore plus beau) la fonction pour remplir son buffer global. Ensuite, nous comparons l'intensité des ressources de chaque indicateur (PriceChannel est plus lourd que MA). Les paramètres d'entrée des indicateurs les plus lourds commencent à être énumérés dans la boucle externe (premier for), les simples - dans la boucle interne (en for imbriqué).

C'est là que nous obtenons un gain énorme. De plus, il y a le C++, les calculs de nombres entiers et notre propre système de commande sans contrôles inutiles. C'est comme ça qu'on obtient le résultat. Par conséquent, les exécutions uniques sont au moins un ordre de grandeur plus rapide que MT. Et l'optimisation est plus rapide de plusieurs ordres de grandeur.

Ce qui manque à l'optimiseur MT, c'est la fonction OnOptimization qui permettrait un accès complet à la matrice obtenue des résultats d'optimisation. J'y effectue diverses analyses de la matrice obtenue : filtrage, combinaison des passages d'un ordre qui ne se chevauchent pas par le temps de transaction, etc. Mais ce qui est encore plus utile, c'est le calcul des coefficients de pondération pour chacun des passages afin de composer un méta-TS sous la forme d'un portefeuille approprié. Pour ce faire, OnOptimization dispose d'un vecteur-Equité pour chacune des passes non "désespérées".

Mais le sous-testeur n'est pas inventé au stade de la recherche d'un TS fonctionnel, mais lorsqu'il a déjà été trouvé, malheureusement. La recherche elle-même est une étape complètement différente : sans description.
 
event:

Quelqu'un va-t-il faire passer ça en GA ? Intéressant de comparer.

 
joo:

Y=a+b ;

où :

a=Skin(x1, y1)+Skin(x2, y2)+Skin(x3, y3)+Skin(x4, y4)+Skin(x5, y5) ;

b=Skin(x6, y6)+Skin(x7, y7)+Skin(x8, y8)+Skin(x9, y9)+Skin(x10, y10) ;

Vous savez déjà où chercher la fonction Skin.

Il y a donc 20 variables, et la fonction Y est très facile à visualiser. Vous pouvez utiliser ce principe pour construire une fonction avec un nombre illimité d'arguments, tout en étant capable de la visualiser.

Et par conséquent, le résultat final est vérifié comme Y*2/n par rapport à la valeur connue de l'extremum, où n est le nombre total d'arguments.

chose effrayante...)) Et pouvez-vous expliquer comment"la fonction Y est très facile à visualiser" ?
 
Serj_Che:
Combien de passages et à quel pas variable le calcul est-il effectué ?
 
event:
Combien de passages et avec quel pas de variables le calcul est-il effectué ?

Qui se soucie de savoir si vous n'aimez pas la photo ?

Le GA 64 bits de MT5 est très bon, il résout tous les problèmes, l'essentiel étant de formuler le problème correctement.

Je ne sais pas de quel genre d'intello tu parles dans ce fil de discussion sur GA.

Je ne pense pas que le problème vienne de l'AG, mais le testeur lui-même est inutile, surtout à l'échange à cause du mauvais stockage de l'historique des cotations et de l'impossibilité de sauvegarder son propre historique.

J'espère que ce problème sera résolu, mais j'ai peur de devoir attendre 3 à 5 ans.

 
zaskok:

Par exemple, vous utilisez le MA et le PriceChannel. Chacun de ces indicateurs possède ses propres paramètres d'entrée indépendants. Par conséquent, pour chaque indicateur, il existe une fonction écrite (quelques lignes en fait, avec la POO cela doit être encore plus beau) qui remplit son tampon global correspondant. Ensuite, nous comparons l'intensité des ressources de chaque indicateur (PriceChannel est plus lourd que MA). Les paramètres d'entrée des indicateurs les plus lourds commencent à être énumérés sur la boucle externe (premier for), les simples - sur la boucle interne (dans le for imbriqué).

Quelque chose me dit que cette approche pourrait facilement être réalisée sous GA également. La quantité de travail est à peu près la même. La "boucle intérieure" passe à travers à chaque passage...

Mais, plus important encore, quelle serait la demande ? Comme je le soupçonne, tout le monde n'utilise pas la fonction OnTester(), même simple et personnalisée. Mais c'est un outil d'optimisation très puissant.

Voici, par exemple, une de mes mises en œuvre :

double CDoublePeakBottomAdvisorPartsFactory::MyOnTester(CMyExpertT* pmeExpert)
{
   ulong ulTickedTime = pmeExpert.GetTickedTime();
   uint  uiTotalNumberOfSL = pmeExpert.GetNumOfLosePositions();

   double dDDPercent = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
   double dStartBalance = TesterStatistics(STAT_INITIAL_DEPOSIT);
   double dProfit = TesterStatistics(STAT_PROFIT);
   double dNumOfTrades = TesterStatistics(STAT_TRADES);
   double dNumOfProfitTrades = TesterStatistics(STAT_PROFIT_TRADES);
   double dMaxNumOfSL = TesterStatistics(STAT_MAX_CONLOSS_TRADES);
   double dRecoveryFactor = TesterStatistics(STAT_RECOVERY_FACTOR);
   double dProfitTradesPerWeek = dNumOfProfitTrades/ulTickedTime*SECS_IN_WEEK;
   double dProfitPerDay = dProfit/ulTickedTime*SECS_IN_DAY;
  

   Print("Ticked time (days): ",DoubleToString(ulTickedTime/SECS_IN_DAY,2));

   Print("Number Of Trades: ",DoubleToString(dNumOfTrades,1));

   if(dNumOfTrades == 0)
      {
      Print("Ни одного трейда !");
      return(-100000);
      };


   if(dMaxNumOfSL > uiIMaxNumOfSeqSL)
      return(-10000 - dMaxNumOfSL*100 + dProfit/1000);
  
   
   double dBarsPerTrade = ((double)ulTickedTime/PeriodSeconds(m_didData.m_etTimeFrame))/dNumOfTrades;

   if((bILongAllow == false) || (bIShortAllow == false))
      dBarsPerTrade /= 2;
   
   if(dBarsPerTrade < MIN_BARS_PER_TRADE)
      return(dBarsPerTrade-MIN_BARS_PER_TRADE + dRecoveryFactor);

   Print("Max number Of SL: ",DoubleToString(dMaxNumOfSL,1));

   if(iIMaxNumOfSeqSLForQualify > 0 && dMaxNumOfSL > iIMaxNumOfSeqSLForQualify)
      {
      Print("Слишком много СЛ подряд !");
      return(dRecoveryFactor - (dMaxNumOfSL-iIMaxNumOfSeqSLForQualify)*1000)-10000;
      };

   Print("Bars Per Trade (half): ",DoubleToString(dBarsPerTrade,1));
        
   if(dBarsPerTrade > MAX_BARS_PER_TRADE)
      {
      Print("Слишком редкие трейды !");
      return(dRecoveryFactor - dBarsPerTrade/100);
      };
     

   Print("Profit: ",DoubleToString(dProfit,3));
   Print("Profit per day: ",DoubleToString(dProfitPerDay,3));
   Print("Число СЛ: ",IntegerToString(uiTotalNumberOfSL));


   Print("Приемлемая торговля.");
   
   return(dRecoveryFactor + (1-(uiTotalNumberOfSL/dNumOfTrades))*100);
};

Ici, il est basé sur le facteur de récupération, mais il met en évidence les exécutions avec un nombre minimal de SL successifs et avec des transactions assez fréquentes.

Cependant, de la manière dont je vois les choses, la plupart utilisent les options standard.