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 :)
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
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
// 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 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
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.
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
fxsaber, 2016.10.19 15:23
#define ORDER_TYPE_SELL ORDER_TYPE_SELL_STOP // Setzen Sie es ganz an den Anfang des EA, wenn es notwendig ist, SELL-Trades abzulehnen
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.
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.
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, 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.
{
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
Ich denke, es ist hübsch. Andernfalls sollten wir auch Templates aufgeben.
Ich stimme nicht zu
{
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.
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.
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.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Price_Compare:
Eleganter und wendiger Vergleich der "doppelten" Werte des "Preises".
Autor: fxsaber