Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 106

 
-Aleks-:

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.
 
Alexey Viktorov:
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

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?

 
-Aleks-:

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*******************/
void OnStart()
{
   string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
   Print(i);
   Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
 
Alexey Viktorov:
Gehen Sie folgendermaßen vor.

/********************Script program start function*******************/
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?

 
-Aleks-:

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. Sehen Sie sich an, wie er geschrieben ist.
 
Alexey Viktorov:
In meinem Code gibt es keine Nullen. Schauen Sie, wie es geschrieben ist.

Danke - ich habe eine Null übersehen.

Dies ist die Konstruktion.

string CalcX=
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

long testX = StringToDouble(CalcX);
Print("testX=",testX);

Wahrscheinlich sollte ich die Schnur durchschneiden, aber wie kann ich das optimal machen?


 
-Aleks-:

Ja, die String-Variable erhält die richtige Zahl (vorläufig), aber es werden Nullen 161188.00000000 hinzugefügt, wie werde ich sie los?

Parsen der Zeichenkette unter Verwendung des Trennzeichens ".
 
Artyom Trishkin:
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);
  }
//+------------------------------------------------------------------+
 
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
 
-Aleks-:

Danke - ich habe die Null übersehen.

Sie hat diese Konstruktion entwickelt

string CalcX=
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

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
Grund der Beschwerde: