Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 106
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Por favor, aconséjeme una solución al problema del redondeo.
Necesito deshacerme del punto decimal sin un resto - el redondeo y la exponenciación no resuelven todo el problema - ¿qué debo hacer?
Por ejemplo, era 1,44430 y necesito 144430.
Parte del código - tal cual
NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1)
Sólo hay que dividir por _Punto.
Se imprime un resultado erróneo, el original es 161188 (1.61188) tu método 161187 print da 1.6119 (¿por qué se redondea al imprimir Low[1] si hay cinco decimales?), mi versión es 161188.
Pero si complicamos el 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);
Es decir, la última parte del número 161184 - es decir, la divergencia de 4 unidades.
Su variante de esta expresión produce el mismo valor
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
Low[1]/Point;
¿Alguna idea de cuál es el error y cómo solucionarlo?
Resultado equivocado imprime, el original es 161188 (1,61188) su método 161187 impresión da 1,6119 (¿por qué el redondeo hacia arriba hace cuando imprime Low[1] si cinco decimales?), mi versión es 161188.
Pero si complicamos el 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);
Es decir, la última parte del número 161184 - es decir, la divergencia de 4 unidades.
Su variante en esta expresión da el mismo valor
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
Low[1]/Point;
¿Alguna idea de cuál es el error y cómo solucionarlo?
void OnStart()
{
string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
Print(i);
Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
Hazlo así.
void OnStart()
{
string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
Print(i);
Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
Sí, la variable de cadena obtiene el número correcto (de forma preliminar), pero se añaden los ceros 161188.00000000, ¿cómo me deshago de ellos?
Sí, la variable de cadena obtiene el número correcto (de forma preliminar), pero se añaden los ceros 161188.00000000, ¿cómo me deshago de ellos?
No hay ceros en mi código. Mira cómo está escrito.
Gracias, me faltó un cero.
Esta es la construcción.
DoubleToString(Close[1]/_Point,0)+
DoubleToString(High[1]/_Point,0)+
DoubleToString(Low[1]/_Point,0);
Print("CalcX=",CalcX);
Ahora necesito descomponer estos números en sus componentes.
Cuando intento convertir la cadena en un número, vuelvo a obtener el número incorrecto 161184 en lugar de 161188
Print("testX=",testX);
Probablemente debería cortar la cuerda, pero ¿cómo puedo hacerlo de forma óptima?
Sí, la variable de cadena obtiene el número correcto (de forma preliminar), pero se añaden los ceros 161188.00000000, ¿cómo me deshago de ellos?
Así que... muéstrame el patrón. ¿Cómo sabes lo que hay ahí?
//| 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);
}
//+------------------------------------------------------------------+
Gracias - Me perdí el cero.
Se ha llegado a esta construcción
DoubleToString(Close[1]/_Point,0)+
DoubleToString(High[1]/_Point,0)+
DoubleToString(Low[1]/_Point,0);
Print("CalcX=",CalcX);
Ahora necesito descomponer estos números en sus componentes.
Cuando intento convertir la cadena en un número, vuelvo a obtener el número incorrecto 161184 en lugar de 161188
Print("testX=",testX);
Probablemente debería cortar la cuerda, pero ¿cómo puedo hacerlo de forma óptima?
Pues bien, si tienes unas ganas irrefrenables de liarte, vuelve a convertir la cadena en un número StringToDouble() y multiplícalo por _Punto con normalización al número de dígitos deseado, probablemente _Dígitos