Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 106

 
-Aleks-:

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)

Basta con dividir por _Punto.
 
Alexey Viktorov:
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

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;

¿Alguna idea de cuál es el error y cómo solucionarlo?

 
-Aleks-:

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

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;

¿Alguna idea de cuál es el error y cómo solucionarlo?

Hazlo así.

/********************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:
Hazlo así.

/********************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 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?

 
-Aleks-:

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.
 
Alexey Viktorov:
No hay ceros en mi código. Mira cómo está escrito.

Gracias, me faltó un cero.

Esta es la construcción.

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

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

Probablemente debería cortar la cuerda, pero ¿cómo puedo hacerlo de forma óptima?


 
-Aleks-:

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?

Analizar la cadena utilizando el delimitador ".
 
Artyom Trishkin:
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);
  }
//+------------------------------------------------------------------+
 
Me pueden decir cómo implementar un indicador para que el segundo tiempo de coordenadas en la línea de tendencia sea fijado por el tiempo de ruptura o su toque. Es decir, la línea de tendencia tiene su inicio en un lugar determinado, y el tiempo de la segunda coordenada se establece a discreción, pero la línea debe terminar donde se cruza con una vela. Como por ejemplo en el indicador que se muestra en la imagen
 
-Aleks-:

Gracias - Me perdí el cero.

Se ha llegado a esta construcción

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

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

Probablemente debería cortar la cuerda, pero ¿cómo puedo hacerlo de forma óptima?


No es necesario cortar nada. La conversión a cadena es sólo para ver el número correcto. No tienes que hacer nada para los cálculos.

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