Bibliotheken: Price_Compare

 

Price_Compare:

Eleganter und wendiger Vergleich der "doppelten" Werte des "Preises".

Autor: fxsaber

 
Automated-Trading:

Preis_Vergleichen:

Autor: fxsaber

Warum sind Sie so versessen auf Präprozessoranweisungen? Sie haben sie in allen Codes, die ich gesehen habe. Das Thema Normalisierung an sich ist interessant, aber es kann auch ohne Präprozessoranweisungen implementiert werden, die Sprache erlaubt das.

Und in Ihrem Kommunikationsstil - nennen Sie ein Beispiel, bei dem die Verwendung Ihrer Bibliothek eine höhere Geschwindigkeit als die übliche Normalisierung ergibt :)

 
coderex:

Warum sind Sie so versessen auf Präprozessoranweisungen? Sie haben sie in allen Codes, die ich gesehen habe. Das Thema ist interessant in Bezug auf die Normalisierung selbst, aber es kann ohne Präprozessoranweisungen implementiert werden, die Sprache erlaubt es.

Sich wiederholender Code ist lästig. Ich mag Prägnanz, Effizienz und Logik. Zum Beispiel

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Testen von 'CopyTicks'

fxsaber, 2016.10.19 07:59

Das ist es, was date-to-date tun wird. CopyTicks, die versuchen, die Syntax an Copy-Funktionen anzupassen, nur weil Copy im Namen vorkommt, bringt keinen Komfort. Es ist praktisch und gerechtfertigt, wenn man Präprozessor-Dinge wie dieses machen kann

// Ermöglicht, wie in MT4, die Arbeit mit Zeitreihen: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// Es werden auch die üblichen MT4-Funktionen eingestellt: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
Und für CopyTicks kann man so etwas nicht tun, weil es zwei verschiedene physische Threads (TRADE und INFO) und einen synthetischen Thread (ALL) gibt - Flags.

Und in Ihrem Kommunikationsstil - nennen Sie ein Beispiel, bei dem die Verwendung Ihrer Bibliothek zu einer höheren Geschwindigkeit als die Normalisierung führt :)

Es hängt stark von der Bitrate des Terminals ab. Auf MT4 sollten die Geschwindigkeitsunterschiede besonders auffällig sein. Renat hat in diesem Thread einen Vergleich gemacht.

Альтернативные реализации стандартных функций/подходов
Альтернативные реализации стандартных функций/подходов
  • www.mql5.com
NormalizeDouble Результат 1123275 и 1666643 в пользу MyNormalizeDouble (Optimize=1). Без оптимизации - быстрее раза в четыре (на память...
 
fxsaber:

Lästiger, sich wiederholender Code. Ich mag Prägnanz, Effizienz und Logik. Zum Beispiel


Hängt stark von der Bitrate des Terminals ab. Auf MT4 sollten die Geschwindigkeitsunterschiede besonders auffällig sein. Renat hat in diesem Thread einen Vergleich gemacht.

Danke )))) Ich habe eine Menge nützlicher Informationen erhalten
 
coderex:
Ein weiteres Beispiel für die Nützlichkeit eines Präprozessors

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Fragen von Anfängern

fxsaber, 2016.10.19 15:23

#define ORDER_TYPE_BUY ORDER_TYPE_BUY_STOP   // setzen Sie es ganz an den Anfang des Expert Advisors, wenn Sie BUY-Trades ablehnen wollen
#define ORDER_TYPE_SELL ORDER_TYPE_SELL_STOP // Setzen Sie es ganz an den Anfang des EA, wenn es notwendig ist, SELL-Trades abzulehnen
 
fxsaber:
Ein weiteres Beispiel für die Nützlichkeit des Präprozessors
Manchmal ist es unmöglich, den Präprozessor ganz abzulehnen, aber Ihr Code ist einfach auf Präprozessoranweisungen geschrieben. Solcher Code ist dann schwer zu lesen.
 
coderex:
Manchmal ist es unmöglich, den Präprozessor ganz abzulehnen, aber Ihr Code ist einfach auf Präprozessoranweisungen geschrieben. Solcher Code ist dann schwer zu lesen.

Ich habe die Namen von Variablen, Typen, Klassen, Funktionen/Methoden und Makros eindeutig festgelegt. Wenn Sie Missbräuche sehen, zeigen Sie sie mir.

Das größte Hindernis für mich beim Lesen von kodobase ist das erzwungene Styling. Fast mein gesamter Code in kodobase ist dieser Prozedur unterworfen worden. Und ich kann meinen eigenen Code danach kaum noch lesen.

 
fxsaber:

Die Namen von Variablen, Typen, Klassen, Funktionen/Methoden und Makros sind eindeutig festgelegt. Wenn Sie Missbräuche sehen, zeigen Sie sie mir bitte.

Das größte Hindernis für mich beim Lesen von kodobase ist das erzwungene Styling. Fast mein gesamter Code in kodobase ist dieser Prozedur unterworfen worden. Und ich kann meinen eigenen Code danach kaum noch lesen.

Ich spreche nicht von mir selbst, jeder Code, der voller Makros ist, wird schlecht gelesen, außerdem ist es sehr schwierig, ihn zu debuggen, daher versuche ich immer, den Präprozessor so wenig wie möglich zu benutzen und nur dann, wenn es absolut notwendig ist. Makros im Code weisen auf einen schlecht durchdachten Algorithmus hin, ich weiß nicht mehr genau, von wem diese Worte stammen, ich glaube von Straustrup, aber sie spiegeln das Wesentliche wider - der Code muss sauber sein.
 
coderex:
Ich spreche nicht von mir, jeder Code, der voller Makros ist, wird schlecht gelesen, außerdem ist er sehr schwer zu debuggen, daher versuche ich immer, den Präprozessor auf ein Minimum zu beschränken und nur dann zu verwenden, wenn es absolut notwendig ist. Makros im Code sprechen für einen schlecht durchdachten Algorithmus, ich weiß nicht mehr genau, von wem diese Worte stammen, ich glaube von Straustrup, aber sie spiegeln das Wesentliche wider - der Code sollte sauber sein.
Ich stimme nicht zu
string GetTickFlag( uint tickflag )
{
  string flag = "";

#define TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef TICKFLAG_MACRO

  if (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
    
  return(flag);
}

#define TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc %1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    Print(TickToString(Tick));
}

Ergebnis

2016.10.19 18:14:51.604 Test (GBPUSD,M1)         time = 2016.10.19 18:15:58.649 bid = 1.23008 ask = 1.23018 last = 0.0 volume = 0 TICK_FLAG_ASK

Ich denke, es ist hübsch. Andernfalls sollten wir auch Templates aufgeben.

 
fxsaber:
Ich stimme nicht zu
string GetTickFlag( uint tickflag )
{
  string flag = "";

#define TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef TICKFLAG_MACRO

  if (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
    
  return(flag);
}

#define TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc %1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    Print(TickToString(Tick));
}

Ergebnis.

2016.10.19 18:14:51.604 Test (GBPUSD,M1)         time = 2016.10.19 18:15:58.649 bid = 1.23008 ask = 1.23018 last = 0.0 volume = 0 TICK_FLAG_ASK

Irgendwie niedlich. Ansonsten muss man auch auf Templates verzichten.

Dass es dir gefällt, ist verständlich )))) aber TickToString könnte meiner Meinung nach in einer reinen Sprache implementiert werden.

Der Punkt ist, dass Makros aus C stammen und für andere Zwecke entwickelt wurden. Es ist wie bei einem Mikrokalkulator - der Zweck seiner Erschaffung war derselbe, aber zu seiner Zeit begannen die Leute mit MK-62 zu spielen (mich eingeschlossen), aber dann wurde es aufgrund des Mangels an PC erzwungen, und jetzt wird es entweder wie Nostalgie mit Perversion oder reine Perversion aussehen :). Dasselbe gilt für macros..... Natürlich kannst du den Code schreiben, wie du willst, ich habe nur gesagt, was dir ins Auge sticht.

 
coderex:
TickToString könnte meiner Meinung nach in einer reinen Sprache implementiert werden

Natürlich könnte man das! Aber wie hässlich würde es sein?

In der TypeToBytes-Bibliothek ohne Makros wäre es nicht nur unheimlich, sondern auch unpraktisch. Das heißt, man könnte die Bibliothek einfach wegschmeißen.

Ich denke, es ist alles eine Frage der Sprachbeherrschung. Als ich OOP nicht kannte/verstand, habe ich es nicht benutzt. Alles hat sich geändert.