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

 
Pomeriggio. Aiuto con questa funzione per favore, somma la perdita di ordini chiusi, quando usato con la funzione ordini chiusi metatrader si blocca, penso che ci sia qualche tipo di errore in questa funzione.
double ClosProfit()
{
double summa=0;
int orders=OrdersHistoryTotal();
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Error in history!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
//---
if(OrderProfit()>0) break;
Se(OrderProfit()<0)i++;
}
If(i<0)
summa=OrderProfit()+summa;
}
Se(OrderProfit()>summa)
summa=OrderProfit()+summa;
return(summa);
}
 
Lowech:
Salve. Per favore aiutatemi con questa funzione, riassume le perdite degli ordini chiusi, metatrader va in crash quando viene usata con la funzione ordini chiusi, penso che ci sia qualche tipo di errore in questa funzione.

È meglio guardare quelli già pronti e adattarli se necessario. GetProfitFromDateInCurrency()

 
Lowech:
Pomeriggio. Aiuto con la funzione per favore, riassume la perdita di ordini chiusi, quando usato con la funzione ordini chiusi metatrader si blocca, penso che ci sia qualche tipo di errore in questa funzione.

Cosa significa che Metatrader si blocca? Il programma si compila con errori!!!

In tre posti invece di se con una lettera minuscola si dice Se con una lettera maiuscola

una coppia di parentesi graffe è chiaramente inutile: la prima dopo int orders=OrdersHistoryTotal(); e la sua coppia dopo summa=OrderProfit()+summa; - ma questo non è importante

c'è anche...

 
Lowech:
Pomeriggio. Aiuto con questa funzione per favore, riassume la perdita di ordini chiusi, quando viene usata con la funzione ordini chiusi Metatrader si blocca, penso che ci sia qualche tipo di errore in questa funzione.

Prova questo:

double ClosProfit()
{ double summa=0;
  int orders=OrdersHistoryTotal(); 
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0.0) summa=OrderProfit()+summa;
  }
  return(summa);
}
 
Ero in ritardo di 2 minuti nello scrivere... Consideriamo attentamente questa parte:
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
    {
      Print("Error in history!");
      break;
    }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()>0) break;
    if(OrderProfit()<0)i++;
  }
  if(i<0)

Compilato con la direttiva #property strict - è l'ultima linea: 'i' - identificatore non dichiarato. Il punto è che la variabile è dichiarata in un ciclo ed è valida solo nel ciclo. Senza la direttiva #property strict si compila senza errori, ma questo è male. La direttiva deve essere usata.

È più facile scrivere if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) invece di if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)). Ora il prossimo passo è una pausa - questa è l'uscita dal ciclo. Ma dobbiamo elaborare gli altri ordini. Tuttavia, sulla storia, questo non è necessario. L'errore si verifica su ordini a mercato e in sospeso, se al momento dell'elaborazione, l'ordine è chiuso e manca. La regola generale è if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continua; - continua a processare i prossimi ordini

Per la stessa ragione, sostituite if(OrderProfit()>0) break; con if(OrderProfit()>0) continue;

Ed ecco la ragione dell'errore: if(OrderProfit()<0)i++; - if(OrderProfit()>0; - l'indice viene incrementato. E l'intestazione del ciclo for(int i=orders-1;i>=0;i--) lo diminuisce. L'elaborazione dello stesso ordine si ripete e il programma entra in un ciclo. Questo è probabilmente il modo in cui dovrebbe essere:

#property   strict
double ClosProfit()
{
  double summa=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--)
  {
    if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0) summa+=OrderProfit();
  }
  return(summa);
}
 
STARIJ:
2 minuti di ritardo durante la scrittura ... Consideriamo attentamente questa parte:

Compilato con la direttiva #property strict - è l'ultima linea: 'i' - identificatore non dichiarato. Il punto è che la variabile è dichiarata in un ciclo ed è valida solo nel ciclo. Senza la direttiva #property strict si compila senza errori, ma questo è male. La direttiva deve essere usata.

È più facile scrivere if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) invece di if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)). Ora il prossimo passo è una pausa - questa è l'uscita dal ciclo. Ma dobbiamo elaborare gli altri ordini. Tuttavia, sulla storia, questo non è necessario. L'errore si verifica su ordini a mercato e in sospeso, se al momento dell'elaborazione, l'ordine è chiuso e manca. La regola generale è if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continua; - continua a processare i prossimi ordini

Per la stessa ragione if(OrderProfit()>0) break; sostituire con if(OrderProfit()>0) continue;

Ed ecco la ragione dell'errore: if(OrderProfit()<0)i++; - if(OrderProfit()>0; l'indice viene incrementato. E l'intestazione del ciclo for(int i=orders-1;i>=0;i--) lo diminuisce. L'elaborazione dello stesso ordine si ripete e il programma entra in un ciclo. Questo è probabilmente il modo in cui dovrebbe essere:


Grazie, niente più crash di metatrader).

if(OrderProfit()>0) break; sostituire con if(OrderProfit()>0) continue;

Voglio che questa funzione ignori questo profitto quando un ordine chiude in profitto. Voglio solo che includa l'importo della perdita prima che il primo ordine chiuda in profitto. Cioè

if(OrderProfit()>0) break;


Dovrei fermare il contatore se l'ordine ha chiuso in profitto, lo vedo correttamente?
 
Lowech:

Grazie, niente più crash di metatrader) Quello di cui ho bisogno è che se un ordine chiude in profitto, la funzione non tenga conto di questo profitto, solo dell'importo della perdita e fino al primo ordine chiuso in profitto. Cioè
Dovrei fermare il contatore se l'ordine ha chiuso in profitto, lo vedo correttamente?
Il tuo ragionamento è quasi corretto. Non c'è alcuna garanzia di collocamento dell'ordine nella storia. Per te stesso puoi, ma per vendere - male.
 
STARIJ:
Il tuo ragionamento è quasi corretto. Non c'è garanzia di una disposizione d'ordine nella storia. Per te stesso - sì, ma per vendere - male.
Il ciclo basato sull'ordine non calcola gli ordini in ordine?
 
STARIJ:

Se c'è una fonte - DROW_NONE - nessun disegno

Non ha aiutato, mostra ancora i numeri nell'angolo

 
Lowech Il ciclo degli ordini non conta gli ordini in ordine?

In ordine di ordine nella lista. Ma non c'è garanzia di alcun ordine in questa lista

Motivazione: