Erros, bugs, perguntas - página 1167

 
Swan:
talvez, mas parece ter sido transmitida correctamente. A janela dasVariáveis Globais arredondada para cima, exibe 17 dígitos.
18...
 
TheXpert:
Casta da União para o salvamento. É legal em mql5 mesmo através de estruturas.
MQL4. O que se pode fazer?
 
artmedia70:
MQL4. O que é que se pode imaginar?
O novo MQL4 não está puxado para MQL5?
 
marketeer:
O novo MQL4 não está puxado para MQL5?
Não exactamente. Embora, a julgar pela Ajuda, seja quase a mesma coisa. Mas não vamos julgar. Estamos interessados no resultado.
 
artmedia70:
MQL4. O que se pode fazer?

Vejamos...

Aqui está um guião com o princípio, deve funcionar tanto para 4 como para 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:
Não exactamente. Embora a julgar pelos Socorros, é praticamente a mesma coisa. Mas nós não vamos julgar. Estamos interessados no resultado.
Penso que TheXpert nos mostrou como obter o resultado. Já há suficiente de sintaxe de 5 em 4.
 
TheXpert:

Vejamos...

Aqui está um guião com o princípio, deve funcionar em 4 e 5

Isto é realmente esquisito...

#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;
}
//+------------------------------------------------------------------+

longo, convertido para o dobro, exibe zero. Embora, depois disso, o duplo zero seja normalmente convertido de novo em zero longo. Não percebo...


O que é que... ????????????

 
artmedia70:
E olhar para o depurador? Há aí um valor muito pequeno, não nulo. Ainda está a funcionar, de que mais precisa?
 
TheXpert:
E procurar no depurador? Existe aí um valor muito pequeno, não nulo. Ainda funciona, de que mais precisa?

Ver. Envio a identificação da janela (é longa) para o terminal do globo (são duplos). Preciso de um conjunto de indicadores instalados em diferentes, qualquer gráfico (o Expert Advisor irá defini-los) para ler o valor de identificação do gráfico do Expert Advisor controlador e enviar os seus dados para este mesmo gráfico. O Conselheiro Especialista, por sua vez, processará todos estes dados e depois trabalhará com eles. Vejo zero no terminal global, e não estou tão certo de que o indicador receba a identificação necessária do gráfico desejado e envie os seus dados para lá. Vejo zero. E não coincide com a identificação do gráfico, no qual o Expert Advisor trabalha. Preciso de ter a certeza.
Se não conseguir converter os dados correctamente, terei de utilizar o ficheiro csv. No entanto, quero resolver o problema da conversão de dados sem perdas. E não há perda, mas sim adição de 2 ao valor real.

Tentei converter em cordel - a mesma coisa - aumenta em 2 o valor enviado 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

Não compreendo...

 

Ta maaa...

Tem que se colocar um duplo do muito antes da transferência. Para variável global. Não há valor zero, é apenas uma dable aleatória, pode dizer-se que 1,34*e-307 pode ser 4,29*e+120, porque há bits de comprimento.

Após a transmissão, abrir o zíper de dub para long.

É isso mesmo.