なぜそんなにプリプロセッサ命令がお好きなのですか? 私が見たすべてのコードにプリプロセッサ命令がありました。正規化自体は興味深いテーマだが、プリプロセッサ命令がなくても実装できる。
繰り返しのコードは煩わしい。私は簡潔で、効率的で、ロジックが好きだ。例えば
fxsaber, 2016.10.19 07:59
date-to-dateがそうだろう。CopyTicksは名前にCopyがあるからといってCopy関数に構文を当てはめようとしても利便性は生まれない。このようなプリプロセッサ的なことができると便利だし、正当化される。
// 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)
そして、あなたのコミュニケーションスタイルでは、あなたのライブラリを使用することで、正規化よりも高速になる例を挙げてください :)
それは端末のビットレートに強く依存します。MT4では、速度の違いは特に顕著になるはずです。Renatがこのスレッドで比較しています。
- www.mql5.com
煩わしい反復コード。私は簡潔で、効率的で、ロジックが好きだ。例えば
端末のビットレートに大きく依存する。MT4では、速度の違いは特に顕著になるはずだ。Renatがこのスレッドで比較をしてくれた。
プリプロセッサの有用性のもう一つの例
プリプロセッサを完全に拒否することができない場合もあるが、あなたのコードは単にプリプロセッサの命令の上に書かれている。そのようなコードは読みにくくなる。
私は変数名、型名、クラス名、関数・メソッド名、マクロ名をわかりやすく設定しています。もし乱用があれば教えてほしい。
私がコドベースを読む上で最大の障害となっているのは、強制的なスタイリングです。kodobaseにある私のコードのほとんどすべてが、この処置にさらされている。そしてその後、私は自分のコードをほとんど読むことができない。
変数名、型名、クラス名、関数・メソッド名、マクロ名はわかりやすく設定されている。もし乱用があれば教えてください。
私にとってkodobaseを読む上での最大の障害は、強制的なスタイリングです。kodobaseにある私のコードのほとんどすべてがこの処置を受けている。そしてその後、私は自分のコードをほとんど読むことができない。
マクロだらけのコードは悪く読まれてしまうし、デバッグするのもとても難しい。だから私はいつも、プリプロセッサは必要最低限に、絶対に必要なときだけ使うようにしている。コード中に存在するマクロは、考え抜かれたアルゴリズムが不十分であることを物語っている。この言葉が誰のものなのか正確には覚えていないが、ストラウストラップだと思う。
{
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));
}
結果
きれいだと思う。そうでなければ、テンプレートもあきらめるべきだ。
同意できない
{
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));
}
結果。
ちょっとかわいい。そうでなければ、テンプレートもあきらめなければならない。
でも、TickToStringは純粋な言語でも実装できると思う。
重要なのは、マクロはC言語から来たもので、他の目的のために設計されたということだ。マイクロ計算機のようなもので、作られた目的は同じだったのですが、その時代に人々はMK-62で遊び始め(私も含めて)、しかしその後PCの不足のために強制され、今では倒錯を伴うノスタルジアか純粋な倒錯のどちらかに見えるでしょう :)。マクロもそうですが...。もちろん、好きなようにコードを書いてください。
私の考えでは、TickToStringは純粋な言語で実装することができる。
もちろんできる!しかし、どれほど醜いものになるだろうか?
マクロのないTypeToBytesライブラリでは、怖いだけでなく、便利でもないだろう。つまり、ライブラリは単に捨てられてしまうかもしれない。
言語の習熟度の問題だと思う。私がOOPを知らなかった/理解していなかったときは、OOPは使わなかった。すべてが変わった。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
Price_Compare:
「price」の「double」値のエレガントで素早い比較。
作者: fxsaber