ライブラリ: Price_Compare

 

Price_Compare:

「price」の「double」値のエレガントで素早い比較。

作者: fxsaber

 
Automated-Trading:

価格_比較

著者:fxsaber

なぜそんなにプリプロセッサ命令が好きなのですか? 私が見たすべてのコードにプリプロセッサ命令がありました。正規化自体は興味深いトピックですが、プリプロセッサ命令がなくても実装できますし、言語がそれを可能にします。

そして、あなたのコミュニケーション・スタイルでは、あなたのライブラリを使うことで、通常の正規化よりも高速になる例を挙げてください :)

 
coderex:

なぜそんなにプリプロセッサ命令がお好きなのですか? 私が見たすべてのコードにプリプロセッサ命令がありました。正規化自体は興味深いテーマだが、プリプロセッサ命令がなくても実装できる。

繰り返しのコードは煩わしい。私は簡潔で、効率的で、ロジックが好きだ。例えば

取引、自動取引システム、取引戦略のテストに関するフォーラム

コピーティック」のテスト

fxsaber, 2016.10.19 07:59

date-to-dateがそうだろう。CopyTicksは名前にCopyがあるからといってCopy関数に構文を当てはめようとしても利便性は生まれない。このようなプリプロセッサ的なことができると便利だし、正当化される。

// MT4と同様に、Open[Pos]、High[Pos]、Low[Pos]、Close[Pos]、Time[Pos]、Volume[Pos]。
// 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)
なぜなら、2つの異なる物理スレッド(TRADEとINFO)と1つの合成スレッド(ALL)があるからだ。

そして、あなたのコミュニケーションスタイルでは、あなたのライブラリを使用することで、正規化よりも高速になる例を挙げてください :)

それは端末のビットレートに強く依存します。MT4では、速度の違いは特に顕著になるはずです。Renatがこのスレッドで比較しています。

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

煩わしい反復コード。私は簡潔で、効率的で、ロジックが好きだ。例えば


端末のビットレートに大きく依存する。MT4では、速度の違いは特に顕著になるはずだ。Renatがこのスレッドで比較をしてくれた。

ありがとう )))) 多くの有益な情報を得た。
 
coderex:
プリプロセッサの有用性のもう一つの例

取引、自動取引システム、取引戦略のテストに関するフォーラム

初心者からの質問

fxsaber, 2016.10.19 15:23

#define ORDER_TYPE_BUY ORDER_TYPE_BUY_STOP   // 買い取引を拒否したい場合は、エキスパート・アドバイザーの一番最初にそれを置く。
#define ORDER_TYPE_SELL ORDER_TYPE_SELL_STOP 売りトレードを拒否する必要がある場合は、 // EAの一番最初にそれを置く。
 
fxsaber:
プリプロセッサの有用性のもう一つの例
プリプロセッサーを完全に拒否することはできないが、あなたのコードは単にプリプロセッサー命令で書かれていることがある。そのようなコードは読みにくくなる。
 
coderex:
プリプロセッサを完全に拒否することができない場合もあるが、あなたのコードは単にプリプロセッサの命令の上に書かれている。そのようなコードは読みにくくなる。

私は変数名、型名、クラス名、関数・メソッド名、マクロ名をわかりやすく設定しています。もし乱用があれば教えてほしい。

私がコドベースを読む上で最大の障害となっているのは、強制的なスタイリングです。kodobaseにある私のコードのほとんどすべてが、この処置にさらされている。そしてその後、私は自分のコードをほとんど読むことができない。

 
fxsaber:

変数名、型名、クラス名、関数・メソッド名、マクロ名はわかりやすく設定されている。もし乱用があれば教えてください。

私にとってkodobaseを読む上での最大の障害は、強制的なスタイリングです。kodobaseにある私のコードのほとんどすべてがこの処置を受けている。そしてその後、私は自分のコードをほとんど読むことができない。

私自身のことではなく、マクロだらけのコードは読みにくいし、デバッグするのも大変なので、プリプロセッサを使うのは最低限にして、絶対に必要なときだけにするようにしている。コード中にマクロが存在するということは、考え抜かれたアルゴリズムが稚拙であることを意味する。この言葉が誰のものかはよく覚えていないが、ストラウストラップだと思う。
 
coderex:
マクロだらけのコードは悪く読まれてしまうし、デバッグするのもとても難しい。だから私はいつも、プリプロセッサは必要最低限に、絶対に必要なときだけ使うようにしている。コード中に存在するマクロは、考え抜かれたアルゴリズムが不十分であることを物語っている。この言葉が誰のものなのか正確には覚えていないが、ストラウストラップだと思う。
私はそうは思わない。
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));
}

結果

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

きれいだと思う。そうでなければ、テンプレートもあきらめるべきだ。

 
fxsaber:
同意できない
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));
}

結果。

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

ちょっとかわいい。そうでなければ、テンプレートもあきらめなければならない。

でも、TickToStringは純粋な言語でも実装できると思う。

重要なのは、マクロはC言語から来たもので、他の目的のために設計されたということだ。マイクロ計算機のようなもので、作られた目的は同じだったのですが、その時代に人々はMK-62で遊び始め(私も含めて)、しかしその後PCの不足のために強制され、今では倒錯を伴うノスタルジアか純粋な倒錯のどちらかに見えるでしょう :)。マクロもそうですが...。もちろん、好きなようにコードを書いてください。

 
coderex:
私の考えでは、TickToStringは純粋な言語で実装することができる。

もちろんできる!しかし、どれほど醜いものになるだろうか?

マクロのないTypeToBytesライブラリでは、怖いだけでなく、便利でもないだろう。つまり、ライブラリは単に捨てられてしまうかもしれない。

言語の習熟度の問題だと思う。私がOOPを知らなかった/理解していなかったときは、OOPは使わなかった。すべてが変わった。