記事「MQL5取引ツール(第24回):3Dカーブ、パンモード、ViewCubeナビゲーションによる奥行き感の向上」についてのディスカッション

 

新しい記事「MQL5取引ツール(第24回):3Dカーブ、パンモード、ViewCubeナビゲーションによる奥行き感の向上」はパブリッシュされました:

MQL5の3D二項分布グラフ表示ツールを拡張し、確率質量関数(PMF)の奥行き感を向上させるセグメント化された3Dカーブを追加するとともに、注視点を移動できるパンモードと、素早く視点を切り替えられるインタラクティブなViewCubeを実装します。さらに、ViewCube内の面・辺・頂点に対応するクリック可能なサブゾーンを追加し、標準ビューへのカメラ遷移をアニメーションでおこなえるようにします。これらの機能を、2D/3D表示の切り替え、リアルタイム更新、各種カスタマイズ設定と組み合わせることで、トレードにおける確率分布分析を、より直感的で没入感のある分析環境を実現します。

実際のマーケット分析では、奥行きを持つ3Dカーブとヒストグラムを組み合わせることで、確率質量関数のピークが最頻度ビンと一致しているかを視覚的に確認し、モデルが適切に較正されているかを判断できます。また、パン機能を利用して低確率領域(テール)を画面中央へ移動すれば、極端な結果に基づくポジションサイズの検討前に詳細な分析をおこなえます。さらに、ViewCubeの上面ビューでは全ビンの高さを一度に比較でき、正面ビューでは各ビンの値を読み取りやすくなります。

本記事では、ボックスベースのカーブセグメントを生成し、それらを適切なサイズ・回転で配置して連続したチューブ状カーブを構築します。また、カメラ基準のベクトル計算を用いたパン処理、投影頂点と面ソートによる正しい描画順序を備えたViewCubeのレンダリング、さらに細分化されたホバー領域を実現する双線形補間についても実装します。加えて、視点遷移のタイマー制御アニメーション、アイコンやViewCubeを描画するためのアルファブレンドオーバーレイ、クリック・ホバーイベント処理も統合し、ユーザーインターフェース全体をより応答性の高いものへ仕上げます。以下では、本記事で実現する機能をご覧ください。

3Dカーブ、パンモード、ViewCubeフレームワーク


作者: Allan Munene Mutiiria

 
3D曲線が表示されない
3次元表示で2D曲線が表示されている
 
Nikolai Semko #:
3D曲線が表示されません
3Dビューで2D曲線が表示されています
ご意見をいただきありがとうございます。

現在、3Dカーブセグメントの位置決めはシーンのレンダリング完了後、1ステップ遅れて行われるため、最初の静止フレームではまだ配置されていません。キャンバス上で1回、オービット(左クリック&ドラッグ)またはズーム(スクロールホイール)を行ってください。これにより再度レンダリングが実行され、カーブが表示されます。

3D表示に切り替えた瞬間にカーブをレンダリングさせたい場合は、カーブのレンダリング関数をレンダリング呼び出しの前に移動させてください。以下を参照してください:

変更前:

   //+------------------------------------------------------------------+
   //| 3Dシーンを描画し、その上に2D UI要素を重ねる            |
   //+------------------------------------------------------------------+
   void render3DVisualization()
     {
      //--- データが読み込まれていない場合は処理を中止する
      if(!m_isDataLoaded) return;

      //--- このフレームのビュー変換とライト変換を再計算する
      updateCameraPosition();
      //--- 現在のデータに合わせて、すべての3Dヒストグラムのバーの位置を調整する
      update3DHistogramBars();

      //--- クリアパスには設定された背景色を使用する
      color bgColor     = backgroundTopColor;
      uint  bgColorArgb = ColorToARGB(bgColor, 255);
      //--- カラーバッファと深度バッファをクリアし、3Dシーンを描画する
      m_mainCanvas.Render(DX_CLEAR_COLOR | DX_CLEAR_DEPTH, bgColorArgb);

      //--- 2Dの境界枠を3Dレンダリングに重ね合わせる
      if(showBorderFrame)
         draw3DBorder();
      //--- レンダリングされた3D画像の上にヘッダーバーを重ねる
      drawHeaderBarOn3D();
      //--- 有効になっている場合は、統計パネルと凡例をオーバーレイ表示する
      if(showStatistics)
        {
         drawStatisticsPanelOn3D();
         drawLegendOn3D();
        }
      //--- このフレームのすべてのPMF曲線チューブセグメントの位置を再調整する
      update3DCurveSegments(); // THIS IS AFTER THE SCENE RENDERS, SO THE 3D SEGMENTS DELAY RENDERING UNTIL INTERACTION. SEE THE CANVAS RENDER ABOVE IN YELLOW
      //--- パンモードの切り替えアイコンを描画する
      drawPanIconOverlay();
      //--- インタラクティブなビューキューブウィジェットを描画する
      drawViewCubeOverlay();
      //--- マウスカーソルを乗せたときに、サイズ変更グリップのインジケーターを表示する
      if(m_isHoveringResizeZone && enableResizing)
         drawResizeIndicatorOn3D();
      //--- ピクセルバッファをチャートオブジェクトに書き込み
      m_mainCanvas.Update();
     }

