
任意の期間の五分足のFXチャートの離散データを連続データ曲線にして表示させるMQL4プログラムを書いて。

【FXチャートのデータ変換】
以下は、MQL4を用いて、任意の期間の5分足(M5)チャート上の離散的な価格データ(例えばClose価格)をもとに、連続的なカーブを表示するカスタムインジケータの一例です。
ここでは、基本的な考え方として、5分足の終値データを取得し、それらをスプライン補間や単純な線形補間でなめらかな曲線に近似したラインを描画します。
以下のコードは一例であり、実行環境や必要に応じて適宜修正ください。
ポイント:
カスタムインジケータとして作成。
期間はチャート上で選択した期間に関係なく、内部でM5のデータを取得して使用。
シンプルな方法として、5分足の終値データから1分ごとの補間を行い、補間結果をバッファに格納し、ライン表示。
より高度な平滑化(スプライン補間)を実装したい場合は、別途補間用関数を定義。ここでは簡易的な線形補間例を示す。
コード例(IndicatorName.mq4)
#property copyright "YourCompany"
#property link "http://www.example.com"
#property indicator_separate_window false // メインチャートに表示
#property indicator_buffers 1
#property indicator_color1 Blue
#property indicator_width1 2
#property indicator_style1 STYLE_SOLID
// ---- 入力パラメータ ----
// どれくらい細かく補間するか(1バー=5分なので、その中間点を何点挿入するか)
// 例えば5とすれば、5分間を5等分して1分刻みに近似的なポイントを生成
extern int InterpolationPoints=5;
// ---- バッファ ----
double SmoothBuffer[];
//------------------------------------------
// カスタムインジケータ初期化
int init()
{
IndicatorBuffers(1);
SetIndexStyle(0, DRAW_LINE);
SetIndexBuffer(0, SmoothBuffer);
// インジケータ名設定
IndicatorShortName("Continuous Curve from M5 data");
return(0);
}
//------------------------------------------
// スタート時処理(旧OnCalculate的な役割 MQL4)
int start()
{
int counted_bars = IndicatorCounted();
if(counted_bars < 0) return(-1);
// 最新バー更新用に全バー再計算を回避するため、必要なら最初から計算
// 今回はシンプルに全部計算
int total_bars = Bars;
// M5データ取得用
// 現在のチャートシンボル・M5から取得
string sym = Symbol();
int timeFrame = PERIOD_M5;
// 必要な過去バー数 (現在表示中のチャートバー数より少なくてもOK)
// 補間を行うので余裕を持った数
int limit = MathMin(1000, total_bars);
// 一旦すべてのバッファをクリア
for(int i=0; i<limit*InterpolationPoints; i++)
SmoothBuffer[i] = EMPTY_VALUE;
// M5バーのクローズ価格を配列に取得
double closeArray[];
if(!SeriesInfoInteger(sym, timeFrame, SERIES_BARS_COUNT, limit)) limit = Bars; // 念のため
ArraySetAsSeries(SmoothBuffer,true);
ArraySetAsSeries(closeArray, true);
// iCloseで取得する場合
ArrayResize(closeArray, limit);
for(int i=0; i<limit; i++)
{
closeArray[i] = iClose(sym, timeFrame, i);
}
// 補間:
// 5分足間をInterpolationPoints分割する場合、たとえばInterpo=5なら
// 1つのM5バーから次のM5バーへの間に、4つの中間点を線形で補間
// バッファには( limit-1 )*InterpolationPoints + 1 個の点が並ぶイメージ
int outIndex=0;
for(int i=limit-1; i>0; i--)
{
double startVal = closeArray[i];
double endVal = closeArray[i-1];
// 1区間(5分)をInterpolationPoints分割
for(int j=0; j<InterpolationPoints; j++)
{
double t = (double)j/(double)InterpolationPoints;
double val = startVal*(1.0-t) + endVal*t; // 線形補間
SmoothBuffer[outIndex] = val;
outIndex++;
}
}
// 最後の終点
SmoothBuffer[outIndex] = closeArray[0];
return(0);
}
//------------------------------------------
int deinit()
{
return(0);
}
説明
概要:
このインジケータは現在のチャート上で表示されますが、データは常にM5足の価格データ(終値)を取得します。そのため、チャートが1時間足だろうが日足だろうが、内部的にはM5の価格データを用いて補間した連続線を描画します。
補間方法:
上記サンプルでは簡易な線形補間を実装しています。例えば、5分足同士の間を指定のInterpolationPoints個に分割し、直線的になめらかな値を生成します。より平滑なカーブを得たい場合は、スプライン補間など高度な数値補間手法を独自実装する必要があります。
表示方法:
DRAW_LINEスタイルでSmoothBuffer内の値をチャート上にラインとして描画します。
InterpolationPointsを増やせば増やすほど、より密なデータ点を生成し、実質的に滑らかなカーブが表示されます。
パフォーマンス等:
例示のコードは特に最適化にはこだわっていません。必要に応じてlimitを調整する、計算部分を軽量化する等の工夫が必要です。また、描画バッファサイズやインジケータ呼び出し頻度についても調整可能です。
上記のサンプルコードをベースとして、より高度な補間、平滑化処理などを加えることで、任意の期間のM5データから連続的なカーブを描画することが可能になります。
FXのチャートは離散データである。任意の期間の離散データを補完して連続データ曲線のチャートをデッチ上げ、フーリエ変換して有限個の三角関数の成分として分解したいのだ。
まずは飛び飛びで歯抜けになっている離散データを連続データとしてデッチ上げるプログラムをChatGPTに書かせてみた。
動くかどうかは知らんけど。