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

 

新しい記事「多通貨エキスパートアドバイザーの開発(第2回):取引戦略の仮想ポジションへの移行」はパブリッシュされました:

複数の戦略を並行して動作させる多通貨エキスパートアドバイザー(EA)の開発を続けましょう。マーケットポジションを建てることに関連するすべての作業を、戦略レベルから、戦略を管理するEAのレベルに移してみましょう。戦略自体は、マーケットポジションを持つことなく、仮想の取引のみをおこないます。

前回の記事では、様々な取引戦略と同時に機能する多通貨EAの開発に着手しました。最初の段階では2種類の戦略しかありませんでした。これらは同じ取引アイデアの実装を表し、同じ取引商品(銘柄)とチャート期間(時間枠)で動作しました。両者の違いはパラメータの数値のみでした。

また、希望する最大ドローダウンレベル(入金の10%)に基づいて、ポジションの最適なサイズを決定しました。それぞれの戦略についてこれを別々におこないました。この2つの戦略を組み合わせると、所定のドローダウンレベルを維持するために、建てたポジションのサイズを小さくしなければなりませんでした。減少幅は2つの戦略については小さいものでしたが、何十、何百もの戦略インスタンスを組み合わせたい場合はどうするのでしょうか。戦略によっては、ブローカーが許容するポジションの最小サイズより小さい値にポジションサイズを縮小しなければならないことも十分にあり得ます。この場合、これらの戦略は取引に参加できません。どうすればうまくいくのでしょうか。

そのためには、戦略から、独自にポジションを建てたり、予約注文を出したりする権利を奪います。戦略は仮想取引をおこなうだけでよいのです。つまり、ある大きさのポジションをどのレベルで建てるべきかを記憶し、要求に応じて今どの程度の数量を建てるべきかを報告します。すべての戦略を調査し、所定のドローダウンを維持するためのスケーリングを考慮して、必要な総量を計算した後にのみ、実際のマーケットポジションを建てます。

今は、この方法の適合性をテストすることにしか興味がなく、その実装の効率性には興味がありません。したがって、この記事の枠組みの中で、この方法の少なくともいくつかの実用的な実装を開発しようと試みます。間違いを避ける方法に関する知識がすでにあるため、後で建築の観点からより美しいものを構築するのに役立ちます。

作者: Yuriy Bykov

 

まだ読み終えていない。インプットは良い例だ。

1.

input string      symbol_              = "EURGBP";    // 取引商品(シンボル)
input ENUM_TIMEFRAMES  timeframe_       = PERIOD_H1;   // スケジュール期間

input group "===オープニング・シグナルのパラメーター"
input int         signalPeriod_        = 13;    // 出来高平均のローソク足の本数
input double      signalDeviation_     = 0.3;   // 1順目オープン時の平均からの相対偏差
input double      signaAddlDeviation_  = 1.0;   // 2回目以降の注文を開始する際の平均からの相対的乖離

input group "===保留中の注文パラメータ"
input int         openDistance_        = 0;     // 価格から未決注文までの距離
input double      stopLevel_           = 10500; // ストップロス(ポイント)
input double      takeLevel_           = 465;   // テイクプロフィット(単位:pips)
input int         ordersExpiration_    = 1000;  // 保留注文の有効期限(分)

input group 「資本管理オプション
input int         maxCountOfOrders_    = 3;     // 同時にオープンされた注文の最大数
2.
int OnInit() {
   expert = new CAdvisor(new CVolumeReceiver(magic_));
   expert.Add(new CSimpleVolumesStrategy(
                         symbol_, timeframe_,
                         fixedLot_,
                         signalPeriod_, signalDeviation_, signaAddlDeviation_,
                         openDistance_, stopLevel_, takeLevel_, ordersExpiration_,
                         maxCountOfOrders_)
                     );       // ストラテジーのインスタンスを1つ追加する

   return(INIT_SUCCEEDED);
}
3.
class CSimpleVolumesStrategy : public CStrategy {
private:
   //--- オープニング・シグナルのパラメータ
   int               m_signalPeriod;       // 出来高平均のローソク足の本数
   double            m_signalDeviation;    // 1順目オープン時の平均からの相対偏差
   double            m_signaAddlDeviation; // 2回目以降の注文を開始する際の平均からの相対的乖離

   //--- 保留注文のパラメータ
   int               m_openDistance;       // 価格から未決注文までの距離
   double            m_stopLevel;          // ストップロス(ポイント)
   double            m_takeLevel;          // テイクプロフィット(単位:pips)
   int               m_ordersExpiration;   // 保留注文の有効期限(分)

   //--- 資本管理パラメーター
   int               m_maxCountOfOrders;   // 同時にオープンされた注文の最大数

4.

public:
   //--- パブリック・メソッド
   CSimpleVolumesStrategy(
      string           p_symbol,
      ENUM_TIMEFRAMES  p_timeframe,
      double           p_fixedLot,
      int              p_signalPeriod,
      double           p_signalDeviation,
      double           p_signaAddlDeviation,
      int              p_openDistance,
      double           p_stopLevel,
      double           p_takeLevel,
      int              p_ordersExpiration,
      int              p_maxCountOfOrders
   ); 

5-6.

//+------------------------------------------------------------------+
//| コンストラクタ|
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy(
   string           p_symbol,
   ENUM_TIMEFRAMES  p_timeframe,
   double           p_fixedLot,
   int              p_signalPeriod,
   double           p_signalDeviation,
   double           p_signaAddlDeviation,
   int              p_openDistance,
   double           p_stopLevel,
   double           p_takeLevel,
   int              p_ordersExpiration,
   int              p_maxCountOfOrders) :
   // 初期化リスト
   CStrategy(p_symbol, p_timeframe, p_fixedLot), // 基本クラスのコンストラクタを呼び出す
   m_signalPeriod(p_signalPeriod),
   m_signalDeviation(p_signalDeviation),
   m_signaAddlDeviation(p_signaAddlDeviation),
   m_openDistance(p_openDistance),
   m_stopLevel(p_stopLevel),
   m_takeLevel(p_takeLevel),
   m_ordersExpiration(p_ordersExpiration),
   m_maxCountOfOrders(p_maxCountOfOrders) {
   ArrayResize(m_orders, m_maxCountOfOrders);

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

// ティック・ボリュームのアレイ・レシーバーのサイズと必要なアドレッシングを設定する。
   ArrayResize(volumes, m_signalPeriod);
   ArraySetAsSeries(volumes, true);
}

各入力パラメーターは5、6回規定されなければならない。

 
Сравнивая эти результаты с результатами аналогичного советника, но не использующего виртуальные позиции, можно отметить улучшение некоторых показателей: немного увеличилась прибыль и уменьшилась просадка, подрос коэффициент Шарпа и профит-фактор.
大雑把に言えば、ヘッジからネットに切り替え、それに対応するスタッツを得た。"改善"。例えば、スワップを請求する数量の削減などである。
 

記事を読む著者に感謝する。私たちはどのような方向に進むことができるのか、よく探っている。


Нас сейчас будет интересовать только проверка пригодности такого подхода, а не эффективность его реализации. Поэтому в рамках этой статьи мы постараемся написать хотя бы какую-то рабочую реализацию этого подхода, которая в дальнейшем поможет нам построить более красивую с архитектурной точки зрения. Поможет не в том смысле, что мы будем улучшать уже имеющуюся, а в том, что мы сможем понять, что вот так делать не надо, а можно сделать по-другому, и это будет лучше.

強力な観察であり、批判することに意味はなく、建設的な部分、つまり提案することに直行すべきである。


この記事では、仮想取引のコンセプトと、仮想取引と現実取引の一方向同期について論じている。テスターのための一例としては十分だろう。しかし、あくまで例としてである。

実際には、このようなTSポートフォリオはEX5から構築される(Testerは無料) - 実行し、シングルランのtstファイルを取得し、そこから任意のMMルールでジョイントシングルランを作成する。


テスターにはスピードが必要だ。仮想化の有無で最適化のスピードがどの程度変わるかを見積もってみてください。


コンセプト自体は実際の取引に適しています。しかし、シンクロナイザーには仮想取引の履歴を残しておく必要があります。いろいろなことがある。控えめに言っても深刻な方法だ。


アーキテクチャ上、仮想化はTSから切り離されることになる。現在の仮想化のソースは350Kbしかない。そして、それは成長するだろう。


仮想取引のための取引APIの選択には慎重にアプローチする。利用可能なものから選択する。TSをプログラムするのができるだけ簡単なAPIを優先するのが論理的だ。私は、すべての取引プラットフォームが独自の自転車 - 取引APIを発明するための一般的な慣行を本当に理解していない。OOPエンティティを "箱から出して "使うなど。この意味で、MQは良い方向に進みました - OOPなしのすべてのAPI。

 

このような記事を読む前に、私はいつもテスト 結果を見る。少なくともテスターでは。5年間で19%の利益を見たとき、私は心が軽くなり、幸せな気分になった!これは、ニューラルネットワークに関する75の記事の著者よりもはるかに多い!))

しかし、今ではFXで確実に儲ける方法は明らかです。以前は、エリオット波動についてカモに教えることしか考えていませんでしたが、まだ素晴らしい方法があることがわかりました))。

 
fxsaber #:

記事を読む著者に感謝。どの方向に進むべきか、良い洞察が得られた。

関心と建設的なコメントをどうもありがとう。それらを考慮し、できるだけ活用するようにしている。今は時間がないので、後で詳しくお返事します。

 
Alexey Volchanskiy テスト 結果を見る。少なくともテスターでは。5年間で19%の利益を見たとき、私は心が軽くなり、幸せな気分になった!これは、ニューラルネットワークに関する75の記事の著者よりもはるかに多い!))

しかし、今ではFXで確実に儲ける方法は明らかです。以前は、エリオット波動についてカモに教えることしか考えていませんでしたが、まだ素晴らしい方法があることがわかりました))。

私はここで、テストの5年間の利益の19%が1000ドル未満のドローダウンの条件で一定のロット、つまり1%によって作られたことを指摘せずにはいられない。最大ドローダウンが10%でもあることに注目し、可変ロットを使用すれば、結果はさらに興味深いものになるだろう。

 
//+------------------------------------------------------------------+
//|SimpleVolumesExpertSingle.mq5
//|著作権 2024, Yuriy Bykov||ユーリイ・バイコフ
//|https://www.mql5.com/ja/users/antekov
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Yuriy Bykov"
#property link      "https://www.mql5.com/ja/articles/14107"
#property description "ローソク足のティックボリュームが平均ボリュームを超えた瞬間のExpert Advisorのペンディングオーダー"
#property description 「現在のキャンドルの方向へ。
#property description 「まだポジションになっていない注文は、満期時に削除される。
#property description "オープンポジションはSLまたはTPでのみクローズする"

#include "Advisor.mqh"
#include "SimpleVolumesStartegy.mqh"

誤字だ。

 
fxsaber #:

誤字だ。

はい、何カ所か訂正しましたが、まだどこかに残っています。

 
fxsaber #:

実際には、このようなTSのポートフォリオはEX5(テスター向けマーケットから無料で入手可能)から構築される。

このオプションはまだ考えたことがない。しかし、マーケットから既製のExpert Advisorの良いセットを見つけることができた場合、どのようにそれらを一緒に使うことができますか?選択したMMパラメータでセット全体を実行するだけですか?

 
fxsaber #:

テスターにはスピードが必要です。仮想化ありのバリアントと仮想化なしのバリアントで、最適化のスピードがどれくらい変わるかを見積もってみてください。

試してみますが、同時に実行される戦略の数が数十から数百インスタンスになると、利得が顕著になるようです。

テストをスピードアップするための仮想 ライブラリーの使い方について、もっと詳しく説明しようと思っているのですが、まだできていません。主な理由は、MT5の取引機能に慣れていることです。MT4からMT5にエキスパートアドバイザーを再設計する必要があったとき、それに関連する多くの不都合がありました。

現在、CReceiverからVirtual環境を利用する子クラスを作ろうと考えています。