Fonctions utiles de KimIV - page 13

 
olyakish:

Igor, je vous ai posé une question dans la section "Bibliothèque de fonctions pour travailler avec les fichiers INI" mais vous n'avez pas répondu :(


Merci... a répondu...

 

La fonction ClosePosBySelect().

Ferme un poste présélectionné. Cette fonction est plutôt auxiliaire, car elle est appelée par plusieurs autres fonctions, qui aident à sélectionner les positions à fermer selon certaines conditions.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 19.02.2008                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, pa, pb, pp;
  int    err, it;

  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
      if (OrderType()==OP_BUY) {
        pp=pb; clClose=clCloseBuy;
      } else {
        pp=pa; clClose=clCloseSell;
      }
      ll=OrderLots();
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        err=GetLastError();
        if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
        Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
              ErrorDescription(err),", try ",it);
        Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);
        Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
              "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
        Sleep(1000*5);
      }
    }
  } else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}
 
KimIV:

Merci... répondu...

Une autre question (ou plutôt déclaration) là aussi :)

 
KimIV:

La fonction ClosePosBySelect().

Ferme un poste présélectionné. Cette fonction est plutôt auxiliaire car elle est appelée par plusieurs autres fonctions qui permettent de sélectionner les positions à fermer en fonction de certaines conditions.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 19.02.2008                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, pa, pb, pp;
  int    err, it;

  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
      if (OrderType()==OP_BUY) {
        pp=pb; clClose=clCloseBuy;
      } else {
        pp=pa; clClose=clCloseSell;
      }
      ll=OrderLots();
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        err=GetLastError();
        if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
        Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
              ErrorDescription(err),", try ",it);
        Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);
        Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
              "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
        Sleep(1000*5);
      }
    }
  } else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}

Bonjour !

Excusez-moi !

1) Je ne comprends pas le sens de la ligne for (it=1; it<=NumberOfTry; it++)

Quel genre de boucle est-ce ?

2) Je ne comprends pas non plus la condition if (!testing() ......) break ;

3) et enfin, quelle est cette fonction ? ErrorDescription(err)," ,

Si cela ne vous dérange pas, veuillez expliquer .

 

1. Il s'agit d'un cycle de tentatives de commerce. Si le serveur de négociation renvoie des erreurs, la fonction effectuera un nombre d'essais pour clôturer la position après tout. Je règle généralement le nombre d'essais à 5.

2. cette condition met en œuvre la capacité de sortir correctement du cycle de tentatives lorsque le conseiller expert travaillant en ligne est arrêté. Sans cette condition, pour appeler, par exemple, les propriétés de l'EA, nous devions soit attendre que l'EA utilise toutes les tentatives de trade, soit supprimer l'EA du graphique.

3. Regardez dans le fichier ..\experts\libraries\stdlib.mq4

 

Je voudrais demander comment faire fonctionner un EA dans une boucle infinie, mais en ayant accès aux réglages de ses paramètres ?

J'ai écrit au début comme ceci

while (true)
{
  // проверка на останов и прочее
      if (IsStopped()) 
        return(-1);
  while (isRefresh == false)
       isRefresh = RefreshRates();
      
  // некий код
  // задержка
  Sleep(G_Period);   
}

Mais dans ce cas, le conseiller expert se bloque et je ne peux rien faire avec lui, sauf le supprimer du graphique.

 

Valera, faites qu'il en soit ainsi :


while (IsExpertEnabled() && !IsStopped())
{
  while (!RefreshRates()) Sleep(500);
      
  // некий код
  // задержка
  Sleep(G_Period);   
}
 

La fonction ClosePosBySizeProfitInCurrency().

Cette fonction permet de fermer uniquement les positions pour lesquelles le profit dans la devise de dépôt dépasse une certaine valeur spécifiée. Vous pouvez spécifier les positions qui doivent être fermées en utilisant les paramètres de la fonction :

  • sy - Nom de l'instrument. Si vous définissez ce paramètre, la fonction vérifiera uniquement 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 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 - signifie tout MagicNumber.
  • pr - Niveau de bénéfice dans la devise de dépôt. Valeur par défaut - 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых профит в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит                                                             |
//+----------------------------------------------------------------------------+
void ClosePosBySizeProfitInCurrency(string sy="", int op=-1, int mn=-1, double pr=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 (OrderProfit()+OrderSwap()>pr) ClosePosBySelect();
          }
        }
      }
    }
  }
}
 
KimIV:

Valera, faites qu'il en soit ainsi :


while (IsExpertEnabled() && !IsStopped())
{
  while (!RefreshRates()) Sleep(500);
      
  // некий код
  // задержка
  Sleep(G_Period);   
}

Hélas, cela diffuse aussi l'ekspert et ne donne pas accès à ses paramètres tant que vous ne l'avez pas retiré du graphique

 
scorpionk:

Hélas, cela diffuse également l'EA et ne donne pas accès à ses paramètres jusqu'à ce que vous le supprimiez du graphique.

Il vous donne toutefois la possibilité d'arrêter l'EA en appuyant sur le bouton "EAs" de la barre d'outils.