Fonctions utiles de KimIV - page 110

 
Merci pour cette précision, je vais maintenant passer à autre chose))))).
 

Fonction WritingLineInFile().

J'ai réécrit cette fonction, ajouté un paramètre fs, qui permet d'écrire la première ligne du fichier, qui est différente des autres lignes, par exemple l'en-tête du tableau. La première ligne ne sera écrite dans le fichier que si deux conditions sont remplies simultanément : la longueur de la ligne est supérieure à zéro et la taille du fichier est nulle. Et afin de maintenir la compatibilité avec la version précédente, le nouveau paramètre a été rendu facultatif.

Paramètres de la fonction WritingLineInFile() :

  • fn - nom du fichier
  • st - la chaîne à écrire dans le fichier
  • fs - première ligne (en-tête du tableau)

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.04.2012                                                     |
//+----------------------------------------------------------------------------+
//|  Описание : Запись строки в файл                                           |
//|  Параметры:                                                                |
//|    fn - имя файла                                                          |
//|    st - строка                                                             |
//|    fs - первая строка (шапка таблицы)                                      |
//+----------------------------------------------------------------------------+
void WritingLineInFile(string fn, string st, string fs="") {
  int fh=FileOpen(fn, FILE_READ|FILE_WRITE, " ");

  if (fh>0) {
    if (FileSize(fh)==0 && StringLen(fs)>0) FileWrite(fh, fs);
    FileSeek (fh, 0, SEEK_END);
    FileWrite(fh, st);
    FileClose(fh);
  }
}

ZZY. Vous trouverez ci-joint un script pour tester la fonction.

Dossiers :
 
Bonsoir, Igor ! Il s'est arrêté à la fonction
.
DateBeginQuarter

Tout d'abord, j'essaie de comprendre les lignes :

int ye=Year()-MathFloor(nq/4);
  nq=MathMod(nq, 4);

Par défaut nq = 0, donc il n'est pas clair ce que nous obtenons de l'expression MathMod(nq/4), puisque le résultat sera toujours 0. Aussi la deuxième ligne n'est pas claire, puisque 0/4 n'a pas de reste, veuillez clarifier.

 

Merci, Natasha, pour votre question. Grâce à vous, j'ai revérifié la fonction et trouvé l'erreur. Dans la ligne

int ye=Year()-MathFloor(nq/4);

Je dois remplacer le signe moins par un signe plus.

int ye=Year()+MathFloor(nq/4);

Et maintenant, j'en viens au fond de votre question. nq n'est pas toujours égal à zéro. Il peut y avoir n'importe quelle valeur entière, y compris des valeurs négatives. Ces lignes fonctionnent lorsque nq est un multiple de 4, c'est-à-dire lorsque vous devez ajouter ou soustraire 4 trimestres (année).

 
KimIV:

Merci, Natasha, pour votre question. Grâce à vous, j'ai revérifié la fonction et trouvé l'erreur. Dans la ligne

Je dois remplacer le signe moins par un signe plus.

Et maintenant, j'en viens au fond de votre question. nq n'est pas toujours égal à zéro. Il peut y avoir n'importe quelle valeur entière, y compris des valeurs négatives. Les lignes que vous avez spécifiées fonctionnent dans les cas où nq est un multiple de 4, c'est-à-dire lorsque vous devez ajouter ou soustraire 4 trimestres (année).

