Ottenere il numero di posizioni decimali di qualsiasi numero (non solo le virgolette) bypassando Digits() in MQL4 e MQL5 - pagina 9

 
Mesaoria:

Non è affatto quello di cui stavo parlando. L'idea di convertire un duble in una stringa in modo da poter poi contare i caratteri nella stringa è una completa assurdità. Non importa cosa fai.

Qual è il problema? Finora, questa opzione è la più veloce, la più funzionale e garantita corretta. Quali sono le sue opzioni?

 
Alexandr Sokolov:
Sì, la mia variante non è probabilmente la migliore, ma dato che non ho mai trovato nulla al riguardo, è la migliore che mi è venuta in mente da sola, ho commentato sopra, mentre tu non hai suggerito la tua variante.

Ho confrontato queste varianti:

int ds(double v){
   string s=(string)v;
   int l=StringLen(s);
   int n=l-StringFind(s,".",0)-1;
   if(StringSubstr(s,l-1,1)=="0")n--;
   return(n);
}

int d(double x){
   int n;
   for(n=0;n<8;n++){
      if(x==NormalizeDouble(x,n)){
         return(n);
      }
   }
   return(n-1);
}

La variante stringa è leggermente più veloce, e non è limitata a 8 cifre come d(). E la garanzia di correttezza è data dal modo in cui il terminale visualizza il numero.

Scelgo la variante con conversione in stringa.

 
Dmitry Fedoseev:

Qual è il problema? Finora, questa opzione è la più veloce, la più funzionale, garantita per essere quella giusta. Quali sono le sue opzioni?

Puoi citare almeno un caso di applicazione dell'algoritmo di cui sopra?

 
Mesaoria:

Puoi citare almeno un caso di applicazione dell'algoritmo di cui sopra?

C'era un caso in cui il pannello di trading emetteva la dimensione del lotto con il numero corretto di decimali nel campo di testo. Questo è l'unico caso.

 
Dmitry Fedoseev:

C'è stato un caso in cui il pannello di trading ha emesso la dimensione del lotto con il numero corretto di cifre decimali nella casella di testo. Questo è l'unico caso.

Cioè emette "1" in caso di 1 lotto e "0.01" in caso di 0.01 lotto?

 
Mesaoria:

Quindi emette "1" nel caso di 1 lotto e "0,01" nel caso di 0,01 lotti?

Non esattamente. Dipende dal lotto minimo e dal passo del lotto. Se il lotto minimo è 0,01, allora 1 viene visualizzato come 1,00

 
Dmitry Fedoseev:

Non proprio. A seconda del lotto minimo e dell'incremento del lotto. Se il lotto minimo è 0,01, allora 1 viene visualizzato come 1,00

O.o.

Quindi risulta che non stai usando la tua funzione, ma stai ancora visualizzando qualcosa come DoubleToString(LotSize, <qualche valore const>), no?

 
Mesaoria:

O.o

Quindi risulta che non usi la tua funzione, ma emetti comunque qualcosa come DoubleToString(LotSize, <qualche valore const>), no?

Sì, ma bisogna sapere quante cifre decimali emettere.

 
Dmitry Fedoseev:

Sì, ma bisogna sapere quante cifre decimali emettere.

In altre parole, usi il min.lot (o l'incremento del lotto) inserito dall'utente per determinare quante cifre decimali ha questo valore, e poi lo salvi per normalizzare i valori futuri?

 
Mesaoria:

Cioè, si determina dal min.lot (o incremento del lotto) inserito dall'utente quante cifre dopo la virgola ci sono in quel valore, e poi lo si salva per normalizzare i valori futuri?

Cos'è che non capisci? Il prezzo ha Digits(), mentre il volume no. Ecco come si calcola.

Perché avete bisogno delle cifre del volume? La stessa ragione per cui abbiamo bisogno delle cifre dei prezzi!