Falsches Ergebnis wird gedruckt, das Original ist 161188 (1.61188) Ihre Methode 161187 print ergibt 1.6119 (warum wird gerundet, wenn print Low[1] fünf Dezimalstellen hat?), meine Version ist 161188.
Aber wenn wir das Problem verkomplizieren.
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);
Das heißt, der letzte Teil der Zahl 161184 - dh Divergenz von 4 Einheiten.
Ihre Variante dieses Ausdrucks ergibt denselben Wert
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;
Haben Sie eine Idee, was der Fehler ist und wie man ihn beheben kann?
Falsche Ergebnisdrucke, das Original ist 161188 (1.61188), Ihre Methode 161187 print ergibt 1.6119 (warum wird aufgerundet, wenn print Low[1] fünf Dezimalstellen hat?), meine Version ist 161188.
Aber wenn wir das Problem verkomplizieren.
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);
Das heißt, der letzte Teil der Zahl 161184 - dh Divergenz von 4 Einheiten.
Ihre Variante in diesem Ausdruck ergibt denselben Wert
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;
Haben Sie eine Idee, was der Fehler ist und wie man ihn beheben kann?
Gehen Sie folgendermaßen vor.
/********************Script program start function*******************/ voidOnStart() { string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0); Print(i); Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point); }/*******************************************************************/
Können Sie mir sagen, wie ich einen Indikator so implementieren kann, dass die zweite Koordinatenzeit in der Trendlinie durch die Durchbruchszeit oder deren Berührung festgelegt wird. Das heißt, die Trendlinie hat ihren Anfang an einem bestimmten Ort, und der Zeitpunkt der zweiten Koordinate wird nach eigenem Ermessen festgelegt, aber die Linie sollte dort enden, wo sie sich mit einer Kerze kreuzt. Wie zum Beispiel bei dem in der Abbildung gezeigten Indikator
Jetzt muss ich diese Zahlen wieder in ihre Bestandteile zerlegen.
Wenn ich versuche, die Zeichenkette in eine Zahl zu konvertieren, erhalte ich wieder die falsche Zahl 161184 statt 161188
long testX = StringToDouble(CalcX); Print("testX=",testX);
Wahrscheinlich sollte ich die Schnur durchschneiden, aber wie kann ich das optimal machen?
Es gibt keinen Grund, etwas zu kürzen. Die Umwandlung in eine Zeichenkette dient lediglich dazu, die richtige Zahl zu ermitteln. Für Berechnungen müssen Sie nichts tun.
Nun, wenn Sie ein überwältigendes Verlangen haben, ein Durcheinander zu machen, konvertieren Sie die Zeichenkette zurück in eine StringToDouble()-Zahl und multiplizieren Sie mit _Point mit Normalisierung auf die gewünschte Anzahl von Ziffern, wahrscheinlich _Digits
Bitte schlagen Sie eine Lösung für das Rundungsproblem vor!
Ich muss das Dezimalkomma loswerden, ohne dass ein Rest übrig bleibt - Runden und Potenzieren lösen das Problem nicht - was soll ich tun?
Zum Beispiel war es 1,44430 und ich brauche 144430.
Teil des Codes - so wie er ist
NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1)
Teilen Sie einfach durch _Point.
Falsches Ergebnis wird gedruckt, das Original ist 161188 (1.61188) Ihre Methode 161187 print ergibt 1.6119 (warum wird gerundet, wenn print Low[1] fünf Dezimalstellen hat?), meine Version ist 161188.
Aber wenn wir das Problem verkomplizieren.
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);
Das heißt, der letzte Teil der Zahl 161184 - dh Divergenz von 4 Einheiten.
Ihre Variante dieses Ausdrucks ergibt denselben Wert
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
Low[1]/Point;
Haben Sie eine Idee, was der Fehler ist und wie man ihn beheben kann?
Falsche Ergebnisdrucke, das Original ist 161188 (1.61188), Ihre Methode 161187 print ergibt 1.6119 (warum wird aufgerundet, wenn print Low[1] fünf Dezimalstellen hat?), meine Version ist 161188.
Aber wenn wir das Problem verkomplizieren.
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);
Das heißt, der letzte Teil der Zahl 161184 - dh Divergenz von 4 Einheiten.
Ihre Variante in diesem Ausdruck ergibt denselben Wert
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
Low[1]/Point;
Haben Sie eine Idee, was der Fehler ist und wie man ihn beheben kann?
void OnStart()
{
string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
Print(i);
Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
Gehen Sie folgendermaßen vor.
void OnStart()
{
string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
Print(i);
Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
Ja, die String-Variable erhält die richtige Zahl (vorläufig), aber es werden Nullen 161188.00000000 hinzugefügt, wie werde ich sie los?
Ja, die String-Variable erhält die richtige Zahl (vorläufig), aber es werden Nullen 161188.00000000 hinzugefügt, wie werde ich sie los?
In meinem Code gibt es keine Nullen. Schauen Sie, wie es geschrieben ist.
Danke - ich habe eine Null übersehen.
Dies ist die Konstruktion.
DoubleToString(Close[1]/_Point,0)+
DoubleToString(High[1]/_Point,0)+
DoubleToString(Low[1]/_Point,0);
Print("CalcX=",CalcX);
Jetzt muss ich diese Zahlen wieder in ihre Bestandteile zerlegen.
Wenn ich versuche, die Zeichenfolge in eine Zahl umzuwandeln, erhalte ich wieder die falsche Zahl 161184 statt 161188
Print("testX=",testX);
Wahrscheinlich sollte ich die Schnur durchschneiden, aber wie kann ich das optimal machen?
Ja, die String-Variable erhält die richtige Zahl (vorläufig), aber es werden Nullen 161188.00000000 hinzugefügt, wie werde ich sie los?
Also... zeigen Sie mir das Muster. Woher wissen Sie, was da drin ist?
//| 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);
}
//+------------------------------------------------------------------+
Danke - ich habe die Null übersehen.
Sie hat diese Konstruktion entwickelt
DoubleToString(Close[1]/_Point,0)+
DoubleToString(High[1]/_Point,0)+
DoubleToString(Low[1]/_Point,0);
Print("CalcX=",CalcX);
Jetzt muss ich diese Zahlen wieder in ihre Bestandteile zerlegen.
Wenn ich versuche, die Zeichenkette in eine Zahl zu konvertieren, erhalte ich wieder die falsche Zahl 161184 statt 161188
Print("testX=",testX);
Wahrscheinlich sollte ich die Schnur durchschneiden, aber wie kann ich das optimal machen?
Nun, wenn Sie ein überwältigendes Verlangen haben, ein Durcheinander zu machen, konvertieren Sie die Zeichenkette zurück in eine StringToDouble()-Zahl und multiplizieren Sie mit _Point mit Normalisierung auf die gewünschte Anzahl von Ziffern, wahrscheinlich _Digits