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
long CalcX= 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
long CalcX= 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?
Eseguilo in questo modo.
/********************Script program start function*******************/ voidOnStart() { string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0); Print(i); Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point); }/*******************************************************************/
Potete dirmi come implementare un indicatore in modo che la seconda coordinata temporale nella linea di tendenza sia impostata dal tempo di sfondamento o dal suo tocco. Cioè, la linea di tendenza ha il suo inizio in un certo posto, e il tempo della seconda coordinata è impostato a discrezione, ma la linea dovrebbe finire dove si interseca con una candela. Come per esempio nell'indicatore mostrato nell'immagine
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
long testX = StringToDouble(CalcX); Print("testX=",testX);
Probabilmente dovrei tagliare la corda, ma come posso farlo in modo ottimale?
Non c'è bisogno di tagliare nulla. La conversione in stringa è solo per vedere il numero giusto. Non devi fare nulla per i calcoli.
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
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