Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 519

 
PolarSeaman:

Come faccio a sapere che nella storia di questa particolare posizione una parte è chiusa?

Ho aperto una posizione con lotto 1.0, l'ho chiusa con 0.5, e con 10$ di perdita. Più tardi ho chiuso un altro 0.25 con 5$ di profitto. Chiuderò tutto a 50$ di profitto. Infatti, ora ho 50 dollari di profitto.

Come faccio a chiudere -$10 e +$5 nel calcolo del profitto corrente? Per chiudere a 55 dollari di profitto

Vedi il commento della posizione (in mql4) - la parte chiusa ha un biglietto della parte rimanente (a#1234556789), la parte rimanente ha un biglietto della parte chiusa (da#123456788) - non ricordo dove ci sono lacune - vedrai da solo

 
Artyom Trishkin:

Guarda il commento della posizione (in mql4) - la parte chiusa ha un biglietto del resto (a#1234556789), il resto ha un biglietto di quello chiuso (da#123456788) - non ricordo dove sono gli spazi - vedrai da solo

Confronto il commento della posizione chiusa con il biglietto di quella aperta, restituisce "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:

Confrontando un commento di una posizione chiusa con un biglietto di una posizione aperta, restituisce "0.0".

Dal commento il biglietto dovrebbe essere evidenziato, cioè i caratteri extra come "from #" e "to #" dovrebbero essere rimossi. Non si fa qui.

 
Ihor Herasko:

Dal commento è necessario evidenziare il biglietto, cioè rimuovere i caratteri extra come "from #" e "to #". Questo non viene fatto qui.

Esattamente! Come si fa a tagliare "a #"?
 
PolarSeaman:
Esattamente! Come si fa a tagliare "a #"?
trova l'occorrenza del carattere/sottostringa # e (opzionalmente) si assicura che sia "da" o "a" prima di esso

prendere la parte rimanente e convertirla in lungo

in-5e, c'è una rudimentale regexp - sarà più facile

 
Maxim Kuznetsov:
trova l'occorrenza del carattere/sottostringa #
Trovare con cosa?
 
PolarSeaman:
Come lo trovo?

La ricerca del sito non funziona? Non avete la documentazione in cima alla pagina?

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

La ricerca del sito non funziona? Non avete la documentazione in cima alla pagina?

Grazie, ho fatto questo.

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

ma la funzione di ricerca storica ha iniziato a restituire il profitto corrente sulla posizione aperta

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

> Grazie, è così che ho fatto.

Non farlo più :-) non puoi fare affidamento sulla lunghezza o sull'inizio di un frammento quando hai a che fare con stringhe indefinite

C'è una bella funzione StringFind() - cerca "#" o "da #".

ps/ si dovrebbe anche usare un solo caso, sia maiuscolo che minuscolo. Purtroppo non c'è un protocollo per etichettare i commenti, quindi è possibile che qualche server dica "DA #" (in lettere maiuscole);
in particolare alcuni mettono [sl] e alcuni (sl) alla fine del commento allo stop-loss. E la dimensione del commento è limitata a proposito. E così via.
 

Che male c'è in un tale disegno?

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

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

O è meglio renderedatetime un tipo lungo?