English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Indicateurs techniques et filtres numériques

Indicateurs techniques et filtres numériques

MetaTrader 5Intégration | 13 janvier 2022, 11:01
113 0
GT788
[Supprimé]

Introduction

Depuis plusieurs années, le Code Base a accumulé un grand nombre d'indicateurs. Beaucoup d'entre eux sont des copies les uns des autres avec seulement de légères modifications. Après de nombreuses heures de comparaison visuelle des indicateurs sur le graphique, nous n'avons pas pu nous empêcher de demander : "Est-il possible de trouver un moyen de comparaison plus objectif et efficace ?" C'est possible, en effet. Il faut admettre qu'un indicateur est un filtre numérique. Tournons-nous vers Wikipédia.

Filtre (chimie), un dispositif (généralement une membrane ou une couche) conçu pour bloquer physiquement certains objets ou substances tout en laissant passer d'autres.

Êtes-vous d'accord pour dire que les indicateurs permettent de bloquer certains objets "inutiles" et de se concentrer sur les plus critiques ? Voyons maintenant ce qu'est un filtre numérique.

En électronique, en informatique et en mathématiques, un filtre numérique est un système qui effectue des opérations mathématiques sur un signal échantillonné en temps discret pour réduire ou améliorer certains aspects de ce signal.

En d'autres termes, un filtre numérique est un filtre traitant des signaux discrets. Les prix que nous voyons dans le terminal peuvent être traités comme des signaux discrets, car leurs valeurs ne sont pas enregistrées en continu mais sur une certaine période de temps. Par exemple, la valeur du prix est enregistrée chaque heure sur le graphique H1, alors qu'elle est effectuée une fois toutes les 5 minutes sur M5. De nombreux indicateurs peuvent être traités comme des filtres linéaires. C'est exactement le type d'indicateurs dont il est question dans le présent article. 

Maintenant, quand nous avons découvert que nous avions affaire à des filtres numériques, examinons la théorie afin de définir quels paramètres doivent être comparés.


1. Fréquences et Périodes

Tout d'abord, je dois mentionner que toute courbe peut être représentée comme une somme d'ondes sinusoïdales.

La période de vibration est l'intervalle de temps entre deux passages successifs d'un corps via la même position et dans la même direction. Cette valeur est réciproque à la fréquence.

Cette définition peut être plus facilement comprise en utilisant une onde sinusoïdale. Considérons une période égale à 10 comptes. Nous allons effectuer le calcul en barres pour plus de simplicité.

Fig. 1 

 Fig. 1. Exemple de signal périodique

Comme nous pouvons le voir, la ligne complète le cycle entier en 10 points, tandis que la onzième barre est le premier point du nouveau cycle.

Quelle est la fréquence de l'onde sinusoïdale ? La définition stipule que la période est une valeur réciproque de la fréquence. Ensuite, si la période est égale à 10 (barres), la fréquence sera 1/10=0.1 (1/barre).

En physique, les périodes (T) sont mesurées en secondes (s), tandis que les fréquences (f) - en Hertz (Hz). Si nous avons affaire à un laps de temps en minutes, alors T=60*10=600 secondes, tandis que f=1/Т=1/600=0.001667 Hz. Les Herz et secondes sont principalement utilisés dans les filtres analogiques. Dans les versions numériques, les comptes sont généralement utilisés (de la même manière que nous utilisions les barres). Si nécessaire, elles sont multipliées par le nombre de secondes nécessaire.

Vous vous demandez peut-être ce que cela a à voir avec les ondes sinusoïdales ? Les ondes sinusoïdales sont nécessaires pour expliquer la signification physique des filtres et le déplacement vers les fréquences, car ce concept est utilisé dans les travaux appropriés. Maintenant, prenons 7 ondes sinusoïdales au lieu d'une, avec des périodes de 10 à 70 et un pas de 10 barres. Les barres dans la sous-fenêtre supérieure de la figure 2 servent de guide pour estimer visuellement le nombre de comptes.

Fig. 2 

 Fig. 2. Sept ondes sinusoïdales ayant la même amplitude avec des périodes de 10, 20, ... 70 barres.

L'échelle est assez grande mais il est toujours possible de se tromper. Et il est beaucoup plus facile de se confondre, si nous avons beaucoup plus d'ondes sinusoïdales.

