Fonctions utiles de KimIV - page 107

 
143alex:

N'avez-vous pas (prêt et disposé à acheter)))) la même chose mais pour travailler avec excel ?

non, pas disponible... )))

 

La fonction GetPotentialLossInCurrency() renvoie la perte potentielle totale des positions ouvertes dans la devise de dépôt. Le calcul est effectué sur la base du prix d'ouverture de la position et du niveau de prix du StopLoss. Si le StopLoss n'est pas défini pour une position, cette fonction renvoie l'équité actuelle du compte de trading.

La fonction GetPotentialLossInCurrency() accepte les paramètres suivants :

  • sy - Nom de l'instrument. Si nous définissons ce paramètre, la fonction ne vérifiera que les positions de l'instrument spécifié. NULL signifie l'instrument actuel, tandis que "" (par défaut) signifie n'importe quel instrument.
  • op - Opération de commerce, type de poste. Valeurs valides : OP_BUY, OP_SELL ou -1. Valeur par défaut -1 - signifie une position quelconque.
  • mn - Identifiant de la position (MagicNumber). La valeur par défaut -1 signifie n'importe quel MagicNumber.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 17.02.2012                                                     |
//|  Описание : Возвращает суммарный потенциальный убыток                      |
//|             открытых позиций в валюте депозита.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetPotentialLossInCurrency(string sy="", int op=-1, int mn=-1) {
  double pl=0;
  double po, tv;                   // Пункт, спрэд и стоимость пункта
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if ((OrderType()==OP_BUY || OrderType()==OP_SELL) && (op<0 || OrderType()==op)) {
          if (OrderStopLoss()>0) {
            po=MarketInfo(OrderSymbol(), MODE_POINT);
            if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol()+". Точность расчётов не гарантируется!");
            else {
              tv=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
              if (OrderType()==OP_BUY) {
                pl+=(OrderOpenPrice()-OrderStopLoss())/po*OrderLots()*tv;
              }
              if (OrderType()==OP_SELL) {
                pl+=(OrderStopLoss()-OrderOpenPrice())/po*OrderLots()*tv;
              }
              pl+=OrderCommission()+OrderSwap();
            }
          } else {
            pl=AccountBalance();
            break;
          }
        }
      }
    }
  }
  return(pl);
}

Vous trouverez ci-joint un script permettant de tester la fonction GetPotentialLossInCurrency().

 

Bonjour Igor. Félicitations pour votre ensemble de fonctionnalités très utiles.

Je peux vous demander un peu d'aide... Je veux faire une sorte de casier partiel. Mais jusqu'à présent, je ne sais pas comment l'organiser. L'idée est la suivante :

Il y a 4 commandes - disons -200$ -175$ -150$ et -25$ et il y a 5+ commandes totalisant +400$.

Si 400 > -200+-175 mais inférieur à -200+-175+-150 alors fermez 5 ordres plus et moins -200 -175, soit 2 ordres avec une perte de plus ou moins.

cet exemple est trop grossier, bien sûr, mais je pense avoir saisi l'idée...

Le premier problème est que j'ai besoin de quelque chose pour les écrire. (Je ne comprends pas vraiment Array) ou trouver un autre moyen.

Le deuxième problème découle du premier. Supposons que j'ai los[x] avec des lots de 4 ordres différents... dois-je charger les lots ( los[x]) dans un module qui cherchera le tiket selon le prix ou dois-je ajouter 1 (los[price]) et 2 (los2[tiket]) tout en triant les lots?

Peut-être pouvez-vous m'indiquer un endroit où vous pouvez faire cela ou m'apprendre quelque chose que je ne sais pas faire =)

 

Il est probable que chaque trader commence tôt ou tard à calculer le nombre de pips restants avant de perdre son dépôt. Le calcul est simple : on prend l'argent, on le divise par le nombre de lots sur le marché, par la valeur du point et on obtient la réponse que l'on cherche. C'est exactement ce que fait ma nouvelle fonction ReserveDepositInPoint(), elle prend les paramètres suivants :

  • sy - Nom de l'instrument. Si vous définissez ce paramètre, la fonction vérifiera les positions de l'instrument spécifié uniquement. NULL signifie l'instrument actuel, tandis que "" (par défaut) signifie n'importe quel instrument.
  • op - Opération de commerce, type de poste. Valeurs valables : OP_BUY, OP_SELL ou -1. Valeur par défaut -1 - signifie une position quelconque.
  • mn - Identifiant de la position (MagicNumber). La valeur par défaut de -1 signifie n'importe quel MagicNumber.