変更後:

   //+------------------------------------------------------------------+
   //| 3Dシーンを描画し、その上に2D UI要素を重ねる            |
   //+------------------------------------------------------------------+
   void render3DVisualization()
     {
      //--- データが読み込まれていない場合は処理を中止する
      if(!m_isDataLoaded) return;

      //--- このフレームのビュー変換とライト変換を再計算する
      updateCameraPosition();
      //--- 現在のデータに合わせて、すべての3Dヒストグラムのバーの位置を調整する
      update3DHistogramBars();
      //--- レンダリングの前に、すべてのPMF曲線チューブセグメントの位置を再調整する
      update3DCurveSegments(); // JUST MOVE THE FUNCTION BEFORE THE 3D RENDER FOR INSTANT RENDERING, TO BE COUPLED WITH THE 3D BARS

      //--- クリアパスには設定された背景色を使用する
      color bgColor     = backgroundTopColor;
      uint  bgColorArgb = ColorToARGB(bgColor, 255);
      //--- カラーバッファと深度バッファをクリアし、3Dシーンを描画する
      m_mainCanvas.Render(DX_CLEAR_COLOR | DX_CLEAR_DEPTH, bgColorArgb);

      //--- 2Dの境界枠を3Dレンダリングに重ね合わせる
      if(showBorderFrame)
         draw3DBorder();
      //--- レンダリングされた3D画像の上にヘッダーバーを重ねる
      drawHeaderBarOn3D();
      //--- 有効になっている場合は、統計パネルと凡例をオーバーレイ表示する
      if(showStatistics)
        {
         drawStatisticsPanelOn3D();
         drawLegendOn3D();
        }
      //--- パンモードの切り替えアイコンを描画する
      drawPanIconOverlay();
      //--- インタラクティブなビューキューブウィジェットを描画する
      drawViewCubeOverlay();
      //--- マウスカーソルを乗せたときに、サイズ変更グリップのインジケーターを表示する
      if(m_isHoveringResizeZone && enableResizing)
         drawResizeIndicatorOn3D();
      //--- ピクセルバッファをチャートオブジェクトに書き込み
      m_mainCanvas.Update();
     }

ご指摘ありがとうございます。お役に立てれば幸いです。ありがとうございます。

 
Nikolai Semko #:
3D曲線が表示されない
3次元表示で2D曲線が表示されている
同感です。
 
Allan Munene Mutiiria #:
ご感想をいただき、ありがとうございます。

現在、3D曲線のセグメントはシーンのレンダリングが行われる1ステップ後に配置されるため、最初の静止画にはまだ表示されていません。 キャンバス上で一度、回転(左クリックでドラッグ)またはズーム(スクロールホイール)を行ってください。これにより再レンダリングが実行され、曲線が表示されます。

3D表示に切り替えた瞬間に曲線が即座にレンダリングされるようにしたい場合は、曲線のレンダリング処理を、シーン全体のレンダリング呼び出しの前に移動させてください。以下を参照してください:

変更前:

変更後:

ご指摘ありがとうございます。お役に立てれば幸いです。ありがとうございます。

私の言っていることが伝わっていませんでした。
正確には、正しく理解されていませんでした。
3D曲線はなく、2D曲線のみです。 特に記事では、正しい用語を使うことが重要です。

こちらが3D曲線の例です。3次元空間にある曲線の場合、その曲線を任意の平面に投影しても、あなたのケースのように直線になることは決してありません。

 
Nikolai Semko #:
私の話を聞いていなかったんですね。
というか、正しく聞いていなかったということですね。
3Dの曲線など存在せず、あるのは2Dの曲線だけです。特に記事では、正しい用語を使うことが重要です。

こちらが3D曲線の例です。曲線が3次元空間にある場合、その曲線を任意の平面に投影しても、あなたのケースのように直線になることは決してありません。

なるほど、おっしゃる意味がわかりました。ごもっともです。用語に関してはご指摘の通りです。厳密に言えば、これは平面曲線(Z軸は固定で、成功回数と確率のみが変動する)ですので、本来の意味での3D曲線ではありません。その点は承知しました。

私の意図は、PMFを3Dシーン内の実際のオブジェクトとしてレンダリングすることでした。回転可能で、チューブ状の形状を持ち、3Dヒストグラムの棒グラフの横に配置し、レンダリング時にそれらと位置が揃ったままになり、同じ空間内で両方を一緒に追跡できるようにするというものです。 つまり、「3D」とは、真の空間曲線という意味ではなく、3Dビュー内でレンダリングされるという意味で用いました。ご指摘ありがとうございます。