Wert des vorherigen Ticks - Seite 4

 
Danke Nicholi für den schlankeren Code. Nach einigen Experimenten habe ich festgestellt, dass die Deklaration von ask_diff als Float zwar Differenzen mit der richtigen Anzahl von Ziffern erzeugt, aber einen Kompilierfehler über mögliche Datenverluste durch die Typkonvertierung. Es sieht so aus, als müsste ich mich entscheiden zwischen sehr kleinen Ungenauigkeiten in meinen Differenzen oder einer Kompilierwarnung. Letzteres wäre für Handelsentscheidungen besser, aber hat noch jemand eine Lösung, um höchstens fünf Dezimalstellen in ask_diff zu erhalten?
 
rdone:
Danke Nicholi für diesen schlankeren Code. Nach einigen Experimenten stellte ich fest, dass die Deklaration von ask_diff als float zwar Differenzen mit der korrekten Anzahl von Ziffern erzeugte, aber einen Kompilierfehler über möglichen Datenverlust durch die Typkonvertierung. Es sieht so aus, als müsste ich mich entscheiden zwischen sehr kleinen Ungenauigkeiten in meinen Differenzen oder einer Kompilierwarnung. Letzteres wäre für Handelsentscheidungen besser, aber hat noch jemand eine Lösung, um höchstens fünf Dezimalstellen in ask_diff zu erhalten?

Ihr ask_diff sollte vom Typ int sein und stattdessen wie folgt aussehen.

int diff = int(round((current.ask - last.ask) / _Point));
 
Ich habe gerade NormalizeDouble und DoubleToString entdeckt. Hey, das ist mein erster Tag hier...
 
rdone:
Ich habe gerade NormalizeDouble und DoubleToString entdeckt. Hey, das ist mein erster Tag hier...
Mein Ziel ist es, die Differenz zwischen dem aktuellen Ask und dem vorherigen Ask zu ermitteln (Teil 1) und dann eine laufende Summe dieser Differenzen zu erhalten (Teil 2). Teil 1 funktioniert, aber Teil 2 gibt nur den vorherigen Ask-Betrag zurück. Kann mir jemand sagen, was ich falsch mache, und mir eine Kurskorrektur geben?
double ask_curr;
double ask_prev;
double ask_diff;
double diff_ask;
MqlTick tick_curr, tick_prev;
void OnTick()
  {
   if(SymbolInfoTick(Symbol(),tick_curr))
     {
      /* Part 1 */
      ask_curr = tick_curr.ask;
      ask_prev = tick_prev.ask;
      ask_diff = ask_curr - ask_prev;
      Print(DoubleToString(ask_diff,5));
      /* Part 2 */
      diff_ask = diff_ask + ask_diff;
      Print(DoubleToString(diff_ask,5));     
      tick_prev = tick_curr;
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
  }
 
Wie so oft hat der Code das getan, was er tun sollte, und nicht das, was ich wollte. Die Logik erfordert, dass tick_prev immer ausgefüllt wird, aber beim ersten Tick ist das nicht der Fall. Ich bin an einer Logik interessiert, die nicht erfordert, dass tick_prev beim ersten Tick ausgefüllt wird, aber ansonsten funktioniert dies.
 
rdone:
Wie so oft hat der Code das getan, was er tun sollte, und nicht das, was ich wollte. Die Logik erfordert, dass tick_prev immer ausgefüllt wird, aber beim ersten Tick ist das nicht der Fall. Ich bin an einer Logik interessiert, die nicht verlangt, dass tick_prev beim ersten Tick ausgefüllt wird, aber ansonsten funktioniert sie.
Und jetzt mit Code.
double ask_curr;
double ask_prev;
double ask_diff;
double diff_ask;
int notfirst;
MqlTick tick_curr, tick_prev;
void OnTick()
  {
   if(SymbolInfoTick(Symbol(),tick_curr))
     {
      if (notfirst > 0)
      {
      /* Part 1 */
      ask_curr = tick_curr.ask;
      ask_prev = tick_prev.ask;
      ask_diff = ask_curr - ask_prev;
      Print(DoubleToString(ask_diff,5));
      /* Part 2 */
      diff_ask = diff_ask + ask_diff;
      Print(DoubleToString(diff_ask,5));
      }
      tick_prev = tick_curr;
      notfirst = 1;  
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
  }
 
rdone:
Wie so oft hat der Code das getan, was er tun sollte, und nicht das, was ich wollte. Die Logik erfordert, dass tick_prev immer ausgefüllt wird, aber beim ersten Tick ist das nicht der Fall. Ich bin an einer Logik interessiert, die nicht erfordert, dass tick_prev beim ersten Tick ausgefüllt wird, aber ansonsten funktioniert dies.
double diff_ask=0;
MqlTick tick_curr, tick_prev={0};
void OnTick()
  {
   if(SymbolInfoTick(Symbol(),tick_curr))
     {
      /* Part 1 */
      diff_ask += tick_prev.ask!=0.0?(tick_curr.ask-tick_prev.ask):0.0;
      Print(DoubleToString(diff_ask,5));
      /* Part 2 */
      //diff_ask = diff_ask + ask_diff;
      //Print(DoubleToString(diff_ask,5));     
      tick_prev = tick_curr;
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
  }
 
Ernst Van Der Merwe:
Das ist ein Niveau der Programmierung, das ich erreichen möchte. Vielen Dank, Ernst!
diff_ask += tick_prev.ask!=0.0?(tick_curr.ask-tick_prev.ask):0.0;
 
rdone:
Das ist ein Niveau der Codierung, das ich zu erreichen strebe. Vielen Dank, Ernst!

Sie wollen die Punktedifferenz nicht als Double speichern, da Doubles selten gleich sind. Sie wollen sie als ganzzahligen Wert speichern. Zum Beispiel (1,00001 - 1,00000) / 0,00001 = 1 Punkt. Wenn Sie also nur zwei Ticks vergleichen, können Sie Ihren Code kompakter gestalten, indem Sie einfach die Unterklasse MqlTick bilden und ein int-Attribut für den Punktunterschied hinzufügen.

struct MyTick : public MqlTick{int point_diff;} tick_curr={0}, tick_prev={0};
void OnStart()
{
   tick_prev = tick_curr;
   SymbolInfoTick(_Symbol, tick_curr);
   if(tick_prev.ask != 0.0){
      tick_curr.point_diff = int(round(
         (tick_curr.ask - tick_prev.ask) / _Point
      ));
      printf("%.5f -> %.5f: %d point diff",
         tick_prev.ask,
         tick_curr.ask,
         tick_curr.point_diff
      );
   }
}