La somme des ondes sinusoïdales est affichée ci-dessous :

Fig. 3  

Fig. 3. La somme des sept ondes sinusoïdales illustrées à la Fig. 2

Les fréquences sont représentées de la manière suivante :

 Fig. 4 

Fig. 4. Le spectre de la somme des ondes sinusoïdales (en fréquences)

7 comptes suffisent pour afficher 7 ondes sinusoïdales. Faites attention aux couleurs, elles correspondent à la figure précédente. Les ondes sinusoïdales lentes sont suivies d'ondes rapides. La fréquence la plus basse possible est 0 (composante constante), tandis que la plus élevée est 0,5 (1/barre). Le cas sera l'inverse pour les périodes.

 Fig. 5

 Fig. 5. Le spectre de la somme des ondes sinusoïdales (en périodes)

On se souvient que la fréquence est égale à 1/période. Par conséquent, la période doit être comprise entre 2 et l'infini. Pourquoi 0,5 et 2 ? Une onde sinusoïdale peut être décrite par au moins deux comptes (voirNyquist–Shannon sampling théorème). Pour restaurer le signal analogique (continu), nous avons besoin de deux comptes ou plus par onde sinusoïdale (0,5 est reçu de 1/2).

Considérons le tableau suivant pour éviter toute confusion avec les périodes et les fréquences :

La période
  
 100     50
   16
  10
   4
   2
La fréquence
0
 0.01 
 0.02 
0.0625
  0.1 
 0.25 
  0.5 

 

Nous avons examiné les concepts de période et de fréquence, car ce sont les choses de base. Toutes les informations complémentaires sont associées à ces termes.

 

2. Filtres numériques

Nous sommes donc enfin prêts à discuter des filtres. Supposons que nous devons supprimer les ondes sinusoïdales ayant une période inférieure à 50.

Fig. 6 

 Fig. 6. Composantes lentes (basse fréquence) de la somme des ondes sinusoïdales (périodes de 50, 60 et 70 barres)

Tout est relativement facile lorsque nous connaissons les composants initiaux. Mais et si nous ne connaissions que la somme ? Dans ce cas, nous avons besoin d'un filtre passe-bas (LPF) avec une fréquence de coupure de 1/45 (1/barre).

Le résultat de la filtration ressemblera à ceci :

Fig. 7 

 Fig. 7. Résultat de la filtration de la somme des ondes sinusoïdales (ligne bleue) à l'aide du LPF

Maintenant, laissons seulement les épouses sinusoïdales ayant les périodes de 10, 20 et 30. Pour ce faire, il faut utiliser un filtre passe-haut (HPF) avec une fréquence de coupure de 1/35 (1/barre). 

Fig. 8 

 Fig. 8. Composantes haute fréquence de la somme des ondes sinusoïdales (périodes de 10, 20 et 30 barres)

Fig. 9 

Fig. 9. Résultat de la filtration somme des ondes sinusoïdales (ligne bleue) en utilisant HPF

Pour sortir des périodes de 30, 40 et 50, il faut un filtre de bande passante (BF) avec des fréquences de coupure de 1/25 et 1/55 (1/barre). 

Fig. 10 

 Fig. 10. Lignes sinusoïdales ayant des périodes de 30, 40 et 50 barres

 

Fig. 11 

Fig. 11. Résultat de la filtration somme de la bande passante des ondes sinusoïdales (30-50 barres)

Si nous voulons supprimer les périodes de 30, 40 et 50, nous avons besoin d'un filtre coupe-bande (réjection) avec les mêmes fréquences de coupure 1/25 et 1/55 (1/barre). 

Fig. 12 

Fig. 12. Ondes sinusoïdales avec les périodes de 10, 20, 60 et 70 barres

 

Fig. 13 

Fig. 13. Le résultat du fonctionnement du filtre de réjection (30-50 barres) en fonction de la somme des ondes sinusoïdales

Résumons les résultats intermédiaires dans l'image ci-dessous : 

Fig. 14
 

Fig. 14. Paramètres de fréquence des filtres idéaux : fréquences inférieures (LPF), fréquences supérieures (HPF), bande passante (BF) et réjection (RF)

Les filtres examinés ci-dessus sont idéalisés. La réalité est bien plus différente.

 Fig. 15 

Fig. 15. Bande de transition dans les filtres

Il existe une bande de transition entre les bandes d'acceptation et d'atténuation. Sa pente se mesure en dB/octave ou dB/décade. Octave est un segment entre la valeur aléatoire de fréquence et sa valeur double. La décennie est un segment entre la valeur aléatoire de la fréquence et sa valeur décuplée. Formellement, la bande de transition se situe entre la fréquence de coupure et la bande d'atténuation. Pour l'avenir, je dois dire que la fréquence de coupure par le spectre est le plus souvent définie par le niveau de 3 dB.

Le rejet hors bande est la suppression des fréquences dans la bande d'atténuation mesurée en décibels.

Les battements sont détectés dans la bande d'acceptation. Comme il s'agit de vrais filtres, c'est-à-dire de distorsions au niveau de la bande d'acceptation, certaines fréquences sont supérieures par leur amplitude, tandis que d'autres sont inférieures. La valeur est mesurée en décibels.

Le tableau ci-dessous peut vous aider à rendre la valeur en dB :

dB
Rapport d'amplitude
0.5    
1.06
1
1.12
3
1.41
6 2
10
3.16
20 10
30 31.6
40
100
60  1000

 

Par exemple, si nous voulons recevoir le résultat pour 60 dB, nous pouvons trouver les valeurs pour 20 et 40 dB et les multiplier.

Maintenant que nous connaissons les paramètres de base du filtre, passons à la partie pratique de l'article.


3. Recherche du noyau (Kernel)

On peut dire que le filtre numérique est complètement décrit par sa réponse impulsionnelle (Kernel). La réponse impulsionnelle est la réponse d'un filtre à une seule impulsion. Les filtres peuvent être de type IIR (réponse impulsionnelle infinie, par exemple, Exponential Moving Average, EMA) et FIR (réponse impulsionnelle finie, par exemple, Simple Moving Average, SMA). 

Maintenant, nous pouvons concentrer notre attention sur MetaEditor. Tout d'abord, créons une seule impulsion. Ce sera un indicateur très simple qui n'affichera qu'un seul compte égal à un. Dans MetaEditor, cliquez sur New, sélectionnez "Custom Indicator" et cliquez sur Next :

Fig. 16
 

Fig. 16. Création d'un indicateur personnalisé dans le MQL5 Wizard

Spécifiez "Impulse" comme nom :

Fig. 17
 

Fig. 17. Propriétés générales de l'indicateur

Sélectionnez le gestionnaire d'événements :

Fig. 18
 

Fig. 18. Les gestionnaires d'événements de l'indicateur

Maintenant, nous devons ajouter la ligne d'indicateur et l'afficher dans une fenêtre séparée. Tout est prêt.

 Fig. 19

 Fig. 19 Propriétés de dessin de l'indicateur

Le code de l'indicateur se présente comme suit :

//+------------------------------------------------------------------+
//|                                                      Impulse.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters

//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Label1Buffer,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
              const int prev_calculated,
              const int begin,
              const double &price[])
  {
//---
   ArrayInitialize(Label1Buffer,0.0);
   Label1Buffer[1023]=1.;
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Ajoutez ce qui suit à la fonction OnInit() :

ArraySetAsSeries(Label1Buffer,true);

pour que l'indexation se fasse à partir de la fin du tableau.

Dans OnCalculate:

ArrayInitialize(Label1Buffer,0.0);
Label1Buffer[1023]=1.;

Mettons à zéro toutes les valeurs et ajoutons 1 à 1023e cellule du tableau de l'indicateur.

Compilez (F7) et obtenez le résultat suivant : 

Fig. 20 

 Fig. 20 Indicateur d'impulsion

Maintenant, si nous appliquons un indicateur, nous pouvons voir sa réponse impulsionnelle jusqu'à 1024 comptes (voir Exemples).

Bien sûr, il est bon de voir le noyau (kernel) du filtre, mais plus de données ne peuvent être obtenues qu'à partir de la représentation du domaine fréquentiel. Pour ce faire, nous devons créer un analyseur de spectre ou utiliser une solution toute faite sans trop d'effort. Sélectionnons la deuxième option et utilisons l'indicateur SpecAnalyzer décrit dans l'article "Création d’un analyseur de spectre".

L'indicateur est affiché ci-dessous :

Fig. 21 

Fig. 21. SpecAnalyzer

Quelques travaux préparatoires sont nécessaires avant de l'utiliser. Toutes les étapes nécessaires sont décrites ci-dessous.


4. Adaptation pour l’analyseur de spectre

Le bouton "External Data" (données externes) permet d'utiliser les données de l'indicateur SAInpData.

L'original contient le tableau représentant le noyau du filtre. Nous allons refaire le fichier, afin qu'il soit possible de passer n'importe quel indicateur graphique à l'analyseur de spectre. Les modes automatique et manuel sont à prévoir dans l'indicateur modifié. En mode automatique, le premier indicateur cartographique trouvé est utilisé. En mode manuel, les utilisateurs peuvent définir une sous-fenêtre et un index d'indicateur dans la liste. Dans ce cas, l'indicateur d'impulsion doit être ajouté manuellement au graphique. Après cela, l'indicateur nécessaire est appliqué pour recevoir le noyau.

Commençons. Nous devrions créer un nouvel indicateur en suivant le même algorithme, comme avec Impulse. Ajoutez les paramètres d'entrée :

input bool Automatic=true; // Autosearch
input int  Window=0;       // Subwindow index
input int  Indicator=0;    // Indicator index

Si Automatic=true, le mode automatique est utilisé, tandis que les autres paramètres d'entrée sont ignorés. Si Automatique=false, le mode manuel avec sous-fenêtre et index indicateur est utilisé.

Ensuite, nous devons ajouter des variables de type entier au niveau global pour stocker les poignées.

int Impulse=0; // single impulse's handle
int Handle=0;  // required indicator's handle
int Kernel=0;  // filter kernel's handle

La poignée de l'indicateur d'impulsion doit être stockée dans l'Impulse. La poignée de l'indicateur, dont on veut visualiser le noyau dans l'analyseur de spectre, est à stocker dans la poignée. La poignée de l'indicateur cible, qui est construit sur la base de l'indicateur Impulse, ou, en d'autres termes, le noyau de l'indicateur cible doit être stocké dans Kernel.

La fonctionOnInit() :

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,DataBuffer,INDICATOR_DATA);

   Impulse=iCustom(NULL,0,"SpecAnalyzer\\Impulse");//get the single impulse handle
   if(Impulse==INVALID_HANDLE)
     {
      Alert("Impulse initialization failed"); 
       return(INIT_FAILED);
     }
//---
   return(0);
  }

Étant donné que l'indicateur d'impulsion n'est pas modifié pendant le fonctionnement du programme, la poignée de l'indicateur doit être reçu dans la fonction OnInit(). De plus, l'erreur de réception du traitement doit être vérifiée. En cas d'échec, le message "Échec de l'initialisation de l'impulsion" s'affiche et le fonctionnement de l'indicateur est interrompu avec la touche INIT_FAILED.

La fonction OnDeinit() :

void OnDeinit(const int reason)
  {
//--- delete the indicators
   IndicatorRelease(Impulse);
   IndicatorRelease(Handle);
   IndicatorRelease(Kernel);
  }

Les indicateurs utilisés sont supprimés dans la fonction OnDeinit().

La fonction OnCalculate() :

static bool Flag=false;        //error flag
if(Flag) return(rates_total); //exit in case of the flag

La variable statique flag est ajoutée au début de la fonction. Si des erreurs se produisent pendant l'exécution du programme, le Flag est égal à true et toutes les itérations ultérieures des fonctions OnCalculate() sont interrompues dès le début.

Ci-dessous se trouve le bloc de code associé au mode manuel :

   string Name;  //short name of the required indicator
   if(!Automatic)//in case of the manual mode
     {
      if(ChartIndicatorsTotal(0,Window)>0)//if an indicator is present
        {
         Name=ChartIndicatorName(0,Window,Indicator);//search for its name
         Handle=ChartIndicatorGet(0,Window,Name);//search for the handle
        }
      else//otherwise
        {
         Alert("No indicator");
         Flag=true;
         return(rates_total);
        }

      if(Handle==INVALID_HANDLE)//in case of a handle receiving error
        {
         Alert("No indicator");
         Flag=true;
         return(rates_total);
        }

      CopyBuffer(Handle,0,0,1024,DataBuffer);//display the kernel on the chart
      return(rates_total);
     }

Si Automatique=false, le mode manuel est lancé. La présence de l'indicateur est vérifiée. En cas de succès, nous commençons à rechercher un nom et un descripteur, à vérifier le descripteur pour les erreurs, à copier les données dans le tampon de l'indicateur. En cas d'échec, le message "Pas d'indicateur" s'affiche, le Flag passe à true, l'exécution de la fonction OnCalculate() est interrompue.

Le blocage du mode automatique est bien plus intéressant. Elle consiste à rechercher un indicateur sur le graphique et à créer un noyau.

Considérons donc la recherche d'un indicateur. L'objectif principal est de recevoir une poignée.

   if(ChartIndicatorsTotal(0,0)>0)//if the indicator is in the main window
     {
      Name=ChartIndicatorName(0,0,0);//search for its name
      if(Name!="SpecAnalyzer")//if it is not SpecAnalyzer
         Handle=ChartIndicatorGet(0,0,Name);//look for a handle
      else
        {
         Alert("Indicator not found");
         Flag=true;
         return(rates_total);
        }
     }
   else//otherwise
   if(ChartIndicatorsTotal(0,1)>0)//if the indicator is in the first subwindow
     {
      Name=ChartIndicatorName(0,1,0);//search for its name
      if(Name!="SAInpData")//if it is not SAInpData
         Handle=ChartIndicatorGet(0,1,Name);//look for a handle
      else//otherwise
        {
         Alert("Indicator not found");
         Flag=true;
         return(rates_total);
        }
     }

   if(Handle==INVALID_HANDLE)//in case of a handle receiving error
     {
      Alert("No indicator");
      Flag=true;
      return(rates_total);
     }

