Fonctions utiles de KimIV - page 62

 

Merci pour la réponse, Igor, j'ai trouvé la solution. J'utilise également vos fonctions séparément, mais je voulais profiter de la bibliothèque au stade de développement de l'EA.

J'ai regardé comment la bibliothèque trade_lib&info_lib de komposter est faite et j'ai fait quelques changements dans la vôtre pour mon propre usage.

1. J'ai supprimé dans toutes les bibliothèques les liens croisés #property library et #include library, renommé les bibliothèques pour qu'elles ne soient pas confondues.

2. J'ai fait un bloc d'appels directs de toutes les bibliothèques.

#include <b-Positions#.mqh>        // Библиотека функций для работы с позициями 
#include <b-KimIV#.mqh>            // Библиотека дополнительных функций
#include <b-Orders#.mqh>           // Библиотека функций для работы с ордерами
#include <stdlib.mqh>              // Стандартная библиотека
#include <WinUser32.mqh>           // Стандартная библиотека  

Maintenant, toutes les fonctions de toutes les bibliothèques sont disponibles, il n'y a pas d'erreurs et de messages criminels pendant la compilation, sauf le normal "n'est pas référencé...".

Tous les EA externes sont disponibles, sans problème.

Ecrivez plus, nous nous connecterons et utiliserons. Tout d'abord, je voudrais voir la fonction de suivi par le bénéfice total.

 

La fonction WeekOfMonth().

Cette fonction renvoie la semaine du mois par date. Accepte un seul paramètre facultatif :

  • dt - Date, heure. Valeur par défaut - 0 - date et heure actuelles du serveur commercial.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.08.2008                                                     |
//|  Описание : Возвращает номер недели месяца по дате                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    dt - дата, время           (0 - сейчас по времени торгового сервера)    |
//+----------------------------------------------------------------------------+
int WeekOfMonth(datetime dt=0) {
  if ( dt<=0) dt=TimeCurrent();
  datetime d;
  int      i, kd=TimeDay( dt), nn=1;

  for ( i=2; i<= kd; i++) {
    d=StrToTime(TimeYear( dt)+"."+TimeMonth( dt)+"."+ i);
    if (TimeDayOfWeek( d)==1) nn++;
  }
  return( nn);
}

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

Dossiers :
 
Igor, n'existe-t-il pas une fonction qui fermerait toutes les positions en commençant par celles dont le lot est le plus important ?
 

Bonjour, Igor ! Merci beaucoup pour vos fonctionnalités utiles ! Je les utilise autant que possible ! Je ne m'y suis mis que récemment, alors une question pour vous... Je les utilise depuis longtemps, donc depuis longtemps. J'utilise votre fonction OpenPosition, peut-être réagit-elle à une erreur ou autre ? Voici le journal d'hier, tout allait bien avant cela ! Je ne trouve l'erreur 220........ nulle part.

07:47:28 MetaTrader 4.00 build 220 démarré (MetaQuotes Software Corp.)
07:47:28 Expert ouvert prob USDJPY EURUSD,M1 : chargé avec succès
07:47:32 '1262868' : login
07:47:44 '1262868' : login
07:49:40 '1262868' : login
07:49:46 '1262868' : login
07:54:44 '1262868' : connect failed [No connection]
11:38:16 Expert ouvert prob USDJPY EURUSD,M1 : supprimé
11:38:18 MetaTrader 4.00 build 220 arrêté
14:05:05 MetaTrader 4.00 build 220 démarré (MetaQuotes Software Corp.)
14:05:05 Expert open prob USDJPY EURUSD,M1 : chargé avec succès
14:05:10 '1262868' : login
14:05:31 '1262868' : login
14:06:39 '1262868' : login
14:06:46 '1262868' : login
15:57:06 '1262868' : connect failed [No connection]
18:30:46 Expert open prob USDJPY EURUSD,M5 : supprimé
18:30:49 Main pumping : timeout on stop
18:30:52 Main pumping : timeout on stop
18:30:55 Main pumping : timeout on stop
18:30:58 Main pumping : timeout on stop
18:31:01 Main pumping : timeout on stop
18:31:01 Main pumping : terminé
18:31:02 MetaTrader 4.00 build 220 arrêté
18:31:02 MetaTrader 4.00 build 220 arrêté car arrêt du système
18:47:57 MetaTrader 4.00 build 220 démarré (MetaQuotes Software Corp.)
18:47:58 Expert open prob USDJPY EURUSD,M5 : chargé avec succès
18:48:01 '1262868' : connect failed [No connection]
18:48:10 '1262868' : login
18:48:20 '1262868' : login
20:19:00 '1262868' : login
20:19:07 '1262868' : login
20:20:05 '1262868' : login
20:20 :13 '1262868' : connexion
20:59:29 '1262868' : connexion
20:59:39 '1262868' : connexion
21:02:16 '1262868' : connexion
21:02:41 '1262868' : échec de la connexion du DataCenter [6]
22:08:40 '1262868' : échec du ping
22:08:43 '1262868' : connexion
22:08:49 '1262868' : échec de la connexion du DataCenter [6]
22:1001 '1262868' : connexion
22:10:05 '1262868' : échec de la connexion du DataCenter [6]
22:14:59 '1262868' : connexion
22:15:13 '1262868' : connexion
22:15:22 '1262868' : échec de la connexion du DataCenter [6]
22:37:16 '1262868' : connexion
22:37:27 '1262868' : échec de la connexion du DataCenter [6]
22:4051 '1262868' : connexion
22:41:04 '1262868' : échec de la connexion du centre de données [6]
23:17:14 Expert ouvert prob USDJPY EURUSD,M5 : supprimé
23:17:16 Expert ouvert prob USDJPY EURUSD,M5 : chargé avec succès
23:25:52 Expert ouvert prob USDJPY EURUSD,M5 : supprimé
23:25:55 MetaTrader 4.00 build 220 arrêté
23:25:59 MetaTrader 4.00 build 220 démarré (MetaQuotes Software Corp.)
23:26:05 '1262868' : connexion
23:26:05 Expert open prob USDJPY EURUSD,M5 : chargé avec succès
23:26:15 '1262868' : connexion
23:27:19 '1262868' : connexion
23:27:34 '1262868' : connexion
23:28:20 Expert open prob USDJPY EURUSD,M5 : retiré
23:28:25 Expert open prob USDJPY USDCHF,H4 : chargé avec succès
23:28:33 Expert open prob USDJPY USDCHF,H4 : retiré

Merci beaucoup d'avance !

 
khorosh писал(а) >>
Igor, n'y a-t-il pas une fonction qui fermerait toutes les positions en commençant par celles qui ont un lot plus important ?

n'a pas... écrit...

La fonction ClosePosBySortLots().

Cette fonction ferme les positions dans l'ordre de tri par taille de lot. C'est-à-dire qu'à l'aide de cette fonction, vous pouvez fermer des positions dans l'ordre croissant ou décroissant de la taille des lots. La fonction ClosePosBySortLots() accepte les paramètres facultatifs suivants :

  • sy - Nom de l'instrument de négociation. "" - tout instrument, NULL - instrument actuel. La valeur par défaut est "".
  • op - Type d'opération commerciale. Valeurs valides -1 - toute position, OP_BUY - achat, OP_SELL - vente. La valeur par défaut est -1.
  • mn - MagicNumber, identifiant unique de l'opération commerciale. Valeur par défaut -1 - tout nombre magique.
  • sd - Sens de tri de la taille du lot. Valeurs valides MODE_ASCEND - ascendant, MODE_DESCEND - descendant. La valeur par défaut est MODE_DESCEND.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.12.2008                                                     |
//|  Описание : Закрытие позиций в порядке сортировки по размерам лотов.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        (    ""       - любой символ,      |
//|                                             NULL      - текущий символ)    |
//|    op - операция                        (    -1       - любая позиция)     |
//|    mn - MagicNumber                     (    -1       - любой магик)       |
//|    sd - Направление сортировки лотов    (MODE_ASCEND  - возрастание,       |
//|                                          MODE_DESCEND - убывание)          |
//+----------------------------------------------------------------------------+
void ClosePosBySortLots(string sy="", int op=-1, int mn=-1, int sd= MODE_DESCEND) {
  double a[][2];                  // Массив лотов и тикетов
  int    i, k=OrdersTotal();      // Счётчик и количество ордеров
  int    p=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()==OP_BUY || OrderType()==OP_SELL) {
          if ( mn<0 || OrderMagicNumber()== mn) {
            p++;
            ArrayResize( a, p);
            a[ p-1][0]=OrderLots();
            a[ p-1][1]=OrderTicket();
          }
        }
      }
    }
  }

  // вдруг позиций нету, тогда и закрывать нечего
  if ( p>0) {
    ArraySort( a, WHOLE_ARRAY, 0, sd);
    for ( i=0; i< p; i++) {
      if (OrderSelect( a[ i][1], SELECT_BY_TICKET)) {
        // проверим незакрытость на всякий случай,
        // может какая-то позиция уже закрылась по стопу/тейку
        if (OrderCloseTime()==0) ClosePosBySelect();
      }
    }
  }
}

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

Dossiers :
 

La fonction AddLeadingZero().

Cette fonction ajoute autant de zéros de tête (à gauche) "0" à la chaîne de caractères pour que la longueur de la chaîne soit égale à une valeur donnée. La fonction AddLeadingZero() prend les paramètres obligatoires suivants :

  • s - La chaîne à laquelle les zéros de tête doivent être ajoutés.
  • k - La longueur de la chaîne de caractères résultante S.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Добавляет к строке S столько лидирующих нулей "0",             |
//|           : чтобы длина строки S стала равна K.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    s - строка                                                              |
//|    k - длина строки S                                                      |
//+----------------------------------------------------------------------------+
string AddLeadingZero(string s, int k) {
  while(StringLen( s)< k) s=StringConcatenate("0", s);
  return( s);
}

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

Dossiers :
 

La fonction toTime().

Cette fonction convertit deux/trois entiers en une chaîne de caractères au format horaire. Si deux nombres sont passés dans la fonction, le premier sera utilisé comme heures et le second comme minutes. La chaîne de format renvoyée sera "HH:MM". S'il y a trois chiffres, le troisième sera remplacé par les secondes et la fonction renverra la chaîne "HH:MM:SS". La fonction toTime() accepte les paramètres facultatifs suivants :

  • h - Horloge. La valeur par défaut est 0.
  • m - Procès-verbal. La valeur par défaut est 0.
  • s - Secondes. 0 - Ne pas utiliser. Valeur par défaut : 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Преобразует два/три целых числа в строку в формате времени     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    h - часы                                                                |
//|    m - минуты                                                              |
//|    s - секунды           (0 - не использовать)                             |
//+----------------------------------------------------------------------------+
string toTime(int h=0, int m=0, int s=0) {
  string st="";

  if ( h==0) st="00:";
  else      st=StringConcatenate( AddLeadingZero( h, 2), ":");

  if ( m==0) st=StringConcatenate( st, "00");
  else      st=StringConcatenate( st, AddLeadingZero( m, 2));

  if ( s!=0) st=StringConcatenate( st, ":", AddLeadingZero( s, 2));

  return( st);
}

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

Dossiers :
 

Igor, pourriez-vous suggérer une fonction qui donnerait un signal correspondant lorsque le prix correspond à l'une des variables, disons b=1.2400, s=1.2300 ;

Si b=prix sig=1, si s=prix sig=-1.

Je m'excuse pour le manque de rigueur).

 
Prival >> :
Désolé, je ne suis pas Igor. Mais peut-être que ceci va aider.

Je m'excuse aussi. >> c'est plus précis.

//+------------------------------------------------------------------+
//| Функция                                                          |
//+------------------------------------------------------------------+
int Sign(double b, double s)
   {
   double var, e; var=Close[0]; e=0.000001;
   if( var< b+ e && var> b- e) return( 1);
   if( var< s+ e && var> s- e) return(-1); 
   return(0);
   }
 
Prival >> :

...je supprimerai mes messages d'ici ce soir afin de ne pas encombrer le fil de discussion...

Pas besoin. Il est utile d'y jeter un coup d'œil, cela vous éveillera à l'idée que la valeur exacte du prix n'est pas systématiquement relevée.