Merci pour votre réponse, Igor.... il m'a fallu plus de temps que d'habitude pour traiter la fonction, mais j'ai quand même réussi à comprendre))))))) dans la même fonction, il me semble que je n'ai pas besoin de diminuer l'année dans l'expression :

 if (mo<1) {
    mo+=12;
    ye--;

alors il sera correct.

 
Lisi4ka330:

...dans la même fonction, je ne pense pas que vous ayez besoin de réduire l'année dans l'expression...

Justifie, Natasha, pourquoi pas ? Au contraire, il me semble logique de diminuer l'année après avoir fermé le cercle mensuel dans le sens inverse. Dans votre expression, réduire l'année revient à reculer l'aiguille des heures d'une heure après que l'aiguille des minutes ait fait un tour complet. Donnez-nous votre version de la fonction, et nous en discuterons... Peut-être que votre version sera plus réussie que la mienne.
 

Fonction GetDrawdownOpenPosInPoint()

J'ai terminé les tests approfondis de cette fonction. J'ai pris en compte l'écart là où c'était nécessaire, j'ai essayé de l'optimiser... La fonction renvoie le drawdown maximal des positions actuellement ouvertes en pips. Traditionnellement, vous pouvez passer des paramètres à la fonction et ainsi filtrer les positions dont vous avez besoin pour l'analyse :

  • sy - Nom de l'instrument. Si ce paramètre est passé, la fonction vérifiera uniquement les positions de l'instrument spécifié. NULL signifie l'instrument actuel, et "" (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). La valeur par défaut de -1 signifie n'importe quel MagicNumber.
  • tf - Période du graphique, sur laquelle les valeurs des barres High et Low sont affichées. La valeur par défaut est 0 - l'horizon temporel actuel.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.05.2012                                                     |
//|  Описание : Возвращает максимальную просадку в пунктах текущих открытых    |
//|             позиций.                                                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    tf - таймфрейм                  ( 0   - текущий таймфрейм)              |
//+----------------------------------------------------------------------------+
int GetDrawdownOpenPosInPoint(string sy="", int op=-1, int mn=-1, int tf=0) {
  if (sy=="0") sy=Symbol();
  if (tf==0) tf=Period();

  datetime to=TimeOpenFirstPos(sy, op, mn); // Время открытия первой позиции
  datetime tb=GetTimeOpenBar(sy, tf, to);
  int      dd, md=0;                        // Просадка
  double   po, sp;                          // Пункт, спрэд
  int      i, k=OrdersTotal();              // Номера позиций
  int      nb;                              // Номер бара

  if (tb>0) {
    while (tb<TimeCurrent()) {
      dd=0;
      for (i=0; i<k; i++) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
          if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
            if ((op<0 || OrderType()==op) && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
              if (tb>OrderOpenTime()) {
                nb=iBarShift(OrderSymbol(), tf, tb, True);
                if (nb>=0) {
                  po=MarketInfo(OrderSymbol(), MODE_POINT);
                  if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol()+". Точность расчётов не гарантируется!");
                  else {
                    if (OrderType()==OP_BUY) {
                      dd+=(OrderOpenPrice()-iLow(OrderSymbol(), tf, nb)+po)/po;
                    }
                    if (OrderType()==OP_SELL) {
                      sp=po*MarketInfo(OrderSymbol(), MODE_SPREAD);
                      dd+=(iHigh(OrderSymbol(), tf, nb)-OrderOpenPrice()+sp)/po;
                    }
                  }
                }
              }
            }
          }
        }
      }
      if (md<dd) md=dd;
      tb+=60*tf;
    }
  }
  return(md);
}

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

 
KimIV:
Justifie, Natasha, pourquoi pas ? Au contraire, il me semble logique de diminuer l'année après avoir fermé le cercle mensuel dans le sens inverse. Dans votre expression, réduire l'année revient à reculer l'aiguille des heures d'une heure après que l'aiguille des minutes ait fait un tour complet. Donnez-nous votre version de la fonction, et nous en discuterons... Peut-être que votre version sera plus réussie que la mienne.

J'ai raisonné de la façon suivante : disons que nous devons déterminer le début de Q7 dans le passé et le futur, alors nq= -7 et nq=7 respectivement. Mathfloor renverra -2 pour le passé et +1 pour le futur (à en juger par la description de la fonction dans la documentation), donc pour la situation dans le passé nous soustrairons une année de plus que nous ajouterons dans le futur..... si nous continuons les calculs pour le passé, nous devrons réduire l'année à nouveau et nous finirons à 2009.....

Malheureusement par manque de temps (j'ai à peine le temps de lire la page du site), je ne peux pas fournir le code que je pense être correct pour le moment, mais je pense qu'il ne sera pas difficile de le corriger si nécessaire.

 
Lisi4ka330:

J'ai raisonné de la façon suivante : disons que nous devons déterminer le début de Q7 dans le passé et le futur, alors nq= -7 et nq=7 respectivement. Mathfloor renverra -2 pour le passé et +1 pour le futur (à en juger par la description de la fonction dans la documentation), donc pour la situation dans le passé nous soustrairons une année de plus que nous ajouterons dans le futur..... si nous continuons les calculs pour le passé nous devrons encore réduire l'année et nous nous retrouverons en 2009...

Je suis d'accord avec votre raisonnement, mais vous oubliez les types de données impliqués dans les opérations. On peut se passer complètement de MathFloor(). Voir le résultat du script dans la pièce jointe.

Dossiers :
test.mq4  1 kb
 
Bonjour, Igor)))) Pour être honnête, je n'ai pas bien compris votre réponse, et même le script ci-joint n'a pas apporté de clarté, mais plutôt le contraire... )))) mais je pense que je trouverai la solution à temps)))) Pourriez-vous me dire pourquoi il y a des plus dans la ligne return(StrToTime(ye+"."+mo+".01").