Fonctions utiles de KimIV - page 18

 
rid писал (а):
MA. Je garde le message pendant 24 heures - puis je le supprime !

Vous n'avez pas à le supprimer ! Qu'il reste...

 

Igor, tout d'abord merci pour vos fonctions et pour cette branche, elles aident de nombreux programmeurs non professionnels. Mais j'aimerais vous poser une question sur la fonction NumberOfOrders(). Je n'arrive pas à le faire fonctionner. Je l'ai inséré dans un conseiller expert MACD standard pour donner un exemple de la façon dont je l'utilise. Je colle le code :

Pour le décrire brièvement, il y a eu des changements :

// в стандартной версии  
total=OrdersTotal();
   if(total<1) 
     {
// бла бла бла ...
// в моей версии эксперта
   total=OrdersTotal(); // total я оставил т.к. он используется дальше
   if(NumberOfOrders(NULL,-1,-1)<1) 
     {
// бла бла бла ... ну и плюс сама функция NumberOfOrders() ниже
Naturellement, cela ne fonctionne pas. Pouvez-vous m'expliquer ce qui ne va pas ? Merci d'avance.
Dossiers :
 
seifer писал (а):
Pouvez-vous expliquer ce qui ne va pas ? Merci d'avance.

Deux commentaires :

1. Je le ferais comme ça :

total=NumberOfOrders(NULL);
if (total<1) {
  ...
}
2. La fonction NumberOfOrders() renvoie le nombre d'ordres - transactions de type BuyLimit, BuyStop, SellLimit et SellStop. Le conseiller expert que vous avez modifié ne fonctionne pas avec les ordres. Il ouvre des positions aux prix du marché, c'est-à-dire qu'il effectue des transactions d' achat et de vente. Vous devez utiliser la fonction NumberOfPositions(), que je présenterai dans le prochain billet.
 

La fonction NumberOfPositions().

Cette fonction renvoie le nombre de postes actuellement ouverts. Une sélection plus précise des positions comptées est spécifiée par des 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 l'instrument spécifié. 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.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
Vous trouverez ci-joint un script pour tester la fonction NumberOfPositions().
Dossiers :
 

Wow ! Je pensais que c'était un dessin :

      ...
      ot=OrderType();
      if (ot>1 && ot<6) {
      ...
passerait par toutes les positions (y compris OP_SELL et OP_BUY). Tout fonctionne maintenant. Merci encore !
 

Fonction GetProfitFromDateInCurrency().

Cette fonction renvoie le bénéfice total dans la devise des positions 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 vous spécifiez ce paramètre, 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 valables : 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                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  int    i, k=OrdersHistoryTotal();

  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()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

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

L'indicateur i-Profit, qui affiche des valeurs de profit absolues et en pourcentage pour différentes périodes, est un exemple plus pratique pour apprendre à utiliser cette fonction.

 

Bonjour Igor.

Je tiens à vous remercier pour la fic de corrélation. J'avais quelques options, je voulais juste les clarifier ;)

J'ai également une telle question. Je rencontre très souvent l'erreur 130 - wrong stop lors des tests d'Expert Advisor en mode temps réel. Je ne l'analyse pas, je ne comprends pas pourquoi il se produit dans telle ou telle situation. J'ai commencé à utiliser cette construction

   double md = MarketInfo(Symbol(), MODE_TICKSIZE);
   return(NormalizeDouble(Value/md, 0) * md);

J'ai commencé à utiliser cette construction pour normaliser le stop et le TP, mais cela n'a pas résolu la situation. Peut-être avez-vous été confronté à des situations similaires, dites-moi comment y faire face et quelle est la meilleure façon de l'analyser.

Pour clarifier : Cela se produit très souvent lorsque j'essaie de fixer un stop à +1 p du prix d'ouverture.

 
scorpionk писал (а):
rencontrer l'erreur 131 - Arrêt incorrect.

131 - Volume incorrect, erreur dans la granulation du volume. Il s'agit de la taille du lot négocié.

 
KimIV:
scorpionk a écrit (a) :
Je rencontre l'erreur 131 - Mauvais arrêt.

131 - Volume incorrect, une erreur dans la granulation du volume. Il s'agit de la taille du lot négocié.

Mauvais code, pas 131 mais 130

 
scorpionk:

Mauvais code, ce n'est pas 131, c'est 130.

Je vois...

Essayez de normaliser comme suit :

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
Je le fais et je ne rencontre pas l'erreur 130.
Raison: