Double vs FLOAT - unklarer MathFloor-Fehler

 

Hallo zusammen, ich bin die Genauigkeit der Zitate langsam leid. Normalisierungen und so weiter.

      float AUTOPRICE;
      float askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      float bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
      float Averab=((askP+bidP))/2.0;
      AUTOPRICE=MathFloor(Averab)*Point;
      Print("FLOAT  "+"  askP="+askP+" bidP="+bidP+" Averab="+DoubleToString(Averab,10)+" AUTOPRICE="+DoubleToString(AUTOPRICE,10));

      double AUTOPRICE2;
      double askP2=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP2=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
      double Averab2=((askP2+bidP2))/2.0;
      AUTOPRICE2=MathFloor(Averab2)*Point;
      Print("DOUBLE  "+"  askP2="+askP2+" bidP2="+bidP2+" Averab2="+DoubleToString(Averab2,10)+" AUTOPRICE="+DoubleToString(AUTOPRICE2,10));

Ausbreitung:2

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:DOUBLE askP2=105143 bidP2=105141 Averab2=105142.000000 AUTOPRICE=1.0514200000

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:FLOAT askP=105143 bidP=105141 Averab=105142.0000000000 AUTOPRICE=1.0514199734




Verbreitung:3

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:DOUBLE askP2=105144 bidP2=105141 Averab2=105142.5000000000 AUTOPRICE=1.0514200000

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:FLOAT askP=105144 bidP=105141 Averab=105142.5000000000 AUTOPRICE=1.0514199734


Verbreitung:4

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:DOUBLE askP2=105145 bidP2=105141 Averab2=105143.000000 AUTOPRICE=1.0514200000

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:FLOAT askP=105145 bidP=105141 Averab=105143.0000000000 AUTOPRICE=1.0514299870

Verbreitung:5

2017.02.26 09:58:39.495 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:DOUBLE askP2=105146 bidP2=105141 Averab2=105143.5000000000 AUTOPRICE=1.0514300000

2017.02.26 09:58:39.495 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:FLOATaskP=105146 bidP=105141 Averab=105143.5000000000 AUTOPRICE=1.0514299870

Diese zusätzlichen Zeichen befinden sich irgendwo am Ende des Tunnels..........

 
      double askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);

      double Averab=((askP+bidP)*1)/2.0;
      Print("askP="+askP+" bidP="+bidP+" Averab="+Averab+" MathFloor((int)Averab)="+MathFloor((int)Averab));

bei Spanne=2

askP=105143 bidP=105141 Averab=105142 MathFloor((int)Averab)=105142

bei Spanne=3

askP=105144 bidP=105141 Averab=105142.5 MathFloor((int)Averab)=105142

unter 4!!!! spread

askP=105545 bidP=105141 Averab=105143 MathFloor((int)Averab)=105142

Warum?

 
Vladislav Andruschenko:

Hallo zusammen, ich bin die Genauigkeit der Zitate langsam leid. Normalisierungen und so weiter.

Sie sollten irgendwie in der Lage sein zu verstehen, was double und int sind. Wie die Schriftumwandlung funktioniert.

Ich habe MathMod und MathFloor noch nie benutzt. Ihr Code schreit förmlich danach, dass Sie überhaupt nicht verstehen, was hinter dem steht, was Sie geschrieben haben.

Der Ausdruck der Doppelnummer ist nicht von Bedeutung. Wenn Sie den wahren Wert von double ausdrucken wollen, müssen Sie sich die Bytes ansehen.

 

nur, um zu vermeiden, dass er manuell geschrieben werden muss,

Die Variable selbst liefert nicht das Ergebnis, das ich von ihr erwarte.

Type Casting, int Normalisierung und Synchronisierung habe ich ohne Hilfe gemacht.

Im Moment bin ich verzweifelt, da ich alle Optionen ausprobiert habe und einen 1:1000-Code erstellt habe, der nicht so funktioniert, wie er sollte.

Aber danke für die Hilfe.

Versuchen Sie, das zu tun, was ich will: Zeigen Sie mir hinterher nicht den Code, sondern sagen Sie mir nur, ob er funktioniert oder nicht.

Nehmen Sie Ask und Bid.

und berechnen den Durchschnittspreis.

Wenn die Spanne ungerade ist (3,5,7,9, etc.), dann wird der Durchschnittspreis näher an Bid gesetzt.

Zum Beispiel:

Bid=1.55555 Ask=1.55557 Durchschnittspreis=1.55556 Spread=2

Bid=1.5555 Ask=1.55558 Durchschnittspreis=1.55556 Spread=3

und Sie werden es richtig machen.

Aber wenn die Spanne 4,5,6,7 beträgt, haben Sie diese Genauigkeit, wenn Sie ins Ungewisse gehen. Und die Zahlen werden in die falsche Richtung schwimmen.

 
Vladislav Andruschenko:
      double askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);

      double Averab=((askP+bidP)*1)/2.0;
      Print("askP="+askP+" bidP="+bidP+" Averab="+Averab+" MathFloor((int)Averab)="+MathFloor((int)Averab));

bei Spanne=2

askP=105143 bidP=105141 Averab=105142 MathFloor((int)Averab)=105142

bei Spanne=3

askP=105144 bidP=105141 Averab=105142.5 MathFloor((int)Averab)=105142

unter 4!!!! spread

askP=105545 bidP=105141 Averab=105143 MathFloor((int)Averab)=105142

Warum?

Ich war einmal in einer ähnlichen Situation - meine Gedanken kochten vor Empörung. Das Ersetzen von double durch float hat geholfen , aber ich weiß immer noch nicht, warum.

 
sibirqk:
Ich hatte einmal eine ähnliche Situation - damals kochte mein Geist vor Empörung. Das Ersetzen von double durch float hat geholfen , aber ich weiß immer noch nicht, warum.

Danke, ich werde es ausprobieren........ Ich bin auch schon ganz aus dem Häuschen.

YES!!! Genau so funktioniert es! Das ist in Ordnung.

float askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
float bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
float Averab=((askP+bidP))/2.0;

Danke!!! Ich wüsste nicht, was ich noch tun würde........

 
#define ALPHA 0.1

int askP = (int)(Ask / Point + ALPHA);
int bidP = (int)(Bid / Point + ALPHA);

So funktioniert MathFloor

int MyMathFloor( const double Num )
{
  return((int)((Num > 0) ? Num : Num - 1));
}
 
double Averab = NormalizeDouble ((Ask + Bid)/(2.0 * Point), Digits);
 
fxsaber:
#define ALPHA 0.1

int askP = (int)(Ask / Point + ALPHA);
int bidP = (int)(Bid / Point + ALPHA);

So funktioniert MathFloor

int MyMathFloor( const double Num )
{
  return((int)((Num > 0) ? Num : Num - 1));
}

für verschiedene Spreads? einschließlich 2,3,4,5,6,7 ?

Ich habe es nämlich schon mal versucht (ohne+ ALPHA). 2,3 Spreizung ist ok, aber 4,5 ist schon ein Glitch

Andrej Dik:
double Averab = NormalizeDouble ((Ask + Bid)/2.0, Digits);

Normalisierung, dies ist das erste, was ich in der Funktion getan habe, aber leider bei bestimmten Spreads, beginnt es zu glitch

 
Vladislav Andruschenko:

Die Normalisierung ist das erste, was ich in der Funktion gemacht habe, aber leider fängt sie bei bestimmten Spreads an zu stören

Ich habe das Problem behoben, versuchen Sie es jetzt.
 
Vladislav Andruschenko:

nehmen Sie den Ask und Bid.

und berechnen den Durchschnittspreis.

Wenn die Spanne ungerade ist (3, 5, 7, 9 usw.), wird der Durchschnittspreis näher am Geldkurs angesetzt.

#define ALPHA 0.1

int DoubleToInt( const double Num )
{
  return((int)(Num + ALPHA));
}

void OnStart()
{
  double NewPrice = DoubleToInt((Ask + Bid) / (2 * Point)) * Point;

  Print(NewPrice);
}
Grund der Beschwerde: