English
preview
取引戦略の開発:Flower Volatility Indexのトレンドフォローアプローチ

取引戦略の開発:Flower Volatility Indexのトレンドフォローアプローチ

MetaTrader 5トレーディング |
14 0
Daniel Opoku
Daniel Opoku

はじめに

金融市場はリズムに従って動きます。拡張と収縮、加速と減速、トレンドの形成と周期的な回転などのパターンです。トレーダーは長年にわたり、このリズムを数学的にモデル化しようと試み、エントリー機会の定義、トレンド方向の特定、あるいは価格が均衡からどれだけ離れたかを示すシグナルを提供する指標を作成してきました。これらの価格ベースの数学モデルは、一般にテクニカル指標として知られ、トレーダーの目的に応じて異なる解釈がなされます。

これまでに、サイクルやトレンド、過伸展状態をマッピングする指標として際立ったものには、商品チャンネル指数(CCI, Commodity Channel Index)、勢力指数(Force Index)、ブル・ベアパワー(Bull and Bear Power)、相対活力指数(RVI, Relative Vigor Index)、サイクルライン(Cycle Lines)、フィボナッチタイムゾーン(Fibonacci Time Zones)などがあります。それぞれが市場構造への独自の洞察を提供します。

本記事では、古典的な数学関数であるバラ曲線に基づくトレンドフォロー戦略を紹介します。バラ曲線はイタリアの数学者グイド・グランディ(1671~1742)によって研究され、花のような幾何学的パターンを生成することから、この名が付けられました。この曲線のパラメータを再定義することで、新しいオシレーター「Flower Volatility Index (FVI)」を構築し、さらにこれを基にしたトレンドトレードのフレームワークを構築します。


数学的基盤:バラ曲線

バラ曲線は極座標方程式で定義されます。

RoseEqn

この動径函数を分解すると、デカルト成分が得られます。

x_y comp

この関数の性質は、テクニカル指標を構築するのに非常に適しています。挙動は有理比n/dによって決定され、プロットの形状、対称性、周期性を支配します。 これらの成分が、Flower Volatility Index (FVI)を構築する基盤となります。市場データにこの関数を適用する前に、その固有の性質を理解しておくとよいでしょう。

以下の図1から図3は、バラ曲線の放射状プロットの例を示しており、その多様性を視覚的に確認できます。

rose_n20_d1

図1:N=20、d=1

rose_n17_d3

図2:N=17、d=1

rose_n20_d7

図3:N=20、d=7

これらの放射状プロットから得られる主な観察点は以下の通りです。

  • パターンの多様性: 比n/dにより幅広いパターンが生成されます。有理数の場合は対称的な花弁状の構造を作り、比率1/2では単純な円を描きます。より大きな比率では、より複雑で多葉状の形状が生じます。

  • 花弁の数: 主要パラメータj = n/(2d)が花弁または葉の数を決定します。

    • jが整数かつ奇数の場合、曲線はj枚の花弁を持ちます。jが整数かつ偶数の場合、2j枚の花弁を生成します。たとえば、n=6、d=3の場合、j=1なので花弁は1枚です。n=16、d=2の場合、j=4なので花弁は8枚です。

    • jが有理数で整数でない場合、より複雑で不完全な花弁パターンが現れます。

    • 特殊な場合:n=dの場合、心臓形(カルディオイド)に似た形状が生成されます。

  • 対称性と振動: 曲線は一貫した回転対称性と反射対称性を示します。重要なのは、振幅が常に-1から1の間で振動するため、トレーダーが戦略上必要な成分(XまたはY)を選択できる、理想的な有界オシレーターとして利用できる点です。

バラ曲線のコード構造の確認


バラ曲線を構築するための最初のステップは、Canvasライブラリをインクルードすることです。このライブラリは、チャート上でグラフィカルオブジェクトを描画するために必要なすべてのプロパティと関数を提供します。ライブラリは、インジケーターやスクリプト内で視覚的要素を描画、プロット、管理するための基盤として機能します。

#include <Canvas\Canvas.mqh>


// Create canvas for drawing
int width = 800;   // Canvas width
int height = 600;  // Canvas height
string canvas_name = "FlowerCurve";

Canvasライブラリをインポートした後、描画領域の寸法を定義します。例として、キャンバスの幅を800ピクセル、高さを600ピクセルに設定します。

キャンバスには識別可能な名前「FlowerCurve」が割り当てられており、プラットフォームが描画面を参照および管理することができます。

CurvePlotting関数内では、バラ曲線の生成プロセスがキャンバスオブジェクトの作成から始まります。このオブジェクトは描画面として機能し、事前に定義したキャンバス名、チャート上の位置、フレームサイズ、選択したカラーフォーマットを使用して設定されます。キャンバスの初期化に失敗した場合は、エラーメッセージが出力され、関数は安全に終了します。
   // Create canvas object
   CCanvas canvas;
   if(!canvas.CreateBitmapLabel(canvas_name, 200, 50, width, height, COLOR_FORMAT_XRGB_NOALPHA))
     {
      Print("Error creating canvas: ", GetLastError());
      return;
     }

   // Set up drawing parameters
   int points = 1000;           // Number of points
   double t_start = -2 * M_PI;           // Start angle
   double t_end = 2 * M_PI;     // End angle
   double step = (t_end - t_start) / (points - 1);
   
   // Calculate curve points
   double x[], y[];
   ArrayResize(x, points);
   ArrayResize(y, points);
   
   for(int i = 0; i < points; i++)
     {
      double t = t_start + i * step;
      double rad = MathSin((n*t)/(2*d));
      y[i] = MathSin(t) * rad;
      x[i] = MathCos(t) * rad;
     }

キャンバスの作成が成功すると、関数は次にプロットに必要なパラメータの設定に進みます。これには、計算する総ポイント数の定義や、カーブの開始角度と終了角度の指定が含まれます。角度を定義された区間に均等に分割するためのステップ値も計算されます。

これらのパラメータを設定した後、関数は曲線のx座標とy座標を格納する配列を初期化します。その後、各ポイントを順に処理し、角度tを計算し、Flower Curveを定義する数学式を評価します。

Flower Curveの生のxおよびyデータ点を計算した後、CurvePlotting関数内の次のタスクは、これらの座標を適切にスケーリングして、カーブ全体がキャンバス内にきれいに収まるようにすることです。この処理は複数のステップでおこなわれ、まずxとyの最小値および最大値を特定します。これらの境界値は、曲線をどのように比例スケーリングするかを決定するうえで不可欠です。
   // Find coordinate bounds for scaling
   double x_min = x[ArrayMinimum(x)];
   double x_max = x[ArrayMaximum(x)];
   double y_min = y[ArrayMinimum(y)];
   double y_max = y[ArrayMaximum(y)];
   
   // Scale points to canvas coordinates
   int x_px[], y_px[];
   ArrayResize(x_px, points);
   ArrayResize(y_px, points);
   
   double x_scale = (width - 40) / (x_max - x_min);
   double y_scale = (height - 40) / (y_max - y_min);
   double scale = MathMin(x_scale, y_scale); // Maintain aspect ratio
   
   for(int i = 0; i < points; i++)
     {
      x_px[i] = (int)((x[i] - x_min) * scale) + 30;
      y_px[i] = height - (int)((y[i] - y_min) * scale) - 20; // Flip Y-axis for canvas coordinates
     }

極値を特定した後、関数は変換されたピクセル座標を格納する整数配列(x_pxとy_px)を作成します。両軸のスケーリング係数は、描画可能な領域に基づいて計算されます。この際、キャンバスの端に触れないよう余白を確保します。曲線の形状を歪めずに保持するために、x軸とy軸のスケーリング値のうち小さい方を統一スケーリング係数として選択します。

その後、各ポイントを数学座標からキャンバス座標に変換します。x値は右方向にシフトして余白を作り、y値は反転させます(キャンバス座標は下方向に増加するため)。これにより、曲線が正しい向きで表示されます。

CurvePlotting関数の最終段階では、Flower Curveをキャンバスに描画します。まず背景色を設定し、描画面をきれいに整え、視覚的に見やすくします。この実装では、曲線との柔らかいコントラストを生むためにGhostWhiteを背景色として使用しています。

次に、線の色を定義します。完全に不透明なBlueVioletの色調を選択し、そのARGB値をキャンバスの線描画メソッドに渡します。曲線自体は、スケーリングされた各データ点間を連続して線分で結ぶことでポリラインとしてプロットされます。

   // Draw the curve
   canvas.Erase(ColorToARGB(clrGhostWhite, 255)); // GhostWhite background

   // Set line color - we'll pass this directly to Line method
    uint line_color = ColorToARGB(clrBlueViolet, 255);
   
   // Draw the polyline
   for(int i = 1; i < points; i++)
     {
      canvas.Line(x_px[i-1], y_px[i-1], x_px[i], y_px[i], line_color);
     }
   
   // Add title
   canvas.FontSet("Cambria", 20, FW_BOLD);
   canvas.TextOut(300, 20, "Flower Curve: n=", ColorToARGB(clrBlack, 255));
   canvas.TextOut(445, 20, IntegerToString(n), ColorToARGB(clrBlack, 255));

   canvas.TextOut(470, 20, "&  d=", ColorToARGB(clrBlack, 255));
   canvas.TextOut(520, 20, IntegerToString(d), ColorToARGB(clrBlack, 255));
   
   // Update display
   canvas.Update();

視覚的なプレゼンテーションを完成させるために、関数はフォントのスタイル、サイズ、太さを設定します。明瞭さを重視して、Cambriaの太字フォントをサイズ20で選択しています。その後、曲線のタイトルをキャンバスの上部にcanvas.TextOutを用いて描画します。この際、Flower Curveを生成するために使用された現在のndの値が動的に表示されます。

すべての要素を描画した後、canvas.Update()メソッドを呼び出して表示を更新します。これにより、描画されたすべてのコンポーネントがチャート上で可視化されます。

Start関数による曲線生成の自動化

