Fehler, Irrtümer, Fragen - Seite 1167

 
Swan:
vielleicht, aber es scheint korrekt übermittelt zu werden. Das FensterGlobale Variablen rundet auf und zeigt 17 Ziffern an.
18...
 
TheXpert:
Die Gewerkschaftskaste ist die Rettung. Es ist in mql5 sogar durch Strukturen legal.
MQL4. Was können Sie tun?
 
artmedia70:
MQL4. Was können Sie sich vorstellen?
Wird das neue MQL4 nicht auf MQL5 hochgezogen?
 
marketeer:
Wird das neue MQL4 nicht auf MQL5 hochgezogen?
Nicht ganz. Obwohl, der Hilfe nach zu urteilen, ist es fast dasselbe. Aber wir werden nicht urteilen. Wir sind an dem Ergebnis interessiert.
 
artmedia70:
MQL4. Was können Sie tun?

Schauen wir mal...

Hier ist ein Skript mit dem Prinzip, sollte sowohl für 4 und 5 funktionieren

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:
Nicht ganz. Nach den Helfern zu urteilen, ist es aber so ziemlich dasselbe. Aber wir werden nicht urteilen. Wir sind an dem Ergebnis interessiert.
Ich denke, TheXpert hat uns gezeigt, wie wir das Ergebnis erreichen können. Es gibt schon genug von der 5er-Syntax in 4.
 
TheXpert:

Schauen wir mal...

Hier ist ein Skript mit dem Prinzip, es sollte auf 4 und 5 funktionieren

Das ist wirklich seltsam...

#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, umgewandelt in double, zeigt Null an. Allerdings wird die Doppelnull danach normalerweise wieder in einen Long-Wert umgewandelt. Ich versteh das nicht...


Was zum... ????????????

 
artmedia70:
Und im Debugger nachsehen? Es gibt einen sehr kleinen Wert, der nicht Null ist. Es funktioniert immer noch, was brauchen Sie noch?
 
TheXpert:
Und im Debugger nachschauen? Dort gibt es einen sehr kleinen Wert, der nicht Null ist. Es funktioniert immer noch, was brauchen Sie noch?

Siehe. Ich sende die Fensterkennung (sie ist lang) an das Globusterminal (sie ist doppelt). Ich benötige eine Reihe von Indikatoren, die auf einem anderen, beliebigen Chart installiert sind (der Expert Advisor setzt sie), um den ID-Wert des Charts des kontrollierenden Expert Advisors zu lesen und seine Daten an eben diesen Chart zu senden. Der Expert Advisor wird seinerseits alle diese Daten verarbeiten und dann mit ihnen arbeiten. Ich sehe Null im globalen Terminal, und ich bin mir nicht sicher, ob der Indikator die notwendige ID des gewünschten Charts erhält und seine Daten dorthin sendet. Ich sehe null. Und sie stimmt nicht mit der Chart-ID überein, mit der der Expert Advisor arbeitet. Ich muss sicher sein.
Wenn ich die Daten nicht richtig konvertieren kann, muss ich eine csv-Datei verwenden. Ich möchte jedoch das Problem der Datenkonvertierung ohne Verluste lösen. Und es gibt keinen Verlust, sondern eine Addition von 2 zu dem wahren Wert.

Ich habe versucht, in eine Zeichenkette zu konvertieren - das Gleiche - es erhöht den gesendeten Wert um 2 lang 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));
}
//+------------------------------------------------------------------+

Ergebnis:

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

Das verstehe ich nicht...

 

Ta maaa...

Sie müssen einen Doppelgänger aus der Zeit lange vor der Überweisung einfügen. Für globale Variable. Es gibt keinen Nullwert, sondern nur eine zufällige Zahl, die z.B. 1,34*e-307 oder 4,29*e+120 sein kann, weil es lange Bits gibt.

Nach der Übertragung von Dub zu Long auspacken.

Das war's.