Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 519

 
PolarSeaman:

¿Cómo sé que en el historial de esta posición concreta hay algo cerrado?

Abrí una posición con 1.0 lote, la cerré con 0.5, y con 10$ de pérdida. Más tarde cerré otra de 0.25 con 5$ de beneficio. Lo cerraré todo con 50$ de beneficio. De hecho, ahora tengo 50 dólares de beneficio.

¿Cómo cierro -10 dólares y +5 dólares en el cálculo del beneficio actual? Para cerrar con un beneficio de 55 dólares

Ver el comentario de la posición (en mql4) - la parte cerrada tiene un ticket de la parte restante (a#1234556789), la parte restante tiene un ticket de la cerrada (de#123456788) - no recuerdo donde hay huecos - lo verás por ti mismo

 
Artyom Trishkin:

Mira el comentario de la posición (en mql4) - la parte cerrada tiene un ticket del resto (a#1234556789), el resto tiene un ticket del cerrado (de#123456788) - no recuerdo donde están los espacios - lo verás por ti mismo

Comparo el comentario de la posición cerrada con el ticket de la abierta, devuelve "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 comparación de un comentario de una posición cerrada con un ticket de una posición abierta, devuelve "0,0".

Del comentario se debe destacar el ticket, es decir, se deben eliminar los caracteres extra como "de #" y "a #". No se hace aquí.

 
Ihor Herasko:

Del comentario hay que destacar el ticket, es decir, eliminar los caracteres extra como "de #" y "a #". Esto no se hace aquí.

¡Exactamente! ¿Cómo se corta "a #"?
 
PolarSeaman:
¡Exactamente! ¿Cómo se corta "a #"?
encontrar la ocurrencia del carácter/subcadena # y (opcionalmente) asegurarse de que es "de" o "a" antes de ella

tomar la parte sobrante y convertirla en larga

en-5e, hay un regexp rudimentario - será más fácil

 
Maxim Kuznetsov:
encontrar la ocurrencia del carácter/subcadena #
¿Encontrar con qué?
 
PolarSeaman:
¿Cómo lo encuentro?

¿No funciona la búsqueda del sitio? ¿No tiene documentación en la parte superior de la página?

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

¿No funciona la búsqueda del sitio? ¿No tiene documentación en la parte superior de la página?

Gracias, he hecho esto.

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

pero la función de historial de búsqueda comenzó a devolver el beneficio actual en la posición abierta

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

> Gracias, así es como lo hice.

No vuelvas a hacerlo :-) no puedes confiar en la longitud o el inicio de un fragmento cuando se trata de cadenas indefinidas

Hay una buena función StringFind() - busca "#" o "de #".

ps/ también debe utilizar una sola letra, ya sea mayúscula o minúscula. Desgraciadamente, no existe un protocolo para etiquetar los comentarios, por lo que es posible que algún servidor diga "FROM #" (en mayúsculas);
en particular algunos ponen [sl] y otros (sl) al final del comentario en el stop-loss. Y el tamaño del comentario está limitado por cierto. Y así sucesivamente.
 

¿Cuál es el perjuicio de esta construcción?

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

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

¿O es mejor hacer deldatetime un tipo largo?