Start関数内では、描画プロセスをループ内にCurvePlotting関数を置くことで自動化します。この構造により、入力パラメータndの異なる組み合わせに対してFlower Curveを動的に描画できます。パラメータを調整することで、スクリプトはさまざまなカーブ形状を表示でき、それぞれが独自の数学的特性を反映します。

   int p=1;
   while (p<=nLimit) 
    {
    
     CurvePlotting(p);
     p++;
     Sleep(1000);

ndはユーザー定義の入力パラメータとして公開されており、トレーダーやアナリストはコアコードを変更せずにFlower Curveの形状を自由にカスタマイズできます。プログラム実行時には、指定された値を順番にループ処理し、各ペアに対してCurvePlottingを呼び出します。これにより、複数の曲線パターンをチャート上にシームレスに可視化できます。

幾何学から市場指標へ:Flower Volatility Indexの構築


Flower Volatility Index (FVI)オシレーターを開発する前に、バラ曲線のデカルト成分を確認することが有益です。極座標関数をXおよびY成分に変換すると、トレーダーに馴染みのある形で振動特性を理解できます。

図4から図7では、異なるndの値に対するバラ曲線関数のX成分とY成分を時間に対して表示しています。赤色のプロットがX成分、青色のプロットがY成分であり、いずれも角度に対して描画されています。

n5d1_x n5d1_y

図4:バラ曲線(n=5、d=1)

n1d1_x n1d1_y

図5:バラ曲線(n=1、d=1)

n5d7_x n5d7_y

図6:バラ曲線(n=5、d=7)

n20d8_x n20d8_y

図7:バラ曲線(n=20、d=8)

n7d4_x n7d4_y

図8:バラ曲線(n=7、d=4)

これらのデカルトプロットを分析すると、金融アプリケーションにおける重要な特性が明らかになります。

  • 有界振動: X成分とY成分はいずれも常に-1から1の範囲で振動しており、自然な買われすぎと売られすぎの境界を提供します。
  • 周波数の制御: パラメータnとdにより、振動の周波数を正確に制御できます。nの値が大きくなると周波数は増加し、dの値が大きくなると周波数は減少します。
  • 予測可能な周期性: 振動の周期はT = 4πd/nで表されます。これにより戦略的な調整が可能です。n/dの比率が小さいと長く滑らかなサイクルが生成され、大きなトレンドを捉えるのに適しています。比率が大きいと短く反応の早いサイクルが生成されます。

特殊な場合では、その柔軟性がさらに確認できます。

  • n = dの場合、関数はr(q) = sin(q/2)に簡略化され、基本的な正弦波となります。
  • n = 2dの場合、関数はr(q) = sin(q)となり、標準的な正弦波となります。

直交座標系をプロットする準備

曲線の直交座標形式を生成する前に、必要なグラフィカルツールを読み込む必要があります。これはGraphicsライブラリをインクルードすることで実現されます。このライブラリは、チャート上でグラフを描画し、視覚要素を管理するために必要なすべての機能を提供します。つまり、このライブラリはFlower Curveのx–y成分を描画するための基盤となります。

ライブラリを読み込んだ後、グラフィックオブジェクトの名前を定義します。この例では、描画領域はPetalPlotという名前で識別され、プログラムが描画時にグラフィカル領域を参照および制御できるようになります。

#include <Graphics/Graphic.mqh>

string g_name = "PetalPlot";

Flower Curveのデカルト成分をプロットするためのチャートを準備するために、専用の関数(SetupChartQX)が定義されています。この関数は、読みやすく整ったプロット環境を作成するための設定処理をまとめたものです。設定を一箇所に集約することで、新しい曲線を描画するたびにチャートの表示形式を統一できます。

この関数はまず白色の背景を設定し、グラフィカル要素を描画するための中立的なキャンバスを作ります。次に、以下のように両方の軸を設定します。

  • X軸:−2πから2πの範囲、ラベルはq
  • Y軸:−1.2から1.2の範囲、ラベルはx

void SetupChartQX(CGraphic &graphic)
{
   // Set background color
   graphic.BackgroundColor(clrWhite);
         
   // Configure X axis
   graphic.XAxis().Min(-2*M_PI);
   graphic.XAxis().Max(2*M_PI);
   graphic.XAxis().Name("q");
   
   // Configure Y axis
   graphic.YAxis().Min(-1.2);
   graphic.YAxis().Max(1.2);
   graphic.YAxis().Name("x");
   
   // Add grid
   graphic.XAxis().Color(clrGray);
   graphic.YAxis().Color(clrGray);
   
   // Increase font sizes
   graphic.XAxis().ValuesSize(14);
   graphic.YAxis().ValuesSize(14);
   graphic.XAxis().NameSize(16);
   graphic.YAxis().NameSize(16);
   
   // Add title
   graphic.CurvePlotAll();
   graphic.Update();
}

これらの範囲設定により、入力関数のすべての変動を切り捨てることなく表示することができます。

可読性を高めるために、軸の色を灰色に設定してグリッドラインを追加します。これにより、ユーザーは曲線が軸に対してどの位置にあるのかを視覚的に把握しやすくなります。さらに、軸の数値や軸名のフォントサイズを大きくして、表示の明瞭さを向上させています。

最後にCurvePlotAll()を呼び出し、その後Update()を実行して、曲線データを表示するためのチャートを準備します。 

PlotQX()関数は、バラ曲線のX成分に関するすべてのプロット処理を担当します。この関数は、データ点を生成し、必要な数学的変換を適用し、結果のグラフをチャート上に描画する中心的な処理エンジンとして機能します。

void PlotQX(CGraphic &graphic)
{
   int points = 1000;
   double q[], x[], r[];
   ArrayResize(q, points);
   ArrayResize(x, points);
   ArrayResize(r, points);   
   
   // Generate data points
   for(int i = 0; i < points; i++)
   {
      q[i] = -2*M_PI + (4*M_PI)*i/(points-1);
      r[i] = MathSin(n * q[i] / (2*d));
      x[i] = r[i] * MathCos(q[i]);
   }
  
   // Get the curve object and set line properties
   CCurve* curve = graphic.CurveAdd(q, x, CURVE_LINES, "q vs x");
   if(curve != NULL)
   {
      curve.LinesStyle(STYLE_SOLID);
      curve.LinesWidth(3);
      curve.Color(ColorToARGB(clrRed, 255));
   }   
   graphic.CurvePlotAll();
}

この関数の内部では、qとxの計算値を格納するための配列が作成されます。Flower Curveの数学的定義に基づき、関数は均等に間隔を取ったqの値を順に計算し、それに対応する半径項rを求め、その後X成分を導き出します。

Y成分のプロット:SetupChartQYおよびPlotQY関数

バラ曲線のX成分が専用の設定関数と描画関数で処理されるのと同様に、Y成分もSetupChartQYとPlotQYの2つの関数によって管理されます。これらの関数はX成分の構造と目的をそのまま踏襲しており、すべての可視化において一貫性と明確さを保っています。

SetupChartQY関数は、Y成分をプロットするためのチャート環境を準備します。背景色、軸の範囲、軸ラベル、グリッド表示、フォントサイズなどを設定し、Yデータを表示するための整理された視覚空間を作ります。

その後PlotQY関数が、Y成分の計算と描画処理をおこないます。 

計算されたqyの値は準備されたチャート上にプロットされ、線のスタイルなどが調整されて読みやすく明確な曲線として表示されます。描画が完了すると、グラフィックオブジェクトが更新され、新しく描かれた曲線がチャート上に表示されます。

バラ曲線のデカルト成分を可視化するために、X成分用とY成分用の別々のグラフィックオブジェクトが作成されます。それぞれに専用のプロットウィンドウが割り当てられるため、両方の成分を独立して明確に表示することができます。

   // Create first graphic object for q vs x
   CGraphic graphic_x;
   
   // Create graphic window for q vs x
   if(!graphic_x.Create(0, g_name + "_q_vs_x", 0, 30, 30, 800, 600))
   {
      Print("Error creating graphic for q vs x!");
      return;
   }

   // Create second graphic object for q vs y
   CGraphic graphic_y;
   
   // Create graphic window for q vs y
   if(!graphic_y.Create(0, g_name + "_q_vs_y", 0, 750, 30, 1500, 600))
   {
      Print("Error creating graphic for q vs y!");
      return;
   }

X成分の場合、graphic_xというグラフィックオブジェクトが生成されます。その後、指定された座標、幅、高さでチャート上にグラフィックウィンドウが作成され、qとxの関係を描画する専用領域として使用されます。ウィンドウの作成に失敗した場合は、エラーメッセージが表示され、安全に処理が終了します。

同様に、Y成分についても、graphic_yという2つ目のグラフィックオブジェクトが作成されます。このウィンドウはチャート上の別の位置に配置され、qとyのプロットを表示するための領域として設定されます。このように分離することで、両方の成分を横並びまたは上下配置で表示でき、視覚的な比較が容易になります。


インジケーター:Flower Volatility Indexの開発

バラ曲線の数学的基盤を確立したところで、理論から実際の応用へと移ります。次のステップは、このバラ曲線をボラティリティに敏感な市場オシレーターへと適応させることです。これを「Flower Volatility Index (FVI)」と呼びます。

これを実現するために、バラ曲線で使用される従来の角度変数θを、市場データから導出される変数qに置き換えます。この変換によって、バラ曲線の幾何学的特性が価格の動きと直接結び付けられるようになります。

角度は次のようにqとして再定義されます。 

q_input

この置き換えの重要な構成要素を詳しく見ていきましょう。

  • Close Price - MA: この項は、価格が直近の平均値からどれだけ乖離しているかを表します。MAには単純移動平均(SMA)または指数移動平均(EMA)を使用でき、期間の設定によって戦略の感度が決まります。これは資産のモメンタムやトレンド方向を測定するもので、 乖離が大きいほどqの値も大きくなります。
  • ATR: ATRで割ることで、この乖離を標準化された無次元量に変換します。この処理は非常に重要で、市場のボラティリティを考慮することでインジケーターが市場環境の変化に適応できるようになります。低ボラティリティ環境での大きな価格変動は、高ボラティリティ環境での同じ変動よりもより大きな影響を持つことになります。
  • スカラーk: これはトレーダーがqオシレーターの感度を調整するための係数です。kの値を大きくすると乖離が強調され、FVIはより敏感になります。

このqをバラ曲線に代入することで、インジケーターはトレンドの乖離とボラティリティ条件の両方に反応するようになり、より滑らかで解釈しやすいオシレーション信号を生成します。

完全なインジケーター式

市場由来のqをバラ曲線の定義に代入すると、Flower Volatility Indexの完全な式は次のようになります。

X成分FVI:

FVIx

Y成分FVI:

FVIy

これら両方のオシレーターは[-1, +1]の範囲内に収まるため、市場環境に関係なく正規化された安定したシグナルを生成します。しかし、パラメータnとdの組み合わせによっては重要な特徴が現れます。図4〜図8に示されているように、特定の設定ではX成分またはY成分が非対称になる場合があります。この場合、オシレーターは負の領域よりも正の領域(またはその逆)に長く滞在する傾向を持ちます。

この非対称性はバラ曲線の幾何学的特性から生じるもので、特にn/dが不完全な花弁や不均等な回転対称性を生む場合に顕著になります。これらのパラメータが市場変数qと組み合わさると、オシレーターはゼロラインの片側に偏る方向性バイアスを持つことがあります。

しかし、これは欠点ではありません。むしろ重要な機会を提供します。自然に偏りを持つオシレーターは、長期的なトレンドと一方向に継続する市場フェーズを識別するのに役立ちます。そのため、このインジケーターではX成分またはY成分を選択できるようになっており、トレーダーは戦略目的に応じてこの非対称性を意図的に利用できます。 

FVI指標のデモンストレーション

ここで、Flower Volatility Indexが実際にどのように動作するかを見ていきましょう。

FVIは入力パラメータに非常に敏感であり、MA期間、ATR期間、感度定数k、X成分またはY成分の選択といった値を変更すると、オシレーターの形状や反応性が直接変化します。この柔軟性により、トレーダーはインジケーターを特定の市場や銘柄のリズムに同期させることができます。

FVIの最大の強みは調整可能な複雑性にあります。バラ曲線のパラメータn、d、そしてスケーリング係数kを調整することで、トレーダーはまったく異なる特性を持つオシレーターを設計できます。

  • トレンドの識別: FVIが0より上で持続する場合は強気モメンタム、0より下の場合は弱気モメンタムと解釈できます。

  • シグナル生成: FVIがゼロラインを上抜け/下抜けするタイミング、または極値間の振動は、トレンドフォロー戦略の売買シグナルとして使用できます。

  • ボラティリティ適応型: ATRを組み込んでいるため、FVIは動的インジケーターになります。高ボラティリティ時には感度が低下して騙しシグナルを減らし、低ボラティリティ時には感度が上昇してトレンド初期でのエントリーが可能です。

FVI_Indicator

図9:FVIインジケーター

図9に示すように、これらの変化の中でもFVIは常にATRによってボラティリティ正規化されています。その結果、このオシレーターは市場環境の変化に自動適応します。静かな市場では拡張し、激しい市場では圧縮しながらも、資産クラスや時間足に関係なく一貫した解釈性を維持します。



エキスパートアドバイザー:FVIトレンドフォロー戦略

このエキスパートアドバイザー(EA)は、シグナル生成にFVI (Flower Volatility Index)を使用し、トレンドフィルターとしてオーサムオシレーター(AO)を利用します。取引は、ボラティリティ駆動のモメンタム(FVI)が現在のトレンド(AO)と一致する場合にのみ実行されます。

EAの意思決定プロセスは、次の具体的なルールによって管理されます。

1. 売り条件 

売りエントリーは次の場合におこなわれます。

  • AO < 0(下降トレンド)
  • FVIが+0.7を上抜けしたとき(弱気トレンド内での強い上昇の行き過ぎ)

2. 買い条件

買いエントリーは次の場合におこなわれます。

  • AO > 0(上昇トレンド)
  • FVIが−0.7を下抜けしたとき(強気トレンド内での強い下降の行き過ぎ)
3. エグジット条件
  • ポジションは、設定されたテイクプロフィット(TP)およびストップロス(SL)レベルで決済されます。

4. 複数エントリールール:
  • 同方向ポジションは1つのみ: EAは同一方向のポジションを1つしか取りません。たとえば、買いポジションがすでに存在する場合、新たな買いポジションは取りません。ただし、条件が整えば売りポジションは取り、トレンドの反転を捕捉できます。
  • エントリークールダウン期間: 過剰な取引や「エコー」シグナルを防ぐため、EAはエントリー後に指定されたバー数(例:10バー)待機してから、いずれかの方向のエントリーシグナルをチェックして、それに基づいて作動します。これにより取引頻度が管理され、シグナルが十分に形成される時間が確保されます。

FVI EAのコード構造の理解

FVI EAの中核となるのはCalculateFVI()関数です。この関数は取引ロジックで使用されるFVI値を計算する役割を担っています。この関数では、主要な入力パラメータであるMA、ATR、およびカーブパラメータndkを処理し、インジケーターの出力値を生成します。

void CalculateFVI()
{
    prevFVI = curFVI;

    // Get indicator values
    double ma[1], atr[1], ao[1];
    double close = iClose(_Symbol, _Period, 1);
    
    // Copy indicator values
    if(CopyBuffer(maHandle, 0, 1, 1, ma) < 1 || 
       CopyBuffer(atrHandle, 0, 1, 1, atr) < 1)
    {
        Print("Error copying indicator buffers");
        return;
    }

    // Calculate q
    double q = k * (close - ma[0]) / (atr[0] > 0 ? atr[0] : 1);

    // Calculate r(q)
    double r = MathSin(n * q / (2 * d));

    // Calculate FVI based on selected component
    if(Use_X_Component)
        curFVI = r * MathCos(q); // X component
    else
        curFVI = r * MathSin(q); // Y component
}

計算処理は、前回のFVI値を保存することから開始されます。これにより、EAは取引条件を評価する際に、過去の値と現在の値を比較できるようになります。その後、最新の終値を取得し、それぞれのインジケーターバッファからMAおよびATRの値をコピーします。さらに、インジケーターデータにアクセスできない場合でもEAが安全に処理を終了できるよう、適切なエラーハンドリングが実装されています。

CheckForEntry()関数は、FVI EAにおける意思決定エンジンとして機能します。この関数の主な役割は、すべてのエントリー条件が満たされていることを確認してから取引を実行することであり、これにより取引の規律を維持し、早すぎる、または無効な注文の発行を防止します。

この関数はまず、前回の取引から十分な数のバーが経過しているかを確認します。この間隔管理の仕組みにより、特に市場のボラティリティが高い状況において、短時間での連続エントリーを回避できます。最小バー数の条件が満たされると、次にFVIに基づく事前定義されたエントリールールを評価します。具体的には、現在および直前のFVI値が、強気または弱気のセットアップ条件を満たしているかを判定します。

void CheckForEntry()
{
    // Check minimum bars between entries
    if(barsSinceLastTrade < MinBarsBtwEntries)
        return;

    // Get Awesome Oscillator value
    double ao[1];
    if(CopyBuffer(aoHandle, 0, 1, 1, ao) < 1)
    {
        Print("Error copying AO buffer");
        return;
    }

    // Check for buy conditions
    if(ao[0] > 0 && prevFVI > -0.7 && curFVI < -0.7)
    {
        if(CountPositions(POSITION_TYPE_BUY) == 0)
        {
            OpenBuyOrder();
            barsSinceLastTrade = 0;
        }
    }

    // Check for sell conditions
    if(ao[0] < 0 && prevFVI < 0.7 && curFVI > 0.7)
    {
        if(CountPositions(POSITION_TYPE_SELL) == 0)
        {
            OpenSellOrder();
            barsSinceLastTrade = 0;
        }
    }
}

有効な買いシグナルが検出された場合、EAはOpenBuyOrder()関数を呼び出し、ブローカーのターミナルに対して買い注文を送信します。同様に、売りシグナルが確認された場合にはOpenSellOrder()関数が実行され、売りエントリーがおこなわれます。

取引が正常に実行されると、カウンタbarsSinceLastTradeは0にリセットされます。これにより、次の取引を開始する前にも、EAが再び必要なバー間隔の条件を満たすまで待機する仕組みが維持されます。

このような構造により、CheckForEntry()関数は取引実行を管理するための信頼性が高く効率的なフレームワークを提供します。これにより、エントリーは明確に定義された条件および管理された環境下でのみおこなわれるようになります。

FVI EAデモンストレーション

このEAには、取引設定およびFVIパラメータの両方を含む包括的な入力パラメータ群が用意されており、トレーダーはパフォーマンスを細かく調整することができます。これらの入力項目はすべて最適化に対応しており、ユーザーはリスク設定、感度パラメータ、FVI計算に関する値などの変数を調整できます。図10に示されているように、最適化インターフェースは、さまざまなパラメータの組み合わせを試すための体系的な環境を提供します。これにより、トレーダーは異なる市場環境において最も効果的な設定を特定することができます。

EA入力

図10:EA入力値

図11は、定義された取引ロジックに基づいてEAがどのように取引を実行するかを示しています。市場条件が指定されたエントリールールと一致すると、EAは自動的に買いまたは売りポジションをトリガーし、設定されたリスクパラメータおよびFVIシグナルに従って各取引を管理します。この視覚的な例は、シグナル生成から注文発行までの処理の流れを示しており、EAが市場の動きに対して体系的かつ自動的に反応する能力を明確に示しています。

FVI_EA_demo

図11:FVI EAデモンストレーション


結論

本記事では、Flower Volatility Index (FVI)を紹介しました。これは、バラ曲線の数学的優雅さを実用的な取引ツールに変換した新しいアプローチです。Flower CurveのX成分およびY成分を通じて市場のボラティリティと価格変位をマッピングすることで、FVIを用いて方向性バイアス、トレンドの強さ、そして潜在的な転換点を検出できることを示しました。

また、本記事ではFVI EAの完全な構造についても解説しました。これには、カーブ描画、グラフィカル描画、シグナル生成、自動売買実行までの一連の処理が含まれます。この研究を通じて、数学モデルを実際の市場環境で分析や意思決定を支援できる実用的な取引メカニズムに適応できることを示しました。

総じて、この研究は、幾何学および三角関数を用いたアプローチが市場行動を理解するための代替的フレームワークとなり得る可能性を示しています。

次回の研究では、この戦略を単独でテストするだけでなく、他のインジケーターと組み合わせて検証し、さまざまな金融商品において最適な組み合わせを探る予定です。それまで、楽しい取引を。


ファイル 詳細
PetalCurve.mq5 バラ曲線を描画するスクリプトファイル。テンプレートを更新または置き換えると、チャートから削除されます。
PetalWaves.mq5 曲線のX成分およびY成分を波形として表示するスクリプトファイル。テンプレートを更新すると描画されたチャートを削除できます。 
FlowerVolatilityIndex.mq5 Flower Volatility Indexを別のウィンドウにプロットするインジケーターのファイル
FVI_EA.mq5 取引を自動実行するEA本体のファイル

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/20309

添付されたファイル |
PetalCurve.mq5 (6.6 KB)
PetalWaves.mq5 (10.46 KB)
FVI_EA.mq5 (8.09 KB)
EAのサンプル EAのサンプル
一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。
機械学習の限界を克服する(第7回):自動戦略選択 機械学習の限界を克服する(第7回):自動戦略選択
本記事では、MetaTrader 5を用いて潜在的に収益性の高い取引戦略を自動的に特定する方法を紹介します。ホワイトボックスソリューションは、教師なし学習による行列分解によって動作し、設定が容易で解釈もしやすく、どの戦略を保持すべきか明確な指針を提供します。一方、ブラックボックスソリューションはより時間がかかりますが、ホワイトボックスアプローチでは捉えきれない複雑な市場環境に適しています。本記事では、あらゆる状況下で収益性の高い戦略を慎重に見極めるために、どのように取引戦略を活用できるかを解説します。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
MQL5でのAI搭載取引システムの構築(第6回):チャットの削除と検索機能の導入 MQL5でのAI搭載取引システムの構築(第6回):チャットの削除と検索機能の導入
連載第6回では、ChatGPT統合型エキスパートアドバイザー(EA)をさらに進化させ、サイドバーのインタラクティブな削除ボタン、大・小の履歴ポップアップ、新しい検索ポップアップを導入することで、トレーダーが永続的な会話履歴を効率的に管理および整理できるようにしました。これにより、チャートデータからのAI駆動のシグナルを維持しつつ、暗号化されたストレージに会話を安全に保存できます。