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

 
perché i punti di tempo e di prezzo da 2 a 30 sono disponibili inObjectCreate? provato ad aggiungere al grafico, solo il primo punto è mostrato
ObjectCreate(0,"name",OBJ_ARROW_LEFT_PRICE,0,TimeCurrent()-600,1.29400,TimeCurrent()-1200,1.29500);   
 
Valerius:

Non è necessario scrivere questo codice in OnInit, ma in OnTick().

L'ho provato, non funziona affatto.
1 avvertimento
 
Igor Makanu:

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.

 
Valerius:

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:


....
    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);                            // Возврат значения
  }
 
Valerius:

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)...".

 
Buona sera. Come dovrebbe essere il codice che seleziona l'ultimo ordine chiuso? È davvero così:"OrderSelect(OrdersHistoryTotal, SELECT_BY_POS, MODE_HISTORY"?
 
La funzione GetAmountLotFromOpenPos restituisce -1717986918 come posso risolvere il problema?
 

Si prega di avvisare.

Nel tester, il valore di ritorno della funzione di somma dei lotti GetAmountLotFromOpenPos dà un valore di -1717986918.

 
Valeriy Yastremskiy:

Ho trovato la ragione. Avrei dovuto mettere OrderTakeProfit() in OrderModify invece di OrderProft(). L'ho guardato un po'.

Grazie per l'aiuto comunque.

 
Yerkin Sagandykov:

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:


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(OrderMagicNumber()==Magic && TimeDayOfWeek(TimeCurrent())==5 && TimeDayOfWeek(OrderOpenTime())==5 && TimeDayOfYear(OrderOpenTime())<TimeDayOfYear(TimeCurrent())
{
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);
if(!result) {error=GetLastError(); Print("LastError = ",error, ",Symbol()); }
else {error=0;}
else
{Print("NoMagic ",OrderMagicNumber();} // per Debug
else

{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.