Fonctions utiles de KimIV - page 19

 

Fonction GetProfitOpenPosInCurrency().

Cette fonction renvoie le bénéfice total des positions actuellement ouvertes. Le bénéfice est restitué en unités de la monnaie de dépôt. 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 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 n'importe quel identifiant.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  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=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return(p);
}
HH. Vous trouverez ci-joint un script pour tester la fonction GetProfitOpenPosInCurrency().
 
KimIV:
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.

C'est comme ça que je fais entrer le prix, en utilisant uniquement les chiffres. Mais cela n'aide pas, l'erreur ne s'affiche pas toujours, seulement dans certains cas, et je n'ai pas trouvé de quoi elle dépend. Je devrais probablement utiliser mes mains pour vérifier les valeurs de sortie que le robot tente de définir.

 

À la lumière des développements possibles à l'avenir, cet ajout sera utile :

p+=OrderProfit()+OrderTaxes()+OrderCommission()+OrderSwap();
// !!! OrdertTaxes() мифический парамер налогов !!!
Je me demande s'il y en aura un sur cinq... ? ;)))

Merci encore pour le conseil sur la façon de résumer les données dans la boucle !

 

Yo-yo, tu te moques de moi ? Mon compilateur ne comprend pas OrderTaxes().

 

Bien sûr ! !! :)))

Vous pouvez le voir dans le surlignage, et dans le commentaire qui l'a clairement signalé...

Bien qu'il s'agisse de l'une des propriétés d'un ordre, ou plutôt d'une position, et qu'une telle fonction doive en principe être...

-

Et si le compilateur ne comprend pas...

Le RNB va nous apprendre ;)

 

Fonction GetProfitOpenPosInPoint().

Cette fonction renvoie le bénéfice total des positions actuellement ouvertes. Le bénéfice est restitué en points. Une sélection plus précise des positions à prendre en compte est spécifiée par des 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 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 n'importe quel identifiant.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=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 (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
          if (OrderType()==OP_BUY) {
            pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
          }
        }
      }
    }
  }
  return(pr);
}
HH. Vous trouverez ci-joint un script pour tester la fonction GetProfitOpenPosInPoint().
 
KimIV:

Dans ce fil de discussion, je publierai les codes de mes fonctions dans MQL4, je donnerai des exemples de leur utilisation et je répondrai aux questions relatives à leur utilisation. Chaque fonction sera publiée en deux postes. Le premier post contiendra le code de la fonction, le second - des exemples d'utilisation et de courtes explications. Parfois, je joins le code d'un script au deuxième message pour tester réellement la fonction et afficher les résultats.

Je commencerai par les fonctions permettant de gérer les ordres, conformément à la demande de Lukyanov dans le sujet "Comment faire fonctionner deux EA en même temps" à la fin.

La première est la fonction de définition des ordres (version du testeur MT4) :

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Установка ордера. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    pp - цена                                                               |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Срок истечения                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0) {
  color clOpen;
  int   err, ticket;
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, ex, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") set ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
//+----------------------------------------------------------------------------+

Bonjour, veuillez m'aider à écrire un EA. Je n'y connais pas grand-chose mais ça semble être une bonne idée. Le sens de l'idée dans ce qui suit si elle est certainement possible.
Il est nécessaire que s'ouvrent deux offres simultanément une Vendre un Acheter avec des paramètres (lots=0.1____TafeProfit=30______StopLoss=10) et à la fermeture de perdre ouvert le deuxième positif avec des paramètres (lots=1____TafeProfit=30______StopLoss=10)
Si vous ne m'envoyez pas sur les chapeaux de roue... alors idéalement les deux paris initiaux s'ouvrent à la bougie minimum ou maximum ou à l'apparition d'une nouvelle bougie, mais si la deuxième partie de l'écriture longue fait au moins la première partie de mes divagations...

Merci beaucoup par avance ! !!! Si vous l'écrivez, mettez-le ici vms.80@mail.ru.



 

Fonction GetTicketLastPos().

Cette fonction renvoie le ticket de la dernière position ouverte ou -1. Une sélection plus précise des positions à prendre en compte est spécifiée par des 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 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                                                     |
//|  Описание : Возвращает тикет последней открытой позиции или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTicketLastPos(string sy="", int op=-1, int mn=-1) {
  datetime o;
  int      i, k=OrdersTotal(), r=-1;

  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) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                r=OrderTicket();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
HH. Vous trouverez ci-joint un script pour tester la fonction GetTicketLastPos().
Dossiers :
 
WoodyVMS:

Je ne sais pas quoi en faire, mais j'ai une idée de ce qu'il faut en faire. Je n'en ai aucune idée, mais c'est peut-être une bonne idée. L'essentiel est le suivant, si c'est possible.
Il est nécessaire d'ouvrir deux offres simultanément, l'une de vente, l'autre d'achat, avec des paramètres (lots=0.1____TafeProfit=30______StopLoss=10) et, lors de la fermeture de l'offre à perte, d'ouvrir la deuxième offre positive avec des paramètres (lots=1____TafeProfit=30______StopLoss=10).
Si vous ne m'envoyez pas sur les chapeaux de roue... alors idéalement les deux paris initiaux s'ouvrent à la bougie minimum ou maximum ou à l'apparition d'une nouvelle bougie, mais si la deuxième partie de l'écriture longue fait au moins la première partie de mes divagations...

Merci beaucoup par avance ! !!! Si vous l'écrivez, mettez-le ici vms.80@mail.ru.

Ou peut-être envoyer au camarade tous les EA de CodeBase à cette adresse.

Désolé, Igor, d'être hors sujet. Si c'est le cas, je vais le supprimer.

 
Vinin писал (а):
Ou peut-être envoyer au camarade tous les EA de CodeBase à cette adresse.
Il le trouvera lui-même...