Tout d'abord, nous recherchons un indicateur dans la sous-fenêtre principale du graphique et nous nous assurons qu'il ne s'agit pas de SpecAnalyzer. Si aucun indicateur n'est trouvé dans la fenêtre principale, nous le recherchons dans la sous-fenêtre suivante (étant donné qu'il peut y avoir SAInpData ici). Toutes les autres actions sont similaires au mode manuel.

Créons un indicateur. Nous devrions recevoir les paramètres de l'indicateur obtenu et créer un indicateur similaire basé sur Impulse :

   ENUM_INDICATOR indicator_type;//obtained indicator's type
   MqlParam parameters[];      //parameters
   int parameters_cnt=0;      //number of parameters

//--- receive the indicator's type, parameter values and amount
   parameters_cnt=IndicatorParameters(Handle,indicator_type,parameters);
//--- define that a single impulse is to be sent to the indicator's input
   parameters[parameters_cnt-1].integer_value=Impulse;
//--- receive the indicator's handle from the single impulse - filter's kernel
   Kernel=IndicatorCreate(NULL,0,indicator_type,parameters_cnt,parameters);

   if(Kernel==INVALID_HANDLE)//in case of a handle receiving error
     {
      Alert("Kernel initialization failed");
      Flag=true;
      return(rates_total);
     }

   CopyBuffer(Kernel,0,0,1024,DataBuffer);//display the kernel on the chart

indicateur_type - la variable du type spécial énuméré ENUM_INDICATOR. La variable est conçue pour recevoir le type d'indicateur.

parameters[] - le tableau de type MqlParam, structure spéciale pour stocker et transférer les paramètres de l'indicateur.

La fonction IndicatorParameters permet de recevoir des données sur l'indicateur graphique. Ensuite, nous implémentons de légères modifications dans le tableau des paramètres. La poignée de l'indicateur d'impulsion est incluse dans la dernière cellule où le nom de la série temporelle (fermé, bas, poignée, etc.) est stocké dans le champ integer_value. Ensuite, nous utilisons la fonction IndicatorCreate pour créer un nouvel indicateur qui est également un noyau. Maintenant, nous devons vérifier la poignée et afficher le noyau sur le graphique.

L'indicateur SpecAnalyzer a également été légèrement modifié. Les paramètres d'entrée suivants ont été ajoutés :

input bool Automatic=true; //Autosearch
input int Window=0;        //Subwindow index
input int Indicator=0;    //Indicator index

L'appel SAInpData a également été modifié :

ExtHandle=iCustom(NULL,0,"SpecAnalyzer\\SAInpData",Automatoc,Window,Indicator);

SAInpData peut être utilisé seul pour visualiser la réponse impulsionnelle.

 

5. Exemples

Pour que les choses fonctionnent, collez le dossier SpecAnalyzer dans MetaTrader 5\MQL5\Indicators. Lancez MetaTrader 5, ouvrez un nouveau graphique EURUSD :

Fig. 22

Fig. 22. Ouverture d'un nouveau graphique EURUSD

Maintenant, nous appliquons l'indicateur nécessaire, par exemple, MA(16) :

Fig. 23

Fig. 23. Application de l'indicateur de moyenne mobile au graphique EURUSD

Lancez SpecAnalyzer :

Fig. 24

Fig. 24. Lancement de SpecAnalyzer

La fenêtre Paramètres apparaît :

Fig. 25

Fig. 25. Paramètres de l'indicateur SpecAnalyzer

Pour le mode automatique, cliquez simplement sur OK. En mode manuel, true doit être remplacé par false et l'emplacement d'un indicateur nécessaire doit être spécifié.

Nous avons donc cliqué sur OK. Cliquez sur "External Data" dans la nouvelle fenêtre de l'analyseur de spectre :

Fig. 26

Fig. 26. Sélection des données d'entrée pour l'indicateur SpecAnalyzer

Considérons maintenant de travailler en mode manuel. Tout d'abord, nous devons ajouter l'indicateur d'impulsion au graphique :

Fig. 27

Fig. 27. Ajout de l'indicateur d'impulsion

Ensuite, nous devons utiliser cet indicateur pour générer l'indicateur cible. Pour ce faire, nous devons faire glisser l'indicateur à la souris vers la fenêtre Impulse et sélectionner les données de l'indicateur précédent dans le champ "Appliquer à" des paramètres :

Fig. 28

Fig. 28. Génération d'un indicateur de moyenne mobile à l'aide des données de l'indicateur d'impulsion

Le résultat suivant doit être obtenu :

Fig. 29 

Fig. 29. Résultat du calcul de l'indicateur de moyenne mobile sur une seule impulsion

Maintenant, faites un clic droit pour afficher la liste des indicateurs :

Fig. 30

Fig. 30. Indicateurs dans la liste

Notre indicateur se situe dans la sous-fenêtre 1 et porte le numéro de série 1 (n'oubliez pas que l'indexation part de zéro, pas un). Maintenant, lançons SpecAnalyzer. Définir false, 1, 1. Cliquez sur "External Data".

Les propriétés de l'indicateur peuvent être modifiées à la volée. Essayez de modifier la période à l'aide de la liste des indicateurs et voyez comment l'analyseur de spectre réagit. 

Avant de passer aux exemples, il est nécessaire de mentionner une caractéristique de l'indicateur SpecAnalyzer. Les lectures sur son échelle ne sont pas des périodes mais des marques de grille de fréquence. L'analyseur de spectre fonctionne avec le noyau ayant une longueur allant jusqu'à 1024 lectures. Cela signifie que le pas de la fréquence de grille est égal à 1/1024=0,0009765625. Ainsi, la valeur de 128 sur l'échelle correspond à la fréquence de 0,125 ou à la période de 8.

Echelle
Période
16   64
32   32
64   16
128
8
256
4
384
2.67
512
2

SMA (16)

 Fig. 31

Fig. 31. Réponse impulsionnelle de l'indicateur de moyenne mobile simple (filtre FIR)

Fig. 32 

Fig. 32. Réponse en fréquence de l'indicateur de moyenne mobile simple

Nous pouvons voir qu'il s'agit d'un filtre passe-bas, car les basses fréquences prévalent. La suppression dans la bande d'atténuation est médiocre.

  

EMA (16)

Fig. 33

Fig. 33. Réponse impulsionnelle de l'indicateur de moyenne mobile exponentielle (filtre IIR)

Fig. 34 

Fig. 34. Réponse en fréquence de l'indicateur de moyenne mobile exponentielle

L'indicateur de moyenne mobile exponentielle est également un filtre passe-bas. La ligne est assez lisse mais, contrairement à l'indicateur précédent, la bande de transition est plus large. La suppression est approximativement la même.

Examinons maintenant les résultats du filtre numérique universel.

Filtre passe bas

Fig. 35

Fig. 35. La réponse impulsionnelle (noyau) du filtre passe-bas

Fig. 36

Fig. 36. La réponse en fréquence du filtre passe-bas

Filtre passe-haut

 Fig. 37 

Fig. 37. La réponse impulsionnelle (noyau) du filtre passe-haut

 

 Fig. 38 

Fig. 38. La réponse en fréquence du filtre passe-haut

 

Filtre passe-bande

 Fig. 39 

Fig. 39. La réponse impulsionnelle (noyau) du filtre passe-bande

 

Fig. 40 

  40. La réponse en fréquence du filtre passe-bande


Conclusion

En conclusion, il convient de noter que les paramètres des filtres sont fortement interconnectés. Améliorer certains d'entre eux implique la détérioration des autres. Par conséquent, les paramètres doivent être sélectionnés en fonction de la tâche à accomplir.

Par exemple, si vous souhaitez une suppression accrue des fréquences dans la bande d'atténuation, vous devez sacrifier la pente de la courbe descendante. Si les deux paramètres doivent être bons, alors nous devons augmenter la longueur du noyau, ce qui à son tour aura un impact sur l'écart entre l'indicateur et le prix ou augmentera les distorsions dans la bande d'acceptation.


Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/736

Fichiers joints |
specanalyzer.zip (9.68 KB)
Les bases de la programmation MQL5 : Listes Les bases de la programmation MQL5 : Listes
La nouvelle version du langage de programmation pour le développement de stratégies de trading, MQL [MQL5], offre des fonctionnalités plus puissantes et efficaces par rapport à la version précédente [MQL4]. L'avantage réside essentiellement dans les fonctionnalités de programmation orientée objet. Cet article examine la possibilité d'utiliser des types de données personnalisés complexes, tels que des nœuds et des listes. Il fournit également un exemple d'utilisation des listes dans la programmation pratique en MQL5.
Élevez vos systèmes de trading linéaires au rang de puissance Élevez vos systèmes de trading linéaires au rang de puissance
L'article d'aujourd'hui montre aux programmeurs MQL5 intermédiaires comment ils peuvent tirer plus de bénéfice de leurs systèmes de trading linéaire (Fixed Lot) en implémentant facilement la technique dite de l'exponentiation. En effet, la croissance de la courbe d'équité qui en résulte est alors géométrique, ou exponentielle, prenant la forme d'une parabole. Plus précisément, nous mettrons en œuvre une variante pratique MQL5 du dimensionnement de la position fractionnée fixe développée par Ralph Vince.
Le MQL5 Cookbook : Développement d'un indicateur multi-symboles pour analyser la divergence des prix Le MQL5 Cookbook : Développement d'un indicateur multi-symboles pour analyser la divergence des prix
Dans cet article, nous examinerons le développement d'un indicateur multi-symboles pour analyser la divergence des prix dans une période de temps spécifiée. Les sujets de base ont déjà été abordés dans l'article précédent sur la programmation d'indicateurs multi-devises «livre de recettes MQL5k: Développement d'un indicateur de volatilité multi-symboles dans MQL5». Cette fois, nous nous attarderons donc uniquement sur les nouvelles fonctionnalités et fonctions qui ont été radicalement modifiées. Si vous débutez dans la programmation d'indicateurs multi-devises, je vous recommande de lire dans un premier temps l'article précédent.
Émerveillez vos clients MQL5 avec un cocktail de technologies utilisables ! Émerveillez vos clients MQL5 avec un cocktail de technologies utilisables !
MQL5 fournit aux programmeurs un ensemble très complet de fonctions et d'API orientées objet grâce auxquelles ils peuvent faire tout ce qu'ils veulent dans l'environnement MetaTrader. Cependant, la technologie Web est un outil extrêmement polyvalent de nos jours qui peut venir à la rescousse dans certaines situations lorsque vous devez faire quelque chose de très spécifique, voulez émerveiller vos clients avec quelque chose de différent ou tout simplement vous n'avez pas assez de temps pour maîtriser une partie spécifique de Bibliothèque standard MT5. L'exercice d'aujourd'hui vous présente un exemple pratique sur la façon dont vous pouvez gérer votre temps de développement tout en créant un cocktail technologique incroyable.