記事「多通貨エキスパートアドバイザーの開発(第5回):可変ポジションサイズ」についてのディスカッション

 

新しい記事「多通貨エキスパートアドバイザーの開発(第5回):可変ポジションサイズ」はパブリッシュされました:

前回開発中のエキスパートアドバイザー(EA)は、固定されたポジションサイズのみを使用して取引をおこなうことができました。これはテスト用には許容できますが、実際の口座で取引する場合にはお勧めできません。可変のポジションサイズで取引できるようにしましょう。

前回は、再起動後にEAの状態を復元する機能を説明しました。端末の再起動、EAでのチャート時間枠の変更、より新しいバージョンのEAの起動など理由は何であっても、状態を復元することで、EAはゼロから作業を開始することなく、すでに建てられているポジションを失うことなく、処理を継続することができます。

しかし、建てたポジションのサイズは、テスト期間全体を通じて、戦略の各インスタンスで同じままでした。そのサイズはEAの起動時に設定されていました。EA操作の結果、取引口座の残高が増加した場合、リスクを増加させることなく、ポジションサイズを増加させることができるでしょう。これを活用するのが合理的なので、可変ポジションサイズの使用を実装し始めましょう。

作者: Yuriy Bykov

 

EA SimpleVolumesExpertを(3+3+3)とスケーリング2.18で実行すると、ログには仮想トレードがオープンされたことが表示されますが、ストラテジーテスターにはリアルトレードが表示されません。何か見落としたのでしょうか?

 
Nigel Philip J Stephens #:

SimpleVolumesExpertを(3+3+3)とスケーリング2.18で実行すると、ログにはオープン仮想トレードが表示されますが、ストラテジーテスターにはリアルトレードが表示されません。何か見落としたのでしょうか?

テスターの初期残高が$10000以上であることを確認してください。残高が十分でない場合、このような動作が発生します。この場合、すべてのバーチャルポジションがリアルポジションを生成するわけではありません。しかし、あなたの残高はおそらく正しいので、原因はおそらく他にあります。

EAを他のストラテジー・グルーピングで実行した場合、実際の取引はありますか?

 
あなたの記事を幅広く読ませていただき、まさに私が知識を広げるために必要なものだとわかりました。このトピックに関する入念な説明と思慮深いコーディングの決断に感謝している。ありがとうございました。
 

こんにちは。ご苦労様です。私はあなたのアーキテクチャに非常に興味があり、一歩一歩理解しようとしています。私はストラテジークラスだけを変更しました。しかし、この段階では、戦略のスケーリングに苦労しました。実験の純度を高めるために、ストラテジーのインスタンスを1つ、スケール乗数_を1と2(fixedBalance_ = 0;)の2つのバリエーションを使いました。どちらの場合も結果は同じで、ロットサイズは変わらない。ロット・サイズが決定されるコードの場所

//+------------------------------------------------------------------+
//| 仮想位置の実サイズを決定する。
//+------------------------------------------------------------------+
double CMoney::Volume(CVirtualOrder *p_order) {
   // この仮想ポジションの正規化ストラテジーバランスを要求する 
   double fittedBalance = p_order.FittedBalance();
   
   // この値が0の場合、実ボリュームは仮想ボリュームと等しい。
   if(fittedBalance == 0.0) {
      return p_order.Volume();
   }
   
   // そうでなければ、貿易収支の合計値を求める。
   double totalBalance = s_fixedBalance > 0 ? s_fixedBalance : AccountInfoDouble(ACCOUNT_BALANCE);
   
   // 仮想体積で計算された実体積を返す
   return p_order.Volume() * totalBalance * s_depoPart / fittedBalance ;
}
//+------------------------------------------------------------------+

しかし、パラメータ m_fittedBalance と m_fixedLot はデフォルトで仮想ストラテジーのコンストラクタに設定されています。

//+------------------------------------------------------------------+
//| コンストラクタ|
//+------------------------------------------------------------------+
CVirtualStrategy::CVirtualStrategy(double p_fittedBalance = 0,
                                   double p_fixedLot = 0.01) :
   m_fittedBalance(p_fittedBalance),
   m_fixedLot(p_fixedLot) {}

そのため、ロットサイズは変化しない。

// この値が0の場合、実ボリュームは仮想ボリュームと等しい。
   if(fittedBalance == 0.0) {
      return p_order.Volume();
   }

論理的には変化するはずですが。また、私のストラテジーは部分決済、ストップロス、カウンターシグナルでの決済を提供しているため、CVirtualOrderクラスにはすでにいくつかのメソッドを追加しています。

 