La fonction ReserveDepositInPoint() traite correctement les positions opposées, à savoir qu'elle calcule la différence entre les lots de vente et d'achat et utilise exactement cette différence dans les calculs. Les calculs sont basés sur l'équité, c'est-à-dire qu'il est supposé que l'arrêt est de 100%. Les swaps, les taxes et les commissions ne sont pas pris en compte.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 29.02.2012                                                     |
//|  Описание : Возвращает запас депозита в пунктах.                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int ReserveDepositInPoint(string sy="", int op=-1, int mn=-1) {
  int    i, k=OrdersTotal();      // Номера позиций
  int    n, r;                    // Номер символа в массиве, запас депозита в пунктах
  double ol[], tv;                // Массив лотов, стоимость пункта
  string os[];                    // Массив символов

  if (sy=="0") sy=Symbol();
  ArrayResize(os, 0);
  ArrayResize(ol, 0);

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        n=ArraySearchString(os, OrderSymbol());
        if (n<0) {
          n=ArraySize(os);
          ArrayResize(os, n+1);
          ArrayResize(ol, n+1);
        }
        os[n]=OrderSymbol();
        if ((op<0 || OrderType()==op) && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
          if (OrderType()==OP_BUY ) ol[n]+=OrderLots();
          if (OrderType()==OP_SELL) ol[n]-=OrderLots();
        }
      }
    }
  }

  n=ArraySize(os);
  for (i=0; i<n; i++) {
    tv=MarketInfo(os[i], MODE_TICKVALUE);
    if (tv==0) Message("В обзоре рынка отсутствует символ "+os[i]+". Точность расчётов не гарантируется!");
    else {
      if (ol[i]!=0) {
        ol[i]=MathAbs(ol[i]);
        r+=AccountEquity()/tv/ol[i];
      }
    }
  }
  if (n>1) r/=n*n;

  return(r);
}

Ci-joint un Expert Advisor pour vérifier la fonction ReserveDepositInPoint().

Dossiers :
 

Fonction SetFibo().

Cette fonction définit les niveaux de Fibonacci de l'objet OBJ_FIBO sur le graphique courant.

  • cl - Tableau des couleurs de l'objet Niveaux Fibonacci. Paramètre obligatoire. Deux éléments. Le premier définit la couleur de l'objet, le second - la couleur des lignes des niveaux.
  • st - Tableau de styles d' objets niveaux Fibonacci. Paramètre requis. Deux éléments. Le premier définit le style de l'objet, le second - le style des lignes des niveaux.
  • wd - Tableau de largeurs d'objets niveaux Fibonacci. Paramètre requis. Deux éléments. Le premier définit la largeur de l'objet, le second - les largeurs des lignes des niveaux.
  • fl - Tableau des niveaux de Fibonacci. Paramètre requis.
  • nm - Nom de l'objet. Lorsque la valeur par défaut est passée - "", l'heure d'ouverture de la barre actuelle est utilisée comme nom.
  • t1 - Première coordonnée du temps de réglage de l'objet. Valeur par défaut - 0 - temps d'ouverture de la dixième mesure.
  • p1 - Première coordonnée de l'objet fixant le prix. Valeur par défaut - 0 - minimum de la dixième barre.
  • t2 - Deuxième coordonnée du temps de réglage de l'objet. Valeur par défaut - 0 - temps d'ouverture de la barre actuelle.
  • p2 - Deuxième coordonnée du prix de l'objet. Valeur par défaut - 0 - barre actuelle basse.
  • ry - Indicateur de la propriété BLEU. La valeur par défaut est False.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2012                                                     |
//|  Описание : Установка объекта OBJ_FIBO Уровни Фибоначчи.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - массив цветов линий                                                |
//|    st - массив стилей линий                                                |
//|    wd - массив ширин линий                                                 |
//|    fl - массив уровней Фибоначчи                                           |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - не луч)                        |
//+----------------------------------------------------------------------------+
void SetFibo(color& cl[], int& st[], int& wd[], double& fl[], string nm="",
             datetime t1=0, double p1=0, datetime t2=0, double p2=0,
             bool ry=False) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (p2<=0) p2=Bid;

  int i, k=ArraySize(fl);

  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_FIBO, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1     , t1);
  ObjectSet(nm, OBJPROP_PRICE1    , p1);
  ObjectSet(nm, OBJPROP_TIME2     , t2);
  ObjectSet(nm, OBJPROP_PRICE2    , p2);
  ObjectSet(nm, OBJPROP_COLOR     , cl[0]);
  ObjectSet(nm, OBJPROP_RAY       , ry);
  ObjectSet(nm, OBJPROP_STYLE     , st[0]);
  ObjectSet(nm, OBJPROP_WIDTH     , wd[0]);
  ObjectSet(nm, OBJPROP_LEVELCOLOR, cl[1]);
  ObjectSet(nm, OBJPROP_LEVELSTYLE, st[1]);
  ObjectSet(nm, OBJPROP_LEVELWIDTH, wd[1]);
  if (k>0) {
    ObjectSet(nm, OBJPROP_FIBOLEVELS, k);
    for (i=0; i<k; i++) {
      ObjectSet(nm, OBJPROP_FIRSTLEVEL+i, fl[i]);
      ObjectSetFiboDescription(nm, i, DoubleToStr(100*fl[i], 1));
    }
  }
}
Vous trouverez ci-joint un script pour tester la fonction SetFibo().
Dossiers :
 

Fonction GetLastThreeExtremumZZ().

Effectue la recherche des trois derniers extrema du ZigZag et retourne leurs valeurs : numéro de barre et niveau de prix pour chaque extremum. Toutes ces données sont contenues dans un tableau à deux dimensions qui est transmis comme paramètre à la fonction. Voici la liste complète des paramètres de la fonction :

  • zz - tableau bidimensionnel de valeurs ZigZag. Les numéros de barre sont ajoutés à la première colonne, et les valeurs de prix sont ajoutées à la deuxième colonne. La dimension du tableau devrait être zz[3,2].
  • sy - Nom de l'instrument. "" ou NULL - symbole actuel. La valeur par défaut est NULL.
  • tf - Période de temps. Valeur par défaut 0 - symbole actuel.
  • dp, dv, bs - Paramètres de ZigZaga : ExtDepth, ExtDeviation, ExtBackstep.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2012                                                     |
//|  Описание : Возвращает последние три экстремума ЗигЗага.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    zz - двумерный массив значений ЗигЗага                                  |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
bool GetLastThreeExtremumZZ(double& zz[][], string sy="", int tf=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double z;
  int i, k=iBars(sy, tf), ke=0;
  ArrayInitialize(zz, 0);

  for (i=0; i<k; i++) {
    z=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (z!=0) {
      zz[ke][0]=i;
      zz[ke][1]=NormalizePrice(z, sy);
      ke++;
      if (ke>3) return(True);
    }
  }
  Print("GetLastThreeExtremumZZ(): Недостаточно баров!");
  return(False);
}

Vous trouverez ci-joint un script pour tester la fonction GetLastThreeExtremumZZ().

 

La fonction NumberOfOrdersByPrice().

Renvoie le nombre d'ordres fixés à un niveau de prix donné. Vous pouvez limiter la liste des ordres à vérifier à l'aide des paramètres de la fonction :

  • sy - Nom de l'instrument de marché. Si ce paramètre est donné, la fonction ne vérifiera que les ordres de l'instrument spécifié. NULL signifie l'instrument actuel, et "" (par défaut) signifie n'importe quel instrument.
  • op - Type de transaction, type d'ordre en attente. Valeurs valides : OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. La valeur par défaut de -1 indique tout type de commande.
  • mn - Identifiant de l'ordre (MagicNumber). La valeur par défaut de -1 signifie n'importe quel MagicNumber.
  • pp - Le niveau de prix auquel l'ordre est fixé. La valeur par défaut de -1 correspond à n'importe quel prix.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.03.2012                                                     |
//|  Описание : Возвращает количество ордеров, установленных по заданной цене. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pp - цена                       (-1   - любая цена)                     |
//+----------------------------------------------------------------------------+
int NumberOfOrdersByPrice(string sy="", int op=-1, int mn=-1, double pp=-1) {
  int d, i, k=OrdersTotal(), ko=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()>1 && OrderType()<6) {
          d=MarketInfo(OrderSymbol(), MODE_DIGITS);
          pp=NormalizeDouble(pp, d);
          if (pp<0 || pp==NormalizeDouble(OrderOpenPrice(), d)) {
            if (mn<0 || OrderMagicNumber()==mn) ko++;
          }
        }
      }
    }
  }
  return(ko);
}

 

La fonction NumberOfLastLossPosFromDate().

Cette fonction renvoie la dernière série de positions perdantes (nombre dans une rangée) fermées depuis une certaine date. Une sélection plus précise des positions à prendre en compte est spécifiée à l'aide de paramètres externes :

  • sy - Nom de l'instrument de marché. Si ce paramètre est défini, la fonction ne prendra en compte que les positions de cet instrument. La valeur par défaut -" signifie tout instrument de marché. NULL signifie l'instrument actuel.
  • op - Opération commerciale, type de poste. Valeurs valides : OP_BUY, OP_SELL ou -1. La valeur par défaut -1 signifie une position quelconque.
  • mn - Identificateur de position, MagicNumber. La valeur par défaut -1 signifie tout identifiant.
  • dt - Date et heure en secondes depuis 1970. Valeur par défaut - 0 signifie que toutes les positions disponibles dans l'historique sont prises en compte.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 14.03.2012                                                     |
//|  Описание : Возвращает последнюю серию убыточных позиций                   |
//|             (количество подряд), закрытых с определённой даты.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
int NumberOfLastLossPosFromDate(string sy="", int op=-1, int mn=-1, datetime dt=0) {
  int i, k=OrdersHistoryTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              if (OrderProfit()<0) kp++; else kp=0;
            }
          }
        }
      }
    }
  }
  return(kp);
}

 

La fonction ClosePosExceptTicket().

Cette fonction ferme toutes les positions au prix du marché, sauf celle dont le ticket est passé. Une sélection plus précise des positions à fermer est spécifiée par des paramètres externes :

  • sy - Nom de l'instrument. Si ce paramètre est défini, la fonction vérifie les positions uniquement pour l'instrument spécifié. NULL signifie l'instrument actuel, tandis que "" (par défaut) signifie n'importe quel instrument.
  • op - Opération commerciale, type de poste. Valeurs valides : OP_BUY, OP_SELL ou -1. La valeur par défaut -1 signifie une position quelconque.
  • mn - Identifiant de la position (MagicNumber). Valeur par défaut -1 - tout MagicNumber.
  • ti - Ticket to position. Valeur par défaut 0 - n'importe quel ticket.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.03.2009                                                     |
//|  Описание : Закрытие позиций по рыночной цене за исключением одной,        |
//|           :  с переданным тикетом.                                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ti - тикет позиции              ( 0   - любой тикет)                    |
//+----------------------------------------------------------------------------+
void ClosePosExceptTicket(string sy="", int op=-1, int mn=-1, int ti=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ti==0 || ti!=OrderTicket()) ClosePosBySelect();
          }
        }
      }
    }
  }
}

 

Fonction GetChangeBalance().

Renvoie les changements de solde non commercial (dépôts, retraits, transferts internes, intérêts courus, bonus) à partir d'une certaine date passée en paramètre.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2010                                                     |
//|  Описание : Возвращает неторговое изменение баланса с определённой даты    |
//|             (пополнения, снятия, внутренние переводы).                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    dt - Дата и время в секундах с 1970 года  (0 - с начала истории)        |
//+----------------------------------------------------------------------------+
double GetChangeBalance(datetime dt=0)
{
  double p=0;
  int    i, k=OrdersHistoryTotal();

  for (i=0; i<k; i++) {
    if (OrderType()==6) {
      if (dt<OrderCloseTime()) p+=OrderProfit();
    }
  }
  return(p);
}
Raison: