Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 519

 
PolarSeaman:

Как узнать что в истории именно этой позиции закрыта часть?

Открыта позиция лотом 1.0, закрыто 0.5 убыток 10$, позже закрыто ещё 0.25 с профитом 5$ Закрою все когда профит будет 50$. По факту, сейчас,  профит 50$.

 Как мне закрытые -10$ и +5$ учитывать при подсчёте текущего профита? Чтобы закрыть при профите 55$

Смотрите комментарий позиции (в mql4) - у закрытой части будет прописан тикет оставшейся (to#1234556789), у оставшейся - тикет закрытой (from#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"

Из коммента нужно выделить тикет, т. е. убрать лишние символы типа "from #" и "to #". Здесь этого не сделано.

 
Ihor Herasko:

Из коммента нужно выделить тикет, т. е. убрать лишние символы типа "from #" и "to #". Здесь этого не сделано.

Точно! а как вырезать "to #"?
 
PolarSeaman:
Точно! а как вырезать "to #"?
найти вхождение символа/подстроки # и (опционально) удостовериться что до него это "from " или "to "

взять отставшуюся часть и конвертить в long

в-5е есть зачаточные 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() - ищите вхождение строки "#" или сразу "from #"

ps/ комент ещё стоит приводить к одного регистру - или upper или lowercase. К сожалению протокола проставления меток в коментариях нет, поэтому возможно что некий сервер скажет "FROM #" (большими буквами);
в частности некоторые выставляли [sl] а некоторые (sl) в конце комента при стоп-лоссе. И размер комента кстати ограничен. И прочая-прочая.
 

Чем пагубна такая конструкция?

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

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

Или лучше привести datetime к типу long?

Причина обращения: