English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Moving Mini-Max : un nouvel indicateur pour l'analyse technique et son implémentation en MQL5

Moving Mini-Max : un nouvel indicateur pour l'analyse technique et son implémentation en MQL5

MetaTrader 5Exemples | 12 janvier 2022, 14:28
193 0
investeo
investeo

Introduction

Il existe une science, nommée Finance Quantitative, qui permet d'étudier les modèles de tarification des dérivés financiers en utilisant les méthodes de la physique théorique et mathématique.

Dernièrement, je suis tombé sur un article qui décrit un nouvel indicateur d'analyse technique qui combine des idées de la physique quantique et les amène à la finance. Je m'y suis intéressé et j'ai décidé d'enseigner comment implémenter des indicateurs basés sur des articles scientifiques en MQL5.

Le papier original Moving Mini-Max [2] est écrit par ZK Silagadze, un physicien quantique de l'Institut Budker de physique nucléaire et de l'Université d'État de Novossibirsk. Le lien vers l'article ainsi que le code source MQL5 sont disponibles à la fin de l'article.


Indicateur

Je ne m'attendais jamais à écrire cette phrase, mais je vais expliquer ici le tunneling quantique quantum tunneling. Puisque je admets que la plupart des lecteurs ne sont pas des quants, je vais le décrire en termes simples, j'espère que vous ne vous sentirez pas offensé. Dans un premier temps, définissons en une phrase l'idée derrière l'analyse technique des séries chronologiques financières. Nous somme essentiellement à la recherche de :

  • soutien et résistance de niveaux de prix
  • direction des tendances à court et à long terme;
  • les hauts et les bas des tendances.

L'idée originale de l'indicateur Moving Mini-Max est de trouver les hauts et les bas sur le graphique en utilisant l'analogue de la particule alpha quantique qui tente de s'échapper d'un noyau. Le problème est tiré de la théorie de la désintégration alpha de George Gamov [1].

Une image vaut mille mots, c'est pourquoi je colle un petit tableau ci-dessous.

 Fig.1 Boule quantique imaginaire sur un graphique en séries chronologiques

Figure 1. Boule quantique imaginaire sur le graphique des prix du forex

Imaginez qu'une balle soit lancée depuis le sommet de la colline ou dans notre cas depuis un sommet récent sur le graphique chronologique. En mécanique classique, il rebondira sur les obstacles et il se peut qu'il n'ait pas la possibilité de s'arrêter devant le premier obstacle, car il peut se coincer quelque part sur le chemin.

Mais selon la mécanique quantique et la théorie de la désintégration alpha, une telle boule peut avoir une probabilité très faible, mais non nulle, de creuser un tunnel à travers les barrières, de se frayer un chemin jusqu'au fond du puits potentiel et d'y osciller.

Il s'agit d'un analogue de la recherche d'un minimum local dans le tableau des prix. L’article de ZK Silagadze [2] propose que pour réduire les complexités de calcul au lieu de résoudre un vrai problème de mécanique quantique, il suffit d'imiter le comportement quantique. Je présenterai le contexte mathématique qui est présenté dans l'article original, et plus tard l'implémentation dans MQL5.

Soit une série de prix pour un certain intervalle de temps. Le Moving Mini-Max est une transformation non linéaire de la série de prix : 

uSi

où  et pour   est défini comme suit::

 

Comme vous pouvez le constater, il s'agit d'un rapport récurrent, c'est-à-dire que le i-ème élément dépend de l'élément i-1. La série mini-max mobile remplit la condition de normalisation, c'est-à-dire que la somme de tous les éléments est égale à un

 

Les probabilités de tunneling d'une boule quantique sont appelées probabilités de transition car elles modélisent les probabilités de franchir des barrières étroites de séries de prix, de petits obstacles imaginaires en descente :


avec

 

Le paramètre m est une largeur de fenêtre de lissage qui imite la masse (inverse) de la boule quantique et sa capacité à traverser de petits obstacles. Alternativement, le déplacement mini-max d(si) qui met l'accent sur les maximums locaux peut être construit en mettant un signe moins dans le paramètre passé à la fonction exp() : 

 


Implémentation

Après avoir pris connaissance des mathématiques derrière l'indicateur, nous pouvons l'implémenter dans MQL5. La meilleure façon de le faire est de voir depuis la dernière équation. vers le haut. Si vous prêtez attention aux variablesm and n, vous verrez que cet indicateur a besoin d'un tableau d'élémentsn+2m de séries de prix pour une fenêtre mini-max et aura une taille de décalage de m barres.

Ceci est dû aux indices S i+k et S ik dans le calcul des variables Q. La variable i  est incrémentée de 1 to n et k est incrémentée 1 vers m, donc, nous aurons besoin du n+2mtampon pour démarrer. Ceci peut être réalisé en appelant:

double S[];
ArrayResize(S,n+2*m);
CopyClose(Symbol(),0,0,n+2*m,S);

Cela déclarera un tableau de doubles, le redimensionnera à n+2m et copiera les valeurs de clôture des dernières barres n+2m à partir du graphique de symboles actuel à partir de la dernière barre.

L'étape suivante consiste à calculer les valeurs Q Si vous lisez attentivement la définition, vous verrez que pour le ième élément de la série de prix analysée, nous devons additionner m résultats de la fonction exp() avec les variables de valeurs de prix. Par conséquent, nous devons faire une boucle de 1 à n qui comptera toutes les valeursQ  :

void calcQii()
  {
   int i,k;

   for(i=0; i<n; i++)
     {
      double sqiip1=0;
      double sqiim1=0;
      double dqiip1=0;
      double dqiim1=0;

      for(k=0; k<m; k++)
        {
         sqiip1 += MathExp(2*(S[m-1+i+k]-S[i])/(S[m-1+i+k]+S[i]));
         sqiim1 += MathExp(2*(S[m-1+i-k]-S[i])/(S[m-1+i-k]+S[i]));

         dqiip1 += MathExp(-2*(S[m-1+i+k]-S[i])/(S[m-1+i+k]+S[i]));
         dqiim1 += MathExp(-2*(S[m-1+i-k]-S[i])/(S[m-1+i-k]+S[i]));       
        }
      sQiip1[i] = sqiip1;
      sQiim1[i] = sqiim1;
      dQiip1[i] = dqiip1;
      dQiim1[i] = dqiim1;

     }
  }

Comme vous pouvez le constater, la fonction calcQii calcule les valeurs i-ièmeQ and Q` pour la fenêtre de prix observée de taillen. Le tableau Scomporte les valeurs de prix et sQiip1, sQiim1, dQiip1, dQiim1 sont utilisés comme variables de calcul intermédiaires deQ and Q'

Les probabilités sont calculées en fonction des variablesQ and Q`, nous pouvons donc créer une autre fonction qui boucle de 1 à nvia les tableaux sQii et dQii :

void calcPii()
  {
   int i;

   for(i=0; i<n; i++)
     {
      sPiip1[i] = sQiip1[i] / (sQiip1[i] + sQiim1[i]);
      sPiim1[i] = sQiim1[i] / (sQiip1[i] + sQiim1[i]);
      dPiip1[i] = dQiip1[i] / (dQiip1[i] + dQiim1[i]);
      dPiim1[i] = dQiim1[i] / (dQiip1[i] + dQiim1[i]);
     }
  }

Il ne reste plus qu'à calculer les éléments uSi et plus tard dSi et mettre les résultats dans les tableaux uSi et dSi 

void calcui()
  {
   int i;

   sui[0] = 1;
   dui[0] = 1;

   for(i=1; i<n; i++) 
     {
      sui[i] = (sPiim1[i]/sPiip1[i])*sui[i-1];
      dui[i] = (dPiim1[i]/dPiip1[i])*dui[i-1];
     }

   double uSum = 0;
   double dSum = 0;

   ArrayInitialize(uSi, 0.0);
   ArrayInitialize(dSi, 0.0);
   
   for(i=0; i<n; i++) { uSum+=sui[i]; dSum+=dui[i]; }
   for(i=0; i<n; i++) { uSi[n-1-i] = sui[i] / uSum; dSi[n-1-i] = dui[i] / dSum; }
 
  }

Afin de vérifier si la condition de normalisation est valide, on peut ajouter les lignes suivantes :

   double result=0;
   for(i=0; i<n; i++) { /* Print("i = "+i+" uSi = "+uSi[i]); */ result+=uSi[i]; }

   Print("Result = "+ DoubleToString(result));

Une fois tous les calculs effectués, nous devons l'afficher dans la fenêtre de l'indicateur. Pour ce faire, il faut déclarer au moins deux tampons d'indicateur, un pour uSi et un second pour le tableau dSi et définir le type d'indicateur comme DRAW_LINE. 

    #property indicator_separate_window

    #property indicator_buffers 2
    #property indicator_plots 2
    #property indicator_type1 DRAW_LINE
    #property indicator_type2 DRAW_LINE
    #property indicator_color1 SeaGreen
    #property indicator_color2 BlueViolet

Ensuite, en appelant la fonctionSetIndexBuffer() , nous attribuons les tableaux uSi et dSi à afficher comme INDICATOR_DATA:

   SetIndexBuffer(0,uSi,INDICATOR_DATA);
   SetIndexBuffer(1,dSi,INDICATOR_DATA);

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);

   PlotIndexSetInteger(0,PLOT_SHIFT,-(m-1));
   PlotIndexSetInteger(1,PLOT_SHIFT,-(m-1));

Fig.2 Indicateur mini-max mobile

 Figure 2. Indicateur Mini-Max en mouvement implémenté 

Les éventuelles applications de l'indicateur décrit dans l'article sont l'identification des lignes de support et de résistance et l'identification des modèles de graphique par lissage inhérent de l'indicateur. Quant aux lignes de support et de résistance, elles sont formées en croisant le mini-max mobile de la série de prix et le mini-max mobile de sa moyenne mobile.

Si le prix passe par le maximum local et croise une moyenne mobile, nous avons une résistance. Après l'avoir implémentée, j'ai constaté que la méthode présentait de quelques faux signaux, mais je colle un code source pour référence sur la façon de mettre des lignes dans MQL5 à l'aide de la bibliothèque ChartObjectsLines.mqh : 

void SR()
{
   // if price goes through local maximum and crosses a moving average draw resistance
   int i, cnt=0;
   int rCnt=CopyClose(Symbol(),0,0,n+2*m,S);
      
   for (i=n-2; i>=0; i--)
      if (uSi[i]<uSi_MA[i] && uSi[i+1]>=uSi_MA[i+1]) 
      {
      Print("Resistance at " + i);
      CChartObjectHLine *line=new CChartObjectHLine();
      line.Create(0, "MiniMaxResistanceLine:"+IntegerToString(cnt), 0, S[i]);
      line.Color(LightSkyBlue);
      line.Width(1);
      line.Background(true);
      line.Selectable(false);
      cnt++;
      }
   // if price goes through local minimum and crosses a moving average draw support

   for (i=n-2; i>=0; i--)
      if (dSi[i]<dSi_MA[i] && dSi[i+1]>=dSi_MA[i+1]) 
      {
      Print("Support at " + i);
      CChartObjectHLine *line=new CChartObjectHLine();
      line.Create(0, "MiniMaxSupportLine:"+IntegerToString(cnt), 0, S[i]);
      line.Color(Tomato);
      line.Width(1);
      line.Background(true);
      line.Selectable(false);
      cnt++;
      }
}

Le fait intéressant de l'indicateur est que j'ai vu qu'il reconnaît assez bien les minimums et les maximums locaux de courte tendance pour un intervalle de temps donné. Il suffit de filtrer l'écart entre les relevés les plus élevés et les plus bas des mini-maxi mobiles et de les marquer comme le début d'une tendance haussière ou baissière à court terme.

Nous pouvons exploiter ce comportement conformément à d'autres indicateurs et à la gestion de fonds pour devenir un Expert Advisor rentable.

Afin de marquer les relevés les plus élevés sur l’intervalle de temps actuel, nous pouvons utiliser des tampons d'indicateurs supplémentaires pour afficher des flèches hautes et basses chaque fois que l'écart est le plus grand. De plus, pour rendre l'indicateur plus attrayant, j'ai décidé d'utiliser une nouvelle fonctionnalité de MQL5 : un histogramme de couleur . La tendance baissière et celle haussière sont colorées de différentes couleurs et le changement de tendance est signalé par une barre jaune. 

Afin d'utiliser l'histogramme des couleurs entre deux tampons, nous devons utiliser 2 tampons de données et un tampon pour les index de couleur. Veuillez observer comment définir les tracés. Il y a 5 tampons d'indicateurs au total, et trois couleurs sont définies pour l'histogramme des couleurs.

//+------------------------------------------------------------------+
//|                                                MovingMiniMax.mq5 |
//|                                      Copyright 2011, Investeo.pl |
//|                                               http://Investeo.pl |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2011, Investeo.pl"
#property link        "http://Investeo.pl"

#property description "Moving Mini-Max indicator"
#property description "proposed by Z.K. Silagadze"
#property description "from Budker Institute of Nuclear Physics"
#property description "and Novosibirsk State University"
#property description "Original paper can be downloaded from:"
#property description "http://arxiv.org/abs/0802.0984"

#property version     "0.6"
#property indicator_separate_window

#property indicator_buffers 5
#property indicator_plots 3

#property indicator_type1 DRAW_COLOR_HISTOGRAM2
#property indicator_type2 DRAW_ARROW
#property indicator_type3 DRAW_ARROW

#property indicator_color1 Chartreuse, OrangeRed, Yellow
#property indicator_color2 RoyalBlue
#property indicator_color3 RoyalBlue

#property indicator_width1 5
#property indicator_width2 4
#property indicator_width3 4

Veuillez noter que l'histogramme prend deux tampons de typeINDICATOR_DATA et un tampon INDICATOR_COLOR_INDEX. Les tampons doivent être configurés précisément dans l'ordre suivant, les tampons de données viennent en premier, après quoi un tampon d'index de couleur est défini.

   SetIndexBuffer(0,uSi,INDICATOR_DATA);
   SetIndexBuffer(1,dSi,INDICATOR_DATA);
   SetIndexBuffer(2,trend,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3,upArrows,INDICATOR_DATA);
   SetIndexBuffer(4,dnArrows,INDICATOR_DATA);
   
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0.0);
   
   PlotIndexSetInteger(1,PLOT_ARROW,234);
   PlotIndexSetInteger(2,PLOT_ARROW,233); 

Les tampons 0,1,2 sont pour l'histogramme des couleurs, les tampons 3 et 4 sont pour l'affichage des flèches.

L'algorithme de coloration est le suivant :

   if (upind<dnind) 
    { 
      for (i=0; i<upind; i++) trend[i]=0;
      for (i=upind; i<dnind; i++) trend[i]=1;
      for (i=dnind; i<n; i++) trend[i]=0 ;
    } else
    {
      for (i=0; i<dnind; i++) trend[i]=1;
      for (i=dnind; i<upind; i++) trend[i]=0;
      for (i=upind; i<n; i++) trend[i]=1;
   }
   
   trend[upind] = 2;
   trend[dnind] = 2;

 Je colle la capture d'écran du résultat final :

Figure 2. Version finale de l'indicateur Moving Mini-Max

Figure 3. Version finale de l'indicateur Moving Mini-Max

Il faut se rappeler que les valeurs de tendance baissière et haussière sont calculées pour un intervalle de temps donné à chaque fois qu'une nouvelle barre arrive, c'est la raison pour laquelle l'indicateur se déplace mini-max.

Bien qu'il soit en retard dem barres, il donne un aperçu étonnamment bon de la tendance dans l’actuel intervalle de temps et une interprétation de la façon dont le marché « respire ».

Je suis convaincu que cet indicateur peut être rentable.

 

Conclusion

J'ai présenté les mathématiques derrière un nouvel indicateur d'analyse technique et son implémentation en MQL5.

Le papier original de ZK Silagadze est disponible sur http://arxiv.org/abs/0802.0984 Le code source joint est disponible en téléchargement.

J'espère présenter des indicateurs techniques plus intéressants et leur implémentation MQL5 à l'avenir.

 

Les références:

1. G.Gamov,Théorie de la désintégration d’alpha.
2. Z.K. Silagadze, Moving Mini-Max - Un nouvel indicateur d’analyse technique.

Traduit de l’anglais par MetaQuotes Ltd.
Article original : https://www.mql5.com/en/articles/238

Fichiers joints |
movingminimax.mq5 (7.34 KB)
Le Lecteur de Trading Axé sur l'Historique des Deals Le Lecteur de Trading Axé sur l'Historique des Deals
Le lecteur de trading Seulement quatre mots, aucune explication n'est nécessaire. Des pensées sur une petite boîte avec des boutons vous viennent à l'esprit. Appuyez sur un bouton - Ca lit, déplacez le levier - la vitesse de lecture change. En réalité, c'est assez similaire. Dans cet article, je souhaite montrer mon élaboration qui lit l'historique du trade presque comme en temps réel. L'article couvre certaines nuances de la POO, en travaillant avec des indicateurs et en gérant des graphiques.
Connecter les NeuroSolutions Réseaux Neuronaux Connecter les NeuroSolutions Réseaux Neuronaux
En plus de la création de réseaux neuronaux, la suite logicielle NeuroSolutions permet de les exporter sous forme de DLL. Cet article décrit le processus de création d'un réseau neuronal, de génération d'une DLL et de connexion à un Expert Advisor pour le trading dans MetaTrader 5.
Graphiques et diagrammes en HTML Graphiques et diagrammes en HTML
Aujourd’hui, il est difficile de trouver un ordinateur qui n’a pas de navigateur Web installé. Depuis longtemps, les navigateurs évoluent et s’améliorent. Cet article traite du moyen simple et sûr de créer des graphiques et des diagrammes, axés sur les informations obtenues à partir du terminal client MetaTrader 5 pour les afficher dans le navigateur.
L’implémentation d'un mode multi-devises dans MetaTrader 5 L’implémentation d'un mode multi-devises dans MetaTrader 5
Pendant longtemps, l'analyse multi-devises et le trading multi-devises ont été d’un grand intérêt pour les gens. L'opportunité d’implémenter un régime multi-devises à part entière n'est devenue possible qu'avec la sortie publique de MetaTrader 5 et du langage de programmation MQL5. Dans cet article, nous proposons un moyen d'analyser et de traiter tous les ticks entrants pour plusieurs symboles. A titre d'illustration, examinons un indicateur RSI multi-devises de l'indice USDx dollar.