Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 519

 
PolarSeaman:

Como sei que na história desta posição em particular, parte dela está fechada?

Abri uma posição com 1,0 lote, fechei com 0,5, e com 10$ de prejuízo. Mais tarde fechei outro 0,25 com 5$ de lucro. Fecharei tudo com 50$ de lucro. Na verdade, agora eu tenho um lucro de 50 dólares.

Como eu fecho -$10 e +$5 no cálculo do lucro atual? Para fechar com lucro de $55

Veja o comentário da posição (em mql4) - a parte fechada tem um ticket da parte restante (de#1234556789), a parte restante tem um ticket da parte fechada (de#123456788) - não me lembro onde há lacunas - você vai ver por si mesmo

 
Artyom Trishkin:

Veja o comentário da posição (em mql4) - a parte fechada tem um ticket do restante (de#1234556789), a parte restante tem um ticket do fechado (de#123456788) - não me lembro onde estão os espaços - você verá por si mesmo

Comparo o comentário da posição fechada com o bilhete da posição aberta, ele retorna "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:

Comparando um comentário de uma posição fechada com um ticket de uma posição aberta, retorna "0,0".

Do comentário o bilhete deve ser destacado, ou seja, caracteres extras como "de #" e "para #" devem ser removidos. Isso não é feito aqui.

 
Ihor Herasko:

Do comentário você precisa destacar o bilhete, ou seja, remover caracteres extras como "de #" e "para #". Isto não é feito aqui.

Exatamente! Como se corta "para #"?
 
PolarSeaman:
Exatamente! Como se corta "para #"?
encontrar a ocorrência de caráter/substring # e (opcionalmente) certificar-se de que é "de" ou "para" antes dele

pegar a parte restante e convertê-la em longa

in-5e, há uma rudimentar regexp - será mais fácil

 
Maxim Kuznetsov:
encontrar ocorrência de caráter/substring #
Encontrar com o que?
 
PolarSeaman:
Como posso encontrá-lo?

A busca no site não está funcionando? Você não tem a documentação no topo da página?

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

A busca no site não está funcionando? Você não tem a documentação no topo da página?

Obrigado, eu fiz isso.

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

mas a função de histórico de busca começou a retornar o lucro atual sobre a posição aberta

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

> Obrigado, foi assim que eu fiz.

Não faça isso novamente :-) você não pode confiar no comprimento ou no início de um fragmento quando lida com cordas indefinidas

Há uma bela função StringFind() - busca por "#" ou "de #".

ps/ você também deve usar um único caso, seja em maiúsculas ou minúsculas. Infelizmente não há protocolo para marcação de comentários, então é possível que algum servidor diga "DE #" (em letras maiúsculas);
em particular alguns colocam [sl] e outros (sl) no final do comentário em stop-loss. E a propósito, o tamanho do comentário é limitado. E assim por diante.
 

Qual é o mal de uma construção desse tipo?

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

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

Ou é melhor tornar adata um tipo longo?