Fonctions utiles de KimIV - page 57

 

La fonction ArrayInsertDouble()

Insère un élément d'un tableau avec l'index donné. Renvoie le nombre d'éléments (taille) du nouveau tableau. L'insertion s'effectue comme suit. Tout d'abord, la taille du tableau est augmentée de un. Ensuite, tous les éléments dont l'indice est supérieur ou égal à celui qui doit être inséré sont déplacés à la fin du tableau, un par un, pour faire de la place à celui qui doit être inséré. Enfin, la valeur est écrite dans la cellule requise. La fonction ArrayInsertDouble() prend les paramètres suivants :

  • m - Un tableau d'éléments de type double.
  • e - Valeur de l'élément du tableau à insérer.
  • i - Index de l'élément du tableau à insérer. Si la valeur de l'index est inférieure à zéro ou supérieure ou égale à la taille du tableau, l'élément sera ajouté à la fin du tableau. La valeur par défaut est -1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет вставку элемента массива с заданным индексом.        |
//|             Возвращает размер нового массива.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов типа double                                        |
//|    e - значение элемента                                                   |
//|    i - индекс элемента                  (-1 - добавить в конец массива)    |
//+----------------------------------------------------------------------------+
int ArrayInsertDouble(double& m[], double e, int i=-1) {
  int j, k=ArraySize( m);

  ArrayResize( m, k+1);
  if ( i>=0 && i< k) {
    for ( j= k; j> i; j--) m[ j]= m[ j-1];
    m[ i]= e;
  } else m[ k]= e;

  return( k+1);
}

SZY. Veuillez trouver ci-joint des scripts pour tester les fonctions ArrayInsertDouble(), ArrayInsertInt(), ArrayInsertString().

ZZZY. J'ai mis à jour la bibliothèque b-Array sur mon site.

 

Igor, puisque nous parlons de tableaux, pouvons-nous revenir à mon ancienne demande, concernant le tri des tableaux ('Useful functions from KimIV'). Ce qui a été fait plus tôt est un peu faux, désolé pour le TOR indéfini.

J'ai besoin de trier un tableau bidimensionnel par une colonne (ligne) donnée, de manière analogue à l'opération effectuée dans EXCEL. Cette procédure est nécessaire pour utiliser la statistique de Spearman "coefficient de corrélation de rang de Spearman", dans certaines variantes de l'analyse des matrices de corrélation monnaies (portefeuilles).

 

La fonction BubbleSort2().

Cette fonction fait sauter les éléments d'un tableau bidimensionnel dans une colonne arbitraire. Vous pouvez également spécifier la direction du tri. La fonction BubbleSort2() prend les paramètres suivants :

  • a - Tableau bidimensionnel d'éléments. Paramètre obligatoire.
  • r - Numéro (index) de la colonne de tri (colonne). La valeur par défaut est 0 - la première colonne (colonne avec un index zéro).
  • m - Sens du tri. Valeurs valides : MODE_ASCEND - ordre ascendant, MODE_DESCEND - ordre descendant. La valeur par défaut est MODE_ASCEND.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 04.11.2008                                                     |
//|  Описание : Выполняет пузырьковую сортировку элементов двумерного массива. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    a - массив элементов                                                    |
//|    r - колонка сортировки          (     0       - первая (с индексом 0))  |
//|    m - направление сортировки      (MODE_ASCEND  - по возрастанию,         |
//|                                     MODE_DESCEND - по убыванию)            |
//+----------------------------------------------------------------------------+
void BubbleSort2(double& a[][], int r=0, int m= MODE_ASCEND) {
  double t;
  int    e, i, j;
  int    k=ArrayRange( a, 1);      // Количество колонок
  int    n=ArrayRange( a, 0);      // Количество строк

  if ( r<0) r=0;
  if ( r> k) r= k;

  for ( i= n-1; i>0; i--) {
    for ( j=0; j< i; j++) {
      if ( m== MODE_ASCEND) {
        // по возрастанию
        if ( a[ j][ r]> a[ j+1][ r]) {
          for ( e=0; e< k; e++) {
            t= a[ j][ e];
            a[ j][ e]= a[ j+1][ e];
            a[ j+1][ e]= t;
          }
        }
      } else {
        // по убыванию
        if ( a[ j][ r]< a[ j+1][ r]) {
          for ( e=0; e< k; e++) {
            t= a[ j][ e];
            a[ j][ e]= a[ j+1][ e];
            a[ j+1][ e]= t;
          }
        }
      }
    }
  }
}
Vous trouverez ci-joint un script pour tester la fonction BubbleSort2().
Dossiers :
 

Fonction GetTypeLastDeleted().

Cette fonction renvoie le type du dernier ordre supprimé, ou -1. Il peut y avoir des situations où nous devons lier la logique d'opération de l'EA au type d'un ordre qui vient d'être supprimé. Par exemple, si vous venez de supprimer BuyStop, vous devriez le faire, mais si BuyLimit, vous devriez faire autre chose, etc. La fonction GetTypeLastDeleted() accepte les paramètres facultatifs suivants :

  • sy - Nom de l'instrument. "" - un caractère quelconque, NULL - le caractère actuel. La valeur par défaut est "".
  • mn - identifiant de la commande de l'utilisateur (MagicNumber). Valeur par défaut -1 - n'importe quel Magic.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.10.2008                                                     |
//|  Описание : Возвращает тип последнего удалённого ордера или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastDeleted(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()== sy || sy=="") && ( mn<0 || OrderMagicNumber()== mn)) {
        if (OrderType()>1 && OrderType()<6 && t<OrderCloseTime()) {
          t=OrderCloseTime();
          r=OrderType();
        }
      }
    }
  }
  return( r);
}
 
beginner писал(а) >>

Oui, maintenant celui-là.

#include "b-KimIV.mqh" // Bibliothèque de fonctions supplémentaires

Bonjour Oleg !

Pour une compilation sans erreur de la bibliothèque b-Positions. mqh, vous avez besoin des fonctions qui sont déjà dans cette branche :

  • GetNameOP() - Renvoie le nom de l'opération commerciale.
  • GetNameTF() - Renvoie le nom de l'intervalle de temps.
  • IIFc() - Renvoie une des deux valeurs en fonction de la condition.
  • Message() - Sortie du message en commentaire et dans le journal.

Vous pouvez donc faire ce qui suit :

  1. Créez un fichier vide nommé b-kimiv.mqh dans le même dossier, où vous avez b-Positions.mqh
  2. Insérez-y les fonctions ci-dessus et compilez b-Positions.mqh.

>> Bonne chance !

 

La fonction iBarLargest().

Cette fonction renvoie l'indice de la plus grande barre ou -1. La taille de la barre est mesurée par la fonction de l'une des deux manières suivantes, déterminée par le paramètre d'entrée ty - type d'éléments de recherche. Soit juste la taille du corps, soit avec les ombres. La fonction iBarLargest() accepte les paramètres facultatifs suivants :

  • sy - Nom de l'outil. "" ou NULL - le symbole actuel. La valeur par défaut est "".
  • tf - Période de temps. La valeur par défaut est 0 - l'horizon temporel actuel.
  • ty - Type d'éléments de recherche. Valeurs valides - 0 - High-Low, 1 - abs(Open-Close).
  • co - Nombre d'éléments de la série chronologique. Valeur par défaut - 0 - tous les éléments.
  • in - Index de la barre initiale. Valeur par défaut - 0 - barre actuelle.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Возвращает индекс наибольшего бара или -1.                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    ty - тип элементов поиска       (          0 - H-L, 1 - O-C)            |
//|    co - число элементов таймсерии  (          0 - все элементы)            |
//|    in - индекс начального бара     (          0 - текущий бар)             |
//+----------------------------------------------------------------------------+
int iBarLargest(string sy="", int tf=0, int ty=0, int co=0, int in=0) {
  if ( sy=="" || sy=="0") sy=Symbol();
  if ( tf<=0) tf=Period();
  if ( in< 0) in=0;
  if ( co<=0) co=iBars( sy, tf)- in;

  double r, rb=0;       // размер бара
  int    i, nb=-1;      // счётчик и номер бара

  for ( i= co+ in; i>= in; i--) {
    if ( ty>0) r=MathAbs(iOpen( sy, tf, i)-iClose( sy, tf, i));
    else r=iHigh( sy, tf, i)-iLow( sy, tf, i);
    if ( rb< r) {
      rb= r;
      nb= i;
    }
  }

  return( nb);
}
ZS. Vous trouverez ci-joint un script pour tester la fonction iBarLargest().
Dossiers :
 

La fonction iBarOfDayCalc().

Cette fonction renvoie le numéro de barre calculé depuis le début de la journée. Les barres sont numérotées à partir de un, c'est-à-dire que la barre ayant le temps d'ouverture le plus court dans une journée donnée sera numéro un, la barre suivante sera numéro deux, etc. Cette fonction est utile pour optimiser les temps d'entrée/sortie. Si quelqu'un est intéressé par les détails, il peut poser des questions. Je ferai de mon mieux pour y répondre. La fonction iBarOfDayCalc() prend les paramètres optionnels suivants :

  • tf - Période de temps. La valeur par défaut est 0 - l'horizon temporel actuel.
  • dt - Date et heure d'ouverture de la barre. La valeur par défaut est 0 - heure actuelle.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает расчётный номер бара от начала суток.               |
