Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 287
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
{
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;
summa=OrderProfit()+summa;
}
}
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()
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...
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:
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:
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;
if(OrderProfit()>0) break;
Dovrei fermare il contatore se l'ordine ha chiuso in profitto, lo vedo correttamente?
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'è garanzia di una disposizione d'ordine nella storia. Per te stesso - sì, ma per vendere - male.
Se c'è una fonte - DROW_NONE - nessun disegno
Non ha aiutato, mostra ancora i numeri nell'angolo
In ordine di ordine nella lista. Ma non c'è garanzia di alcun ordine in questa lista