記事「多通貨エキスパートアドバイザーの開発(第2回):取引戦略の仮想ポジションへの移行」についてのディスカッション - ページ 5

 
mytarmailS #:
市場では、単純なTSのバスケットよりも複雑なモデルの方がうまくいくという事実はない。
そうですね、それぞれのTSを谷まで飲まずに、オプティマイザーを何回か通した後に新しいTSを追加する必要があります。
 
Maxim Dmitrievsky バギング(バスケット)ではなく、ブースティングを行うことができる。これは、1つのストラテジーをまず最適化し、そのシグナルを 2つ目のストラテジーのパラメーターとして代用 し、2つ目のストラテジーを最適化する、というものである。

ブースティングの 実装は、非常に非自明な作業のように思える。通常、ストラテジーのパラメーターは開始時に設定され、ストラテジーの実行中に何らかのアルゴリズムによって開閉シグナルが決定される。建玉の履歴を何らかの統一された形で保存しておくとすると、そのすべてを2つ目のストラテジーの入力に与えなければならない......。そうなのだろうか?この情報をアルゴリズム(関数)とその固定パラメータという形で与えてしまうと、同じバギングでも、裏ワザがあることにならないか?

 

ありがとうございます。テスターの*.optファイルや*.tstファイルを操作するためのあなたのライブラリを容赦なく運用するつもりです。

 
Yuriy Bykov #:

ハイライトの 実装は非常に非自明なタスクであるように思える。通常、ストラテジーのパラメーターは起動時に設定され、開閉シグナルはストラテジーの実行中に何らかのアルゴリズムによって決定される。建玉の履歴を何らかの統一した形で保存しておくとすると、そのすべてを2つ目のストラテジーの入力に与えなければならない......。そうなのだろうか?この情報をアルゴリズム(関数)とその固定パラメータという形で与えてしまうと、同じバギングでも、裏ワザがあることにならないか?

オプティマイザでどうするかは考えていない。いや、次の戦略が前の戦略を改善する、つまりその上に構築されることがわかるはずだ。具体的にどのように可視化するかは、時間の問題だ。インターネットでブーストツリーの仕組みを調べて、それをデザインの基礎にすればいい。たしかにニュアンスはいろいろあるかもしれない。でも、自分ではやらない。なぜなら、これはすべてMOのアルゴリズムにすでにあるからだ。また、万能薬ではありませんが、特性的にはTCポートフォリオよりも良くなる可能性があります。

 
Maxim Dmitrievsky #:

オプティマイザーを使った方法は考えていなかった。

これは、適切なmqhをmq5に接続することで完全に自動化できるルーチンだ。


アルゴリズムは以下の通り。

  1. フォルダには、以前のパス(パスがない場合は空)がファイルの形で格納されている。
  2. 新しい最適化が開始されます。TSそのものが取引され、ポイント1からの取引が追加されます。この場合、MMはp.1とTSの間に均等に配分される。
  3. 最適化のベスト・パス(あらゆる種類のOnTester)が項目1に記録される。
  4. p.2.では、TSがポートフォリオで望む回数だけ。

つまり、好きなものを混ぜ合わせることができる。完全な探索であっても、最終的な結果がTSの起動順序に依存することは明らかである。

また、SBであっても、パスするたびに指標が改善されることは明らかであるが、それはフィッティングであろう。

 
Yuriy Bykov #:

コードを拝見しました。入力パラメータを渡すことについては後で調べてみます。もし、完全にこの方法を取ることがうまくいかなかったとしても、いくつかのポイントは非常に役に立ちそうです。

この記事のコードに、もう一度(付録の)入力を使った現在の結果を適用してみました。

SimpleVolumesExpertSingle.mq5が どのようなものになったかの例です。

#define  INPUT_STRUCT_ADDON
#include "Advisor.mqh"
#include "SimpleVolumesStrategy.mqh"
#include "VolumeReceiver.mqh"

input string      symbol_              = "EURGBP";    // 取引商品(シンボル)
input group "===アドバイザーのパラメーター"
input ulong       magic_              = 27181; // マジック

CAdvisor     *expert;         // エキスパート・オブジェクトへのポインタ

//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit() {
   expert = new CAdvisor(new CVolumeReceiver(magic_));

   // ストラテジーのインスタンスを1つ追加する
   expert.Add(new CSimpleVolumesStrategy( symbol_, inStrategyInput + inSimpleVolumesStrategyInput));

   return(INIT_SUCCEEDED);
}