こんにちは。

可変ロット取引では、ストラテジーのインスタンスに m_fittedBalance > 0 という値を与える必要があります。このパラメータは彼らに渡され、彼らはそれを CVirtualStrategy コンストラクタの呼び出しに代入します:

class CSimpleVolumesStrategy : public CVirtualStrategy {
...

public:
   //--- パブリック・メソッド
   CSimpleVolumesStrategy(
      string           p_symbol,
      ENUM_TIMEFRAMES  p_timeframe,
      int              p_signalPeriod,
      double           p_signalDeviation,
      double           p_signaAddlDeviation,
      int              p_openDistance,
      double           p_stopLevel,
      double           p_takeLevel,
      int              p_ordersExpiration,
      int              p_maxCountOfOrders,
      double           p_fittedBalance = 0
   );                                     // コンストラクタ

   ...
};

...

//+------------------------------------------------------------------+
//| コンストラクタ|
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy(
   string           p_symbol,
   ENUM_TIMEFRAMES  p_timeframe,
   ...
   int              p_maxCountOfOrders,
   double           p_fittedBalance = 0) :
// 初期化リスト
   CVirtualStrategy(p_fittedBalance, 0.01),
   m_symbol(p_symbol),
   m_timeframe(p_timeframe),
   ...
}

インスタンスを作成するとき、デフォルト値である0が代入されないように、最後のパラメータに特定の値を指定します:

//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit() {
   // 資本管理クラスにパラメータを設定する
   CMoney::DepoPart(expectedDrawdown_ / 10.0);
   CMoney::FixedBalance(fixedBalance_);

   // 仮想ポジションで動作するExpert Advisorの作成
   expert = new CVirtualAdvisor(magic_, "SimpleVolumes_" + EnumToString(group_));

   // すべてのストラテジーのインスタンスの配列を作成し、それに値を入れる
   CVirtualStrategy *strategies[] = {
      new CSimpleVolumesStrategy("EURGBP", PERIOD_H1,  13, 0.3, 1.0, 0, 10500,  465,  1000, 3, 1600),
      new CSimpleVolumesStrategy("EURGBP", PERIOD_H1,  17, 1.7, 0.5, 0, 16500,  220,  1000, 3,  900),
      new CSimpleVolumesStrategy("EURGBP", PERIOD_H1,  51, 0.5, 1.1, 0, 19500,  370, 22000, 3, 1600),

     ...
   };

   ...

   return(INIT_SUCCEEDED);
}

SimpleVolumesExpertSingle.mq5 Expert Advisorでは、最適化は固定された初期ポジションサイズでのみ実行されるため、このようなことはしません。m_fixedLot パラメータは、ストラテジー内で、すべてのオープン仮想ポジションのサイズとして排他的に使用する必要はないことに注意してください。これは、他のポジションを計算するための基本的な値です。記事のモデル戦略では、単純にすべてのポジションのサイズは同じであり、このパラメータは変換されずに使用されます。しかし、別のストラテジーでサイズ10*m_fixedLotの仮想ポジションをオープンし、その段階的決済を適用することを妨げるものは何もありません。

 
Yuriy Bykov #:

こんにちは。

可変ロット取引では、ストラテジーのインスタンスに m_fittedBalance > 0 という値を与える必要があります。このパラメータは彼らに渡され、彼らはそれを CVirtualStrategy コンストラクタの呼び出しに代入します:

インスタンスを生成するとき、デフォルト値である0が代入されないように、最後のパラメータに特定の値を指定します:

SimpleVolumesExpertSingle.mq5 Expert Advisorでは、最適化は固定された初期ポジションサイズでのみ実行されるため、このようなことはしません。m_fixedLot パラメータは、ストラテジー内で、すべてのオープン仮想ポジションのサイズとして排他的に使用する必要はないことに注意してください。このパラメータは、他のパラメータを計算するための基本的な値にすぎません。記事のモデル戦略では、単純にすべてのポジションのサイズは同じであり、このパラメータは変換されずに使用されます。しかし、別のストラテジーでサイズ10*m_fixedLotの仮想ポジションをオープンし、その段階的決済を適用することを妨げるものは何もありません。

こんにちは。早速のお返事ありがとうございます。わかりました。最後のパラメータが追加されていることにすぐには気づきませんでした。というのも、私自身のストラテジークラスを使用しており、パラメータセットが少し異なっていたからです。