Errores, fallos, preguntas - página 1167

 
Swan:
quizás, pero parece que se transmite correctamente. La ventana deVariables Globales redondea, muestra 17 dígitos.
18...
 
TheXpert:
La casta sindical al rescate. Es legal en mql5 incluso a través de estructuras.
MQL4. ¿Qué puedes hacer?
 
artmedia70:
MQL4. ¿Qué puedes imaginar?
¿No es el nuevo MQL4 el que se ha subido a MQL5?
 
marketeer:
¿No es el nuevo MQL4 el que se ha subido a MQL5?
No exactamente. Aunque, a juzgar por la Ayuda, es casi lo mismo. Pero no vamos a juzgar. Nos interesa el resultado.
 
artmedia70:
MQL4. ¿Qué puedes hacer?

Veamos...

Aquí hay una secuencia de comandos con el principio, debe trabajar para ambos 4 y 5

struct DoubleContainer
{
   double value;
};

struct LongContainer
{
   long value;
};

long ToLong(double value)
{
   DoubleContainer d; d.value = value;
   LongContainer l = (LongContainer)d;
   return l.value;
}

double ToDouble(long value)
{
   LongContainer l; l.value = value;
   DoubleContainer d = (DoubleContainer)l;
   return d.value;
}

void OnStart()
{
   long l = 130462919691841406;
   double d1 = (double)l;
   long l1 = (long)d1;
   double d2 = ToDouble(l);
   long l2 = ToLong(d2);
}
 
Vinin:
No exactamente. Aunque a juzgar por las Ayudas, es más o menos lo mismo. Pero no vamos a juzgar. Nos interesa el resultado.
Creo que TheXpert nos enseñó cómo conseguir el resultado. Ya hay suficiente sintaxis del 5 en el 4.
 
TheXpert:

Veamos...

Aquí hay una secuencia de comandos con el principio, debe trabajar en 4 y 5

Esto es realmente extraño...

#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long l = 130462919691841406;
   //--- приведение типов
   double d1 = (double)l;
   long l1 = (long)d1;
   //--- преобразование типов
   double d2 = ToDouble(l);
   long l2 = ToLong(d2);
   //--- поглядим чё натворили
   Print("long-значение l = "+IntegerToString(l));
   Print("long l привели к типу double d1 = "+DoubleToString(d1,Digits));
   Print("double d1 привели к типу long l1 = "+IntegerToString(l1));
   Print("long l преобразовали в double d2 = "+DoubleToString(d2,Digits));
   Print("double d2 преобразовали в long l2 = "+IntegerToString(l2));
   ToDoubleString(l);
  }
//+------------------------------------------------------------------+
struct DoubleContainer
{
   double value;
};
//+------------------------------------------------------------------+
struct LongContainer
{
   long value;
};
//+------------------------------------------------------------------+
long ToLong(double value)
{
   DoubleContainer d; d.value = value;
   LongContainer l = (LongContainer)d;
   return l.value;
}
//+------------------------------------------------------------------+
double ToDouble(long value)
{
   LongContainer l; l.value = value;
   DoubleContainer d = (DoubleContainer)l;
   return d.value;
}
//+------------------------------------------------------------------+
double ToDoubleString(long long_value) {
   string long_value_str=IntegerToString(long_value);
   double double_value=StrToDouble(long_value_str);
   Print("long_value = "+IntegerToString(long_value)+", double_value = "+DoubleToString(double_value,Digits));
   return double_value;
}
//+------------------------------------------------------------------+

long, convertido en doble, muestra cero. Aunque, después, el doble cero se convierte normalmente en long. No lo entiendo...


¿Qué...? ????????????

 
artmedia70:
¿Y mirar en el depurador? Hay un valor muy pequeño que no es cero. Sigue funcionando, ¿qué más necesitas?
 
TheXpert:
¿Y buscarlo en el depurador? Hay un valor muy pequeño que no es cero. Todavía funciona, ¿qué más necesitas?

Ver. Envío el id de la ventana (es largo) al terminal del globo (son dobles). Necesito que un conjunto de indicadores instalados en un gráfico diferente, cualquiera (el Asesor Experto los establecerá) lea el valor de ID del gráfico del Asesor Experto que lo controla y envíe sus datos a este mismo gráfico. A su vez, el Asesor Experto procesará todos estos datos y trabajará con ellos. Veo cero en el terminal global, y no estoy tan seguro de que el indicador reciba el id necesario del gráfico deseado y envíe sus datos allí. Yo veo cero. Y no coincide con el id del gráfico en el que trabaja el Asesor Experto. Necesito estar seguro.
Si no puedo convertir los datos correctamente, tendré que utilizar el archivo csv. Sin embargo, quiero resolver el problema de la conversión de datos sin pérdidas. Y aquí no hay ninguna pérdida, sino una adición de 2 al valor real.

Intenté convertir a cadena - lo mismo - aumenta en 2 el valor enviado largo 130462919691841406:

//+------------------------------------------------------------------+
void ToDoubleString(long long_value) {
   string long_value_str=IntegerToString(long_value);
   double double_value=StrToDouble(long_value_str);
   Print("long_value = "+long_value_str+", double_value = "+DoubleToString(double_value,Digits));
}
//+------------------------------------------------------------------+

resultado:

2014.07.07 00:45:08.513 LongToDouble EURUSD,H4: long_value = 130462919691841406, double_value = 130462919691841408.00000

No entiendo...

 

Ta maaa...

Tienes que poner un doble de la larga antes de la transferencia. Para la variable global. No hay un valor cero, es sólo un dable aleatorio, puede ser digamos 1,34*e-307 puede ser 4,29*e+120, porque hay bits de largo.

Después de la transmisión, descomprimir de dub a long.

Eso es todo.