記事"トレーダーのハック: 定義と ForEach のブレンド (#define)"についてのディスカッション

 

新しい記事 トレーダーのハック: 定義と ForEach のブレンド (#define) はパブリッシュされました:

この記事は、現在MQL4でコーディングしていて、MQL5に切り替えたいとは思っていない人のためのものです。 今回はMQL4のスタイルでコードを書く方法を模索していきます。 #define プリプロセッサのマクロ置換を見ていきます。

メタエディタ にはカスタムスニペットがないので、' define ' を適用します。 #defineマクロの置換は、目標を追求した怠惰で賢いプログラマによって考案されました。 これには読みやすさと繰り返しコードを書くことの利便性があります。

多くのプログラミング言語は、標準の for ループに加えて、 for >for(<typename> element:Collection) 、for (式の識別子の型)などのバリエーションを備えています。 次のコードを書くことができれば

for(ulong order_id in History)
  {
   working with order_id  
  }

、プログラマーは少し楽になると思います。 インターネット上では、このアプローチに対する賛成意見と反対意見があります。 ここでは、#define のマクロと同じようなことを行う方法を紹介します。

簡単なタスクから始めましょう-すべての相場のシンボルの名前を取得します。 次のマクロを書き直します。

作者: Vladimir Karputov

 
貯金箱へ

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

ライブラリ: CDouble & CDoubleVector

amrali, 2018.02.12 23:53

#define  forEach(element, array)  for (int __i = 0, __max = ArraySize((array)); __i < __max && ((element) = array[__i]) == (element); __i++)
forEachを繰り返し呼び出せるように、すべてをforの内部に詰め込む必要があります。そうでないと、再定義された変数で面倒なことになります。
 
TimeCurrentの前にHistorySelectは典型的なエラーである。この文が誰かにとって重要かどうかは作者によって異なるかもしれないので、以下は引用の一例である。

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

FORTS。実行に関する質問

Renat Fatkhullin, 2015.02.10 08:16

私はまだコードを実行していませんが、ソースコードにはHistorySelectの終了日が間違っているという古典的なエラーが示されています。

最初のプログラマーは皆、間違った日付でこの関数を呼び出し、常に履歴の終わりをスナックし、「履歴に入る長い時間の取引」を検出します。

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

FORTS。執行に関する質問

レナト・ファトフーリン, 2015.02.10 09:15

間違いは、人々が現在の瞬間が何であるかを考えず、間違ったソースから取得した間違った日付を代入することです。

廃止されたserverTimeではなく、既知の遠い日付を終了日として指定すれば十分です。

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

FORTS。執行に関する質問

レナト・ファトフーリン, 2015.02.10 13:56

そして、開始日と終了日は、エラーの実現と強制的なマージンで設定されるべきです。つまり、最低でもマイナスN秒、プラスN秒です。

TimeTradeServer()はrltimeの正確な時間ではなく、マーケット概要に入ってくる価格ティックのみで更新されます。


履歴サンプルに突然データがない場合、それは99%クエリの境界にエラーがあることを意味します。

HistorySelect(0, LONG_MAX);
 

Предопределённые переменные _XXXX переводятся в функции MQL5 при помощи беспараметрической формы #define:

//--- _Digits変数は、小数点以下の桁数を格納する、
#define _Digits         Digits()
なぜですか?さらに、このようなマクロでは、_Digitsをいくつかの関数の入力パラメータとして使用することはできない。つまり、コードが機能しなくなる。
 
//--- 現在のシンボルの最新の売り手価格(アスク価格)。 
double GetAsk()
  {
   MqlTick tick;
   SymbolInfoTick(Symbol(),tick);
   return(tick.ask);
  }

恐ろしく高い!本当に構造を通してやりたいのなら、せめてやっておくべきだった。しかもなぜかチェックがない。

SymbolInfoDoubleは MT4に完全対応しています。

 
#define IsTradeContextBusy  true

え?

もしかして嘘?
 
MarketInfoについては、列挙+オーバーロードによるアプローチを使用する方がよい。

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

エキスパートアドバイザー:Quantum 103

fxsaber、2017.09.26 09時55分。

bool RefreshRates( void ) { return(true); }

double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }
int    MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_INTEGER Property ) { return((int)SymbolInfoInteger(Symb, Property)); }

bool IsTesting(void)            { return(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)); }
bool IsTradeContextBusy( void ) { return(false); }
bool IsTradeAllowed(void)       { return(MQLInfoInteger(MQL_TRADE_ALLOWED)); }
bool IsExpertEnabled(void)      { return(AccountInfoInteger(ACCOUNT_TRADE_EXPERT)); }

int    ObjectFind( const string Name )   { return(ObjectFind(0, Name)); }
int    ObjectsTotal( void )              { return(ObjectsTotal(0)); }
bool   ObjectDelete( const string Name ) { return(ObjectDelete(0, Name)); }
string ObjectName( const int Pos )       { return(ObjectName(0, Pos)); }

double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
{
 double Margin;

 return(OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
        SymbolInfoDouble(Symb, (Cmd == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID), Margin) ?
        AccountInfoDouble(ACCOUNT_MARGIN_FREE) - Margin : -1);
}

#define False false
#define True  true

#define Digits _Digits
#define Point  _Point

#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK
#define MODE_POINT     SYMBOL_POINT
#define MODE_DIGITS    SYMBOL_DIGITS
#define MODE_STOPLEVEL SYMBOL_TRADE_STOPS_LEVEL
#define MODE_SPREAD    SYMBOL_SPREAD

#define StrToTime    StringToTime
#define StrToInteger StringToInteger
#define TimeToStr    TimeToString
#define DoubleToStr  DoubleToString

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
 
完全な互換性のために、MQL4の簡略化された取引機能だけが欠けている。
そのためには、両方のアーキテクチャをよく理解する必要がある。まだすべてが明らかなわけではありません。
 

fxsaber:
В копилку

#define  forEach(element, array)  for (int __i = 0, __max = ArraySize((array)); __i < __max && ((element) = array[__i]) == (element); __i++)

興味深い、明白ではないテクニック )

削除済み  

どれだけひねくれたことができる?

ディファインは、あるテキストを別のテキストに置き換えた愚かなものだ。何の力もない!

テンプレートで同じことをやってみた方がいい。

 
Koldun Zloy:

何回できる?

ディファインは、あるテキストを別のテキストに置き換える愚かな行為だ。そこには何の力もない!

文章は少ない方が便利なこともある

同じことをテンプレートでやってみたほうがいい。

実現可能性、使いやすさ、パフォーマンスの問題だ。