//|           : Нумерация баров начинается с 1 (единица).                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    tf - таймфрейм                       (0 - текущий таймфрейм)            |
//|    dt - дата и время открытия бара      (0 - текущее время)                |
//+----------------------------------------------------------------------------+
int iBarOfDayCalc(int tf=0, datetime dt=0) {
  if ( tf<=0) tf=Period();
  if ( dt<=0) dt=TimeCurrent();
  if ( tf>PERIOD_D1) {
    Print("iBarOfDayCalc(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }
  double ms=MathMod( dt/60, 1440);      // количество минут от начала суток
  int    bd=MathFloor( ms/ tf)+1;        // номер бара от начала суток

  return( bd);
}

SZY. Vous trouverez ci-joint un script pour tester la fonction iBarOfDayCalc(). L'illustration ci-dessous montre comment utiliser le script.

Dossiers :
 

Fonction iBarOfDayReal().

Cette fonction renvoie le numéro de barre actuel depuis le début de la journée. Les barres sont numérotées de un en un, c'est-à-dire que la barre ayant le temps d'ouverture le plus court dans une journée donnée aura le numéro un, la barre suivante aura le numéro deux, etc. Je n'ai pas encore trouvé d'utilisation pratique de cette fonction. Mais je l'ai écrit pour l'avoir :-) avec la fonction iBarOfDayCalc(). La fonction iBarOfDayReal() accepte les paramètres optionnels suivants :

  • sy - Nom de l'instrument de négociation. NULL ou "" - symbole actuel. La valeur par défaut est "".
  • tf - Période de temps. Valeur par défaut - 0 - période actuelle.
  • dt - Date et heure d'ouverture du bar. Valeur par défaut - 0 - heure actuelle.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if ( sy=="" || sy=="0") sy=Symbol();
  if ( tf<=0) tf=Period();
  if ( dt<=0) dt=TimeCurrent();
  if ( tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay( dt);                       // текущий день месяца
  int nb=iBarShift( sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime( sy, tf, nb))== cd) {
    nb++;
    bd++;
  }

  return( bd);
}

SZY. Je joins un script pour tester la fonction iBarOfDayReal(). L'illustration ci-dessous montre comment utiliser le script.

Dossiers :
 
KimIV писал(а) >>

La fonction iBarOfDayReal().

Je n'ai pas encore trouvé d'application pratique pour cette fonction.

yyyy... :)

Je suis ici en tant qu'outil de formation, j'ai décidé d'écrire un script qui calcule la distance parcourue.

Si quelqu'un le sait, il existe un programme qui compte le nombre de kilomètres parcourus par la souris sur l'écran.

Ici, il s'agit d'additionner les barres d'ouverture/fermeture du jour (de la semaine, du mois ou de l'année) en cours, ou si vous voulez

d'une autre manière, comme un fil et une aiguille qui cousent un manteau de fourrure : Ouvert-fermé-fermé-fermé-fermé-fermé-fermé-fermé... au cours du graphique.

C'est la même chose, mais sur les hauts et les bas...

*

Le problème a commencé dès les premiers pas.

Comment filtrer les barres de la journée en cours dans le graphique...

Je vais essayer d'appliquer vos fonctions pour ce tâtonnement.

 

Igor. Bon après-midi.

Peut-être pouvez-vous dessiner une tâche simple pour vous : la tâche (pour moi) est la suivante :

La tâche est la suivante : déterminer à quelle valeur de prix la ligne de signal croisera la MACD, ou, en d'autres termes, l'histogramme MACD deviendra égal à zéro.

La solution de ce problème est nécessaire, par exemple, pour calculer un prix stop ou une limite d'ordre pour la prochaine barre dans les signaux d'un système de trading qui utilise cet indicateur,
.

qui montrera visuellement le niveau de prix auquel l'histogramme MACD croisera la ligne de zéro (c'est-à-dire le croisement d'une ligne sur la ligne de prix sur le graphique).

Il s'agit du pourcentage MACD calculé à l'aide de la formuleMACD= (FastEMA/SlowEMA - 1). Périodes 12, 26, Signal 9.

J'ai les codes pour Omega et Metostock, mais je ne trouve nulle part ailleurs comment les mettre en œuvre dans MT4.

Merci