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

 
-Aleks-:

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.
 
Alexey Viktorov:
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

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?

 
-Aleks-:

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*******************/
void OnStart()
{
   string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
   Print(i);
   Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
 
Alexey Viktorov:
Eseguilo in questo modo.

/********************Script program start function*******************/
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?

 
-Aleks-:

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.
 
Alexey Viktorov:
Non ci sono zeri nel mio codice. Guarda come è scritto.

Grazie - ho perso uno zero.

Questa è la costruzione.

string CalcX=
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

long testX = StringToDouble(CalcX);
Print("testX=",testX);

Probabilmente dovrei tagliare la corda, ma come posso farlo in modo ottimale?


 
-Aleks-:

Sì, la variabile stringa ottiene il numero corretto (preliminarmente), ma vengono aggiunti gli zeri 161188.00000000, come me ne libero?

Analizza la stringa usando il delimitatore ".".
 
Artyom Trishkin:
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);
  }
//+------------------------------------------------------------------+
 
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
 
-Aleks-:

Grazie - mi mancava lo zero.

È venuta fuori questa costruzione

string CalcX=
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

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