新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 519

 
PolarSeaman:

我怎么知道在这个特定职位的历史中,有些是封闭的?

我以 1.0手开仓,以0.5手平仓,损失10美元。 后来我又以5美元的利润平仓了0.25手。 我将以50美元的利润全部平仓。事实上,现在我有50美元的利润。

在计算当前利润时,如何关闭-10美元和+5美元?以55美元的利润收盘

请看位置的评论(在mql4中)--已关闭的部分有一个剩余部分的票据(到#1234556789),剩余部分有一个已关闭的票据(从#123456788)--我不记得哪里有差距--你自己看吧

 
Artyom Trishkin:

看看位置的评论(在mql4中)--关闭的部分有一张剩余的票(to#1234556789),剩余的部分有一张关闭的票(from#123456788)--我不记得空格在哪里了--你自己看吧

我将平仓 的评论与开仓的票据进行比较,返回 "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:

平仓的 评论与开仓的票据进行比较,返回 "0.0"。

应从评论中突出票据,即应删除 "从#"和 "到#"等额外字符。这里没有做。

 
Ihor Herasko:

从评论中,你需要强调票据,即删除多余的字符,如 "从#"和 "到#"。这里没有这样做。

完全正确!你如何删掉 "to #"?
 
PolarSeaman:
正是如此!你如何削减 "到#"?
找到字符/子串#的出现,并(可选择)确保其前面是 "从 "或 "到"。

把剩下的部分转换为长的

在5e中,有一个基本的regexp - 这将更容易

 
Maxim Kuznetsov:
查找字符/子串的出现 #
用什么找?
 
PolarSeaman:
我怎样才能找到它呢?

网站搜索不起作用吗?你不是在页面的顶部有文件吗?

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

网站搜索不起作用吗?你不是在页面的顶部有文件吗?

谢谢,我做了这个。

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

但搜索历史功能开始返回未结头寸 的当前利润

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_);
}
 

> 谢谢,我就是这样做的。

不要再这样做了:-)在处理未定义的字符串时,你不能依赖片段的长度或开始。

有一个不错的StringFind()函数--搜索 "#"或 "从#"。

ps/ 你也应该使用单一的大小写,可以是大写也可以是小写。不幸的是,在评论中没有标记的协议,所以有可能一些服务器会说 "FROM #"(大写字母)。
特别是一些把[sl]和一些(sl)在止损时的评论结束。而且评论的大小是有限制的,顺便说一下。诸如此类,不一而足。
 

这样的建设有什么危害?

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

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

还是把datetime 改为长类型更好?

原因: