エキスパート: トレーダーのためのMQL5プログラミング - 書籍からのソースコード。第6部 - ページ 3 123 新しいコメント Alain Verleyen 2026.01.18 14:37 #21 hini #property tester_set "FrameTransfer.set" (テスターセットのファイル拡張子が無効です。'*.set' expected FrameTransfer.mq5) コンパイルに成功するには、このように変更する必要があります:#property tester_set "¦Presets¦FrameTransfer.set"というように変更しないとコンパイルに成功しません。#property tester_set "/Presets/FrameTransfer.set"`でも失敗します。おそらく、アルゴリズムブックの記述を修正できるだろう: ビルド5506で修正。 hini 2026.01.19 17:02 #22 Alain Verleyen #: ビルド5506で修正可能です。 ありがとうございました。 Stanislav Korotky 2026.04.05 16:22 #23 Stanislav Korotky 最適化 基準計算ファイル(RSquared.mqh)の更新版を添付します。このファイルでは、ロットが可変の場合の計算が修正されています。 最適化結果の 表から判断して、回収率とシャープ・パラメーターの組み合わせが得られています。使用例 注意異なるシンボルが取引されている場合、出来高の適切な推定を得るために、例えばロットから預金通貨の価値に変換する必要があります(簡略化されたバリエーションの1つ): #include <MQL5Book/DealFilter.mqh> #include <MQL5Book/RSquared.mqh> template<typename T> union Type2Bytes { T d; uchar bytes[sizeof(T)]; }; double OnTester() { HistorySelect(0, LONG_MAX); #define STAT_PROPS 5 const ENUM_DEAL_PROPERTY_DOUBLE props[STAT_PROPS] = { DEAL_PROFIT, DEAL_SWAP, DEAL_COMMISSION, DEAL_FEE, DEAL_VOLUME }; double expenses[][STAT_PROPS]; ulong tickets[]; // ここでは'select'プロトタイプにマッチさせるためだけに使用するが、デバッグには便利である。 DealFilter filter; filter.let(DEAL_TYPE, (1 << DEAL_TYPE_BUY) | (1 << DEAL_TYPE_SELL), IS::OR_BITWISE) .let(DEAL_ENTRY, (1 << DEAL_ENTRY_OUT) | (1 << DEAL_ENTRY_INOUT) | (1 << DEAL_ENTRY_OUT_BY), IS::OR_BITWISE) .select(props, tickets, expenses); const int n = ArraySize(tickets); double balance[]; double volumes[]; // R2 基準を使用する場合は、取引量を考慮する。 ArrayResize(balance, n + 1); balance[0] = 0; ArrayResize(volumes, n + 1); volumes[0] = 0; MapArray<ulong,double> sym2value; // シンボル・ハッシュを1ロット値に変換 for(int i = 0; i < n; ++i) { const string s = HistoryDealGetString(tickets[i], DEAL_SYMBOL); double value = 1; Type2Bytes<ulong> sym; ArrayInitialize(sym.bytes, 0); StringToCharArray(s, sym.bytes); int idx = sym2value.find(sym.d); if(idx == -1) // ロットごとのシンボル値の記録はまだない { const double price = SymbolInfoDouble(s, SYMBOL_ASK); const double pt = SymbolInfoDouble(s, SYMBOL_POINT); double profit = 1; ResetLastError(); if(!OrderCalcProfit(ORDER_TYPE_BUY, s, 1, price, price + pt, profit)) // 注:口座通貨の現在のレートを使用しているため、おおよその推定値である。 { // WARN(StringFormat("OrderCalcProfit Error: %s %d ", s, _LastError)); } value = profit * (price / pt); // 注:レバレッジはここでは適用されない idx = sym2value.put(sym.d, value); } else { value = sym2value.getValue(idx); } double result = 0; for(int j = 0; j < STAT_PROPS - 1; ++j) // ディールボリュームを除く、リクエストされたすべてのプロップをループする。 { result += expenses[i][j]; } // より多くの投資により、より多くのリターンが期待できる。 volumes[i + 1] = expenses[i][STAT_PROPS - 1] * value + volumes[i]; balance[i + 1] = result + balance[i]; } const double r2 = RSquaredTest(balance, volumes); #undef STAT_PROPS return r2 * 100; } 黄色は、1つのシンボルを取引した場合の計算(前の例)と比較して、追加しなければならないものを示しています。 123 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
コンパイルに成功するには、このように変更する必要があります:#property tester_set "¦Presets¦FrameTransfer.set"
というように変更しないとコンパイルに成功しません。#property tester_set "/Presets/FrameTransfer.set"`でも失敗します。
おそらく、アルゴリズムブックの記述を修正できるだろう:
ビルド5506で修正可能です。
最適化結果の 表から判断して、回収率とシャープ・パラメーターの組み合わせが得られています。
使用例
注意異なるシンボルが取引されている場合、出来高の適切な推定を得るために、例えばロットから預金通貨の価値に変換する必要があります(簡略化されたバリエーションの1つ):
黄色は、1つのシンボルを取引した場合の計算(前の例)と比較して、追加しなければならないものを示しています。