このコードでインプット(SimpleVolumesStrategyInput.mqh)の一回限りの処方を実現することができました。

//https://www.mql5.com/ja/code/47932
// この文字列を使用して、すべての入力を検索する mqh.
// #include <fxsaberInput_Struct\Input_Struct.mqh> // オリジナル

#define  TYPENAME_INPUT SimpleVolumesStrategyInput

#define  MACROS_MULTI                    \
  MACROS(signalPeriod, int, 13)         \ // ボリューム平均のローソク足の本数
  MACROS(signalDeviation, double, 0.3)  \ // 1順目オープン時の平均からの相対偏差
  MACROS(signaAddlDeviation, double, 1) \ // 2回目以降の注文を開始する際の平均からの相対的乖離
  MACROS(openDistance, int, 0)          \ // 価格から未決注文までの距離
  MACROS(stopLevel, double, 10500)      \ // ストップロス(ポイント)
  MACROS(takeLevel, double, 465)        \ // テイクプロフィット(単位:pips)
  MACROS(ordersExpiration, int, 1000)   \ // 保留注文の有効期限(分)
  MACROS(maxCountOfOrders, int, 3)        // 同時にオープンされた注文の最大数

ファイル:
 
fxsaber #:

この記事のコードに、再びインプットを使った現在の結果を適用してみた(付録)。

SimpleVolumesExpertSingle.mq5が どのようになったかの例です。


このコードでインプット(SimpleVolumesStrategyInput.mqh)の一回限りの処方を実現することができた。

それは、以前の変種よりも明らかに簡単であるように私には思えた。とはいえ、他人のコードを改めて見ると、その都度明快でシンプルになるということなのかもしれませんが。ありがとうございました!勉強していてふと疑問に思ったのですが、"// Copy-Paste update from here: "の後のコードは、貼り付けるのではなく、インクルードファイルに入れて添付することはできないのでしょうか?今すぐ実験するのは不便なので、お聞きしようと思いました。

第3回目の記事では、まだ入力パラメータまで到達していない :(.でも、必ずできるようになるよ。

 
Yuriy Bykov #:

勉強中に疑問が湧いた。"// Copy-Paste update from here: "の後に来るコードを、貼り付けるのではなく、インクルード・ファイルに入れて差し込むことは可能なのだろうか?今すぐ実験するのは不便なので、質問することにした。

残念ながら、それはできない。なぜなら、同じファイルの#includeは一度しか起こらないからだ。それ以降は無視される。

これが、まったく同じファイルを別の名前で 作らなければならなかった理由のひとつです。


しかし、一般的には、コピー・ペースト・オプションは2、3回クリックするだけだ。そのコードを理解する必要はない。

PriceChannel
PriceChannel
  • www.mql5.com
Ценовой канал произвольной длительности (таймфрейм) бара.
 
Yuriy Bykov #:

第3回目の記事では、まだ入力パラメーターに到達していない :(.でも、必ず来るよ。

あなたのアーキテクチャーは私のアーキテクチャーとは多少違うので、INPUT_STRUCTにこのプロジェクトで役に立つような多くのものを提供しなかった。

あなたが公開しなかったのはいいことだと思う。なぜなら、私はそれをもう一度作り直したからだ。

将来の利便性のために、グループ、文字列入力、その他いくつかの小さなものを追加した。

#define  TYPENAME_INPUT StrategyInput

#define  MACROS_MULTI                           \
  INPUT(symbol, string, "EURGBP")              \ // 取引商品(シンボル)
  INPUT(timeframe, ENUM_TIMEFRAMES, PERIOD_H1) \ // チャートの期間(タイムフレーム)
  GROUP(「資本管理オプション) \
  INPUT(fixedLot, double, 0.01)                  // オープンポジションのサイズ(固定)
#define  TYPENAME_INPUT SimpleVolumesStrategyInput

#define  MACROS_MULTI                           \
  GROUP("===オープニング・シグナルのパラメーター")   \
  INPUT(signalPeriod, int, 13)                 \ // ボリューム平均のローソク足の本数
  INPUT(signalDeviation, double, 0.3)          \ // 1順目オープン時の平均からの相対偏差
  INPUT(signaAddlDeviation, double, 1)         \ // 2回目以降の注文を開始する際の平均からの相対的乖離
  GROUP("===保留中の注文パラメータ")   \
  INPUT(openDistance, int, 0)                  \ // 価格から未決注文までの距離
  INPUT(stopLevel, double, 10500)              \ // ストップロス(ポイント)
  INPUT(takeLevel, double, 465)                \ // テイクプロフィット(単位:pips)
  INPUT(ordersExpiration, int, 1000)           \ // 保留注文の有効期限(分)
  GROUP(「資本管理オプション) \
  INPUT(maxCountOfOrders, int, 3)                // 同時にオープンされた注文の最大数


アプリケーション・コードの一部。

#define  INPUT_STRUCT_ADDON
#include "Advisor.mqh"
#include "SimpleVolumesStrategy.mqh"
#include "VolumeReceiver.mqh"

input group "===アドバイザーのパラメーター"
input ulong       magic_              = 27181; // マジック

CAdvisor     *expert;         // エキスパート・オブジェクトへのポインタ

//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit() {
   expert = new CAdvisor(new CVolumeReceiver(magic_));

   // ストラテジーのインスタンスを1つ追加する
   expert.Add(new CSimpleVolumesStrategy(inStrategyInput + inSimpleVolumesStrategyInput));

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| コンストラクタ|
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy( const string sInputs ) : CStrategy(sInputs)
{
   this.Input = sInputs;

   ArrayResize(m_orders, this.Input.maxCountOfOrders);

   // ティックボリュームを取得するためにインジケータをロードする。
   iVolumesHandle = iVolumes(this.InputStrategy.symbol, this.InputStrategy.timeframe, VOLUME_TICK);

// ティック・ボリュームのアレイ・レシーバーのサイズと必要なアドレッシングを設定する。
   ArrayResize(volumes, this.Input.signalPeriod);
   ArraySetAsSeries(volumes, true);
}
//+------------------------------------------------------------------+
//|| コンストラクタ|
//+------------------------------------------------------------------+
CStrategy::CStrategy( const string sInputs ) : m_isChanged(false)
{
  this.InputStrategy = sInputs;
}
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit() {
// パラメーターが正しいかチェックする
   if(startIndex_ < 0 || startIndex_ + totalStrategies_ > 9) {
      return INIT_PARAMETERS_INCORRECT;
   }

// ストラテジーのインスタンスの配列を作成し、入力する。
   CStrategy *strategies[9];

   StrategyInput InputBase;
   SimpleVolumesStrategyInput Input;

   InputBase.timeframe = PERIOD_H1;

   // 最初の設定方法は、初期化である。
   const StrategyInput InputBase0 = {"EURGBP", PERIOD_H1, NormalizeDouble(0.01 / 0.16 * depoPart_, 2)};
   const SimpleVolumesStrategyInput Input0 = {13, 0.3, 1.0, 0, 10500, 465, 1000, 3};
   strategies[0] = new CSimpleVolumesStrategy(InputBase0 + Input0);

   // 2番目の指定方法は、文字列と配列によるものである。
   InputBase.fixedLot = NormalizeDouble(0.01 / 0.09 * depoPart_, 2);
   const double Array1[] = {17, 1.7, 0.5, 0, 16500, 220, 1000, 3};
   strategies[1] = new CSimpleVolumesStrategy(InputBase["symbol = EURGBP"] + "," + Input[Array1]);

   // 第3の指定方法は、フィールドの割り当てである。
   InputBase.fixedLot = NormalizeDouble(0.01 / 0.16 * depoPart_, 2);
   InputBase.symbol = "EURGBP";
   const double Array2[] = {51, 0.5, 1.1, 0, 19500, 370, 22000, 3};
   strategies[2] = new CSimpleVolumesStrategy(InputBase + Input[Array2]);
ファイル:
 
fxsaber #:

投稿されなかったのは良いことだ。私はもう一度、最も簡潔で使いやすいバージョン(最終的なものと思われる)に作り直したのだから。

そう、よくある状況だ。すべてがそこにあるように見えて、やり直すとさらに良くなる。というのも、すでに公開されているコードでパラメータを使用するシナリオに重点を置いているからです。セットへのパラメーターの組み込み、さらにはセットへの自動組み込みに関しては、おそらく同様に改善/単純化できることがわかるだろう。

ありがとう