Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 106
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
Per favore, consigliate una soluzione al problema dell'arrotondamento!
Ho bisogno di sbarazzarmi del punto decimale senza un resto - l'arrotondamento e l'esponenziazione non risolvono l'intero problema - cosa dovrei fare?
Per esempio era 1,44430 e ho bisogno di 144430.
Parte del codice - così com'è
NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1)
Basta dividere per _Point.
Stampa risultati errati, l'originale è 161188 (1.61188) il tuo metodo 161187 stampa dà 1.6119 (perché arrotondare fa quando stampa Low[1] se cinque decimali?), la mia versione è 161188.
Ma se complichiamo il problema.
long Calc=
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1);
Cioè l'ultima parte del numero 161184 - cioè la divergenza di 4 unità.
La vostra variante di questa espressione produce lo stesso valore
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
Low[1]/Point;
Qualche idea su quale sia l'errore e come risolverlo?
Stampa risultati errati, l'originale è 161188 (1.61188) il tuo metodo 161187 stampa dà 1.6119 (perché arrotondare fa quando stampa Low[1] se cinque decimali?), la mia versione è 161188.
Ma se complichiamo il problema.
long Calc=
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1);
Cioè l'ultima parte del numero 161184 - cioè la divergenza di 4 unità.
La vostra variante in questa espressione dà lo stesso valore
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
Low[1]/Point;
Qualche idea su quale sia l'errore e come risolverlo?
void OnStart()
{
string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
Print(i);
Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
Eseguilo in questo modo.
void OnStart()
{
string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
Print(i);
Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
Sì, la variabile stringa ottiene il numero corretto (preliminarmente), ma vengono aggiunti gli zeri 161188.00000000, come me ne libero?
Sì, la variabile stringa ottiene il numero corretto (preliminarmente), ma vengono aggiunti gli zeri 161188.00000000, come me ne libero?
Non ci sono zeri nel mio codice. Guarda come è scritto.
Grazie - ho perso uno zero.
Questa è la costruzione.
DoubleToString(Close[1]/_Point,0)+
DoubleToString(High[1]/_Point,0)+
DoubleToString(Low[1]/_Point,0);
Print("CalcX=",CalcX);
Ora ho bisogno di scomporre questi numeri nelle loro componenti.
Quando provo a convertire la stringa in un numero, ottengo di nuovo il numero sbagliato 161184 invece di 161188
Print("testX=",testX);
Probabilmente dovrei tagliare la corda, ma come posso farlo in modo ottimale?
Sì, la variabile stringa ottiene il numero corretto (preliminarmente), ma vengono aggiunti gli zeri 161188.00000000, come me ne libero?
Quindi... mostrami il modello. Come fai a sapere cosa c'è lì dentro?
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Grazie - mi mancava lo zero.
È venuta fuori questa costruzione
DoubleToString(Close[1]/_Point,0)+
DoubleToString(High[1]/_Point,0)+
DoubleToString(Low[1]/_Point,0);
Print("CalcX=",CalcX);
Ora ho bisogno di scomporre questi numeri nelle loro componenti.
Quando provo a convertire la stringa in un numero, ottengo di nuovo il numero sbagliato 161184 invece di 161188
Print("testX=",testX);
Probabilmente dovrei tagliare la corda, ma come posso farlo in modo ottimale?
Bene, se avete un desiderio irrefrenabile di fare un casino, convertite la stringa in un numero StringToDouble() e moltiplicate per _Point con normalizzazione al numero di cifre desiderato, probabilmente _Digits