Errori, bug, domande - pagina 101

 
Urain:

In ogni caso.

if(a==0){espressione} significa che se a è 0 allora è vero, quindi esegui {espressione}.

if(a=0){espressione} è equivalente a if(a){a=0;espressione} se a è vero, {a=0;espressione}.

Il secondo è sbagliato, dovrebbe essere scritto così

if(a=x) { espressione } assegna il valore di x alla variabile a, e se a non è 0 dopo questo, allora esegue l'espressione

if(a=0) { } dopo l'ottimizzazione ci sarà solo a=0

 
mql5:

La seconda è sbagliata. Il modo corretto di scriverla è

if(a=x) { espressione } assegna il valore di x alla variabile a, e se a non è 0 dopo questo, esegue l'espressione

if(a=0) { } dopo l'ottimizzazione ci sarà solo a=0

Scusa, è vero, le espressioni vengono eseguite da sinistra a destra.

Ecco perché cominciamo con l'assegnazione, e poi controlliamo la verità.

 
Renat:

Questo è più o meno il caso:

Questo codice non solo calcola il volume massimo, ma lo inserisce anche esattamente nei limiti delle impostazioni del simbolo.

Lo calcola ma dimentica perché lo calcola quando lo inserisce:

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

Il valore del lotto a questo punto è calcolato in modo da consumare tutto il margine disponibile con un margine minimo.

Se questo valore è aumentato di almeno un passo di volume, non ci sarà abbastanza denaro per aprire una posizione.

Ma la seconda linea del codice citato CREA il valore del lotto nel caso in cui la condizione sotto if sia soddisfatta, e può aumentarlo di molto più del valore del passo di volume, perché in realtà ci sono volume min = 0,1 e passo di volume = 0,01.

E in questo codice qui sotto, può verificarsi una divisione per zero, contro la quale non c'è protezione:

   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

Se SymbolInfoDouble() restituisce 0, è finita. I programmi MQL5 terminano sulla divisione per 0, giusto? Non può restituire 0? La gente qui si lamenta che le funzioni informative molto spesso restituiscono 0. Non si può ripiegare su "non restituirà 0" perché, in primo luogo, potrebbe, e in secondo luogo, la divisione per 0 è fatale.

Ci sono alcune osservazioni minori sulla "precisione di inserimento", ma non sono davvero troppo significative, cioè non hanno conseguenze così gravi, si possono ignorare.

Anticipando possibili argomenti che il codice è "approssimativo", faccio notare: quanti utenti del prodotto sono in grado di trovare e sistemare con competenza questi "brutti posti"?

Per loro, questo è "il codice degli sviluppatori". Un esempio a cui guardare.

 

Perché il pulsante "Next" non è attivo quando tutti i campi obbligatori sono compilati?

 
EvgeTrofi:

Perché il pulsante "Next" non è attivo quando tutti i campi obbligatori sono compilati?

È necessario dare il permesso di ricevere la newsletter per posta.
 
simpleton:

Calcola, ma poi dimentica per cosa stava calcolando:

Anticipando possibili argomentazioni sul fatto che il codice è "approssimativo", voglio far notare: quanti utenti del prodotto possono correggere correttamente tali "brutti posti"?

Il codice era approssimativo (copiato da due pezzi), ma i tuoi commenti sono corretti.

Ecco la versione corretta:

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   if(stepvol>0.0)
     {
      double newlot=stepvol*NormalizeDouble(lot/stepvol,0);
      if(newlot>lot) lot=NormalizeDouble(newlot-stepvol,2);
      else           lot=newlot;
     }

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=0.0;   // 

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
 
gumgum:

E perché session_index++; quando session_index=1 è già falso:

Non possiamo sapere in anticipo qual è il numero di sessioni per strumento. Quindi interroghiamo ogni sessione per numero. Se è vero

session_exist=SymbolInfoSessionQuote(symbol,day,session_index,start,finish);

ci interessa il tempo del suo inizio e della sua fine. Se otteniamo false - ecco, non c'è nessuna sessione con questo numero.

 
Rosh:

Non possiamo sapere in anticipo quale sia il numero di sessioni per uno strumento. Perciò richiediamo ogni sessione per numero. Se è vero

analizziamo il tempo del suo inizio e della sua fine. Se otteniamo false - ecco, non c'è nessuna sessione con questo numero.

A...... Perché allora il venerdì tutto finisce alle 24:00, ma in realtà alle 23:00?
 
gumgum:
A...... allora perché tutto finisce il venerdì alle 24:00 e nella realtà alle 23:00?
Perché è quello che dice il server. Lo controlleremo, grazie.
 
Ho capito che ora puoi cambiare la tua email sul tuo profilo? Nel campo E-mail ora puoi fare delle modifiche, ma non vengono salvate!