Non riesco a spiegare come.... modelli funzionano è così - finché non si chiama una tale funzione, il compilatore non sa nulla della sua esistenza (spesso, non ci sono nemmeno errori di compilazione se non c'è una chiamata)
poi si chiama una tale funzione template e il compilatore riempie i tipi necessari e solo allora controlla che tutto funzioni correttamente
e poi si fa un'altra chiamata al modello con diversi tipi di parametri - e il compilatore crea una nuova funzione, cioè una in più, cioè come se si scrivessero 2 funzioni, che fanno la stessa cosa, ma con diversi tipi di parametri
whew, ecco come funziona ))))
UPD:
è possibile, ma se i tipi nel template corrispondono, ecco un esempio, funziona correttamente:
Grazie, ancora più chiaro che nei docs) Si scopre che nel template la predefinizione delle variabili non permette di non specificarle. Ne ho bisogno per stampare su un file. Il registro non mi dà la possibilità di dividere i record. Vorrei che ci fossero 5 tronchi). Di conseguenza, i template danno un'opzione per non portare il tipo di variabile a quello desiderato, può essere fatto all'interno di una funzione template, ma il numero di variabili deve essere specificato per intero. Una semplice funzione con variabili predefinite del tipo richiesto dà la possibilità di specificare meno variabili in una chiamata, ma i tipi di variabili devono essere portati a quello giusto. Naturalmente, questo può essere fatto alla chiamata, ma la registrazione sarà troppo lunga.
Ho creato una funzione per modificare lo stoploss. Ma quando funziona dà EURUSD,H1: OrderModify error 130.
E il prezzo è lontano dal luogo in cui lo stoploss dovrebbe essere impostato.
Ecco la funzione:
....
err=OrderModify(OrderTicket(), OrderOpenPrice(),New_Stop( NormalizeDouble(OrderOpenPrice()+spred*point,
digits)), OrderProfit(), 0, clrNONE);// Цена открытия плюс спред может быть в зоне заморозки.
.....
.....
double New_Stop(double Parametr) // Проверка стоп-прик.
{
double Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанцияif(Parametr<Min_Dist) // Если меньше допуст.
{
Parametr=Min_Dist; // Установим допуст.Alert("Increased the distance of a stop order or the opening price of pending orders.");
}
return(Parametr); // Возврат значения
}
1 quale condizione aggiungere per non chiudere gli ordini che sono stati aperti il venerdì della settimana corrente, e i venerdì delle settimane precedenti, rispettivamente, sono stati chiusi?
2. come correggere il codice - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
per rimuovere l'avviso"possibile perdita di dati a causa della conversione del tipo"? Sembra che si tratti di "...MarketInfo(nameSym,MODE_DIGITS)...".
Buona sera. Come dovrebbe essere il codice che seleziona l'ultimo ordine chiuso? È davvero così:"OrderSelect(OrdersHistoryTotal, SELECT_BY_POS, MODE_HISTORY"?
1 quale condizione aggiungere per non chiudere gli ordini che sono stati aperti il venerdì della settimana corrente, e i venerdì delle settimane precedenti, rispettivamente, sono stati chiusi?
2. come correggere il codice - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
per rimuovere l'avviso"possibile perdita di dati a causa della conversione del tipo"? Deve trattarsi di "...MarketInfo(nameSym,MODE_DIGITS)...".
Per la prima domanda, dovete fare questa funzione:
for(int is=OrdersTotal()-1; is>=0; is--)
{
if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))
{//Chiudi gli ordini che sono stati aperti il venerdì della settimana che non è quella corrente. In questo caso, non chiudiamo gli ordini il venerdì della settimana corrente.
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
Non è necessario scrivere questo codice in OnInit, ma in OnTick().
No, non puoi.
Non riesco a spiegare come.... modelli funzionano è così - finché non si chiama una tale funzione, il compilatore non sa nulla della sua esistenza (spesso, non ci sono nemmeno errori di compilazione se non c'è una chiamata)
poi si chiama una tale funzione template e il compilatore riempie i tipi necessari e solo allora controlla che tutto funzioni correttamente
e poi si fa un'altra chiamata al modello con diversi tipi di parametri - e il compilatore crea una nuova funzione, cioè una in più, cioè come se si scrivessero 2 funzioni, che fanno la stessa cosa, ma con diversi tipi di parametri
whew, ecco come funziona ))))
UPD:
è possibile, ma se i tipi nel template corrispondono, ecco un esempio, funziona correttamente:
Grazie, ancora più chiaro che nei docs) Si scopre che nel template la predefinizione delle variabili non permette di non specificarle. Ne ho bisogno per stampare su un file. Il registro non mi dà la possibilità di dividere i record. Vorrei che ci fossero 5 tronchi). Di conseguenza, i template danno un'opzione per non portare il tipo di variabile a quello desiderato, può essere fatto all'interno di una funzione template, ma il numero di variabili deve essere specificato per intero. Una semplice funzione con variabili predefinite del tipo richiesto dà la possibilità di specificare meno variabili in una chiamata, ma i tipi di variabili devono essere portati a quello giusto. Naturalmente, questo può essere fatto alla chiamata, ma la registrazione sarà troppo lunga.
Buon pomeriggio a tutti!
Ho creato una funzione per modificare lo stoploss. Ma quando funziona dà EURUSD,H1: OrderModify error 130.
E il prezzo è lontano dal luogo in cui lo stoploss dovrebbe essere impostato.
Ecco la funzione:
Prova in questo modo:
Grazie, ha funzionato!
Ma due sfumature in più:
1 quale condizione aggiungere per non chiudere gli ordini che sono stati aperti il venerdì della settimana corrente, e i venerdì delle settimane precedenti, rispettivamente, sono stati chiusi?
2. come correggere il codice - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
per rimuovere l'avviso"possibile perdita di dati a causa della conversione del tipo"? Sembra che si tratti di "...MarketInfo(nameSym,MODE_DIGITS)...".
Si prega di avvisare.
Nel tester, il valore di ritorno della funzione di somma dei lotti GetAmountLotFromOpenPos dà un valore di -1717986918.
Ho trovato la ragione. Avrei dovuto mettere OrderTakeProfit() in OrderModify invece di OrderProft(). L'ho guardato un po'.
Grazie per l'aiuto comunque.
Grazie, ha funzionato!
Ma due sfumature in più:
1 quale condizione aggiungere per non chiudere gli ordini che sono stati aperti il venerdì della settimana corrente, e i venerdì delle settimane precedenti, rispettivamente, sono stati chiusi?
2. come correggere il codice - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
per rimuovere l'avviso"possibile perdita di dati a causa della conversione del tipo"? Deve trattarsi di "...MarketInfo(nameSym,MODE_DIGITS)...".
Per la prima domanda, dovete fare questa funzione:
{Print("Errore durante la selezione dell'ordine", GetLastError();}
Per la seconda domanda, ci dovrebbe essere la seguente voce:
OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(MarketInfo(nameSym,MODE_ASK)), 3, clrNONE);
Buona fortuna.