Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 519

 
PolarSeaman:

Comment puis-je savoir que dans l'histoire de ce poste particulier, une partie est fermée ?

J'ai ouvert une position avec 1.0 lot, je l'ai fermé avec 0.5, et avec une perte de 10$. Plus tard, j'ai fermé un autre 0.25 avec un profit de 5$. Je vais tout fermer à 50$ de profit. En fait, en ce moment, j'ai 50 dollars de bénéfice.

Comment fermer -10$ et +5$ dans le calcul du profit actuel ? Pour clôturer à 55 $ de profit

Voir le commentaire de la position (dans mql4) - la partie fermée a un ticket de la partie restante (à#1234556789), la partie restante a un ticket de la partie fermée (de#123456788) - je ne me souviens pas où il y a des lacunes - vous verrez par vous-même

 
Artyom Trishkin:

Regardez le commentaire de la position (dans mql4) - la partie fermée a un ticket du reste (to#1234556789), le reste a un ticket de la partie fermée (from#123456788) - je ne me souviens pas où sont les espaces - vous verrez par vous même

Je compare le commentaire de la position fermée avec le ticket de la position ouverte, il retourne "0.0".

double prof_cl_pos(string sy="0", int op=-1, int mn=-1) {
  datetime ta;
  int      i, k=OrdersHistoryTotal();
  double profit_=0;
  string comment="";

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
             // comment=OrderComment();
              if (ticket_op_pos(Symbol(), -1,mn)==OrderComment())
              profit_=OrderProfit();
            }
          }
        }
      }
    }
  }
  return(profit_);
}
  int ticket_op_pos(string sy="", int op=-1, int mn=-1) {
  datetime o;
  double   l=-1;
  string comment="";
  int     ticket, 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=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
                ticket=OrderTicket();
              }
            }
          }
        }
      }
    }

  return(ticket);
}
 
PolarSeaman:

La comparaison d'un commentaire d'une position fermée avec un ticket d'une position ouverte, retourne "0.0".

Dans le commentaire, le ticket doit être mis en évidence, c'est-à-dire que les caractères supplémentaires comme "de #" et "à #" doivent être supprimés. Ça ne se fait pas ici.

 
Ihor Herasko:

À partir du commentaire, vous devez mettre en évidence le ticket, c'est-à-dire supprimer les caractères supplémentaires comme "de #" et "à #". Cela ne se fait pas ici.

Exactement ! Comment on coupe "à #" ?
 
PolarSeaman:
Exactement ! Comment on coupe "à #" ?
trouver l'occurrence du caractère/sous-chaîne # et (optionnellement) s'assurer que c'est "from" ou "to" qui le précède

prendre la partie restante et la convertir en longue.

en-5e, il y a un regexp rudimentaire - ce sera plus facile

 
Maxim Kuznetsov:
trouver l'occurrence du caractère ou de la sous-chaîne #.
Trouver avec quoi ?
 
PolarSeaman:
Comment puis-je le trouver ?

La recherche sur le site ne fonctionne pas ? N'avez-vous pas de la documentation en haut de la page ?

Документация по MQL5: Строковые функции / StringSubstr
Документация по MQL5: Строковые функции / StringSubstr
  • www.mql5.com
[in]  Длина извлекаемой подстроки. Если значение параметра равно -1 либо параметр не задан, то будет извлекаться подстрока, начиная с указанной позиции и до конца строки.
 
Artyom Trishkin:

La recherche sur le site ne fonctionne pas ? N'avez-vous pas de la documentation en haut de la page ?

Merci, j'ai fait ça.

              comment=OrderComment();
               substr = StringSubstr(comment, 4, 9);//пропускаю "to #" беру цифры
              if (ticket_op_pos(Symbol(), -1,mn)==substr)

mais la fonction d'historique de recherche a commencé à renvoyer le profit actuel sur la position ouverte

double prof_cl_pos(string sy="0", int op=-1, int mn=-1) {
  datetime ta;
  int      i, k=OrdersHistoryTotal();
  double profit_=0;
  string comment="";
  string substr="";

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              comment=OrderComment();
               substr = StringSubstr(comment, 4, 9);
              if (ticket_op_pos(Symbol(), -1,mn)==substr)
              profit_=OrderProfit();
            }
          }
        }
      }
    }
  }
  return(profit_);
}
 

> Merci, c'est ainsi que j'ai procédé.

Ne recommencez pas :-) vous ne pouvez pas vous fier à la longueur ou au début d'un fragment lorsque vous traitez des chaînes indéfinies.

Il existe une belle fonction StringFind() - recherchez "#" ou "from #".

ps/ vous devez également utiliser une seule casse, soit majuscule ou minuscule. Malheureusement, il n'existe pas de protocole pour marquer les commentaires, il est donc possible que certains serveurs disent "FROM #" (en majuscules) ;
en particulier certains put [sl] et certains (sl) à la fin du commentaire au stop-loss. La taille du commentaire est d'ailleurs limitée. Et ainsi de suite.
 

Où est le mal dans une telle conception ?

datetime tm1 = D'09.04.2018';
long     tm2 = TimeCurrent();

 if(tm1 > tm2) Print("Работает");

Ou est-il préférable de faire dedatetime un type long ?