Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 106
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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