int iBarShift(string symbol,int timeframe,datetime time,bool exact=false) { if(time<0) return(-1); ENUM_TIMEFRAMES tf=TFMigrate(timeframe); datetime Arr[],time1; CopyTime(symbol,tf,0,1,Arr); time1=Arr[0]; if(CopyTime(symbol,tf,time,time1,Arr)>0) { if(ArraySize(Arr)>2) return(ArraySize(Arr)-1); if(time<time1) return(1); else return(0); } .else return(-1); } ENUM_TIMEFRAMES TFMigrate(int tf) { switch(tf) { case 0: return(PERIOD_CURRENT); case 1: return(PERIOD_M1); case 5: return(PERIOD_M5); case 15: return(PERIOD_M15); case 30: return(PERIOD_M30); case 60:return(PERIOD_H1); case 240: return(PERIOD_H4); case 1440: return(PERIOD_D1); case 10080: return(PERIOD_W1); case 43200: return(PERIOD_MN1);
case 2: return(PERIOD_M2); case 3: return(PERIOD_M3); case 4: return(PERIOD_M4); case 6:return(PERIOD_M6); case 10: return(PERIOD_M10); case 12: return(PERIOD_M12); case 16385: return(PERIOD_H1); case 16386: return(PERIOD_H2); case 16387: return(PERIOD_H3); case 16388: return(PERIOD_H4); case 16390:return(PERIOD_H6); case 16392: return(PERIOD_H8); case 16396: return(PERIOD_H12); case 16408: return(PERIOD_D1); case 32769: return(PERIOD_W1); case 49153: return(PERIOD_MN1); default: return(PERIOD_CURRENT); } }.
やあ、面白いインジケーターだね。実際にチャート上で予測 モデルを使うという数学的な側面が気に入っている。僕はまだコードの経験が浅いので、モデルを "遡る "ように設定して、あるティック数(たとえば100)前に予測カーブを描くようにするのはどうだろうと思っているんだ。そうすれば、様々なチャートに適用して、現実がモデルからどれだけ変化するかを知ることができるし、モデルがうまく機能する市場の特徴を特定するのに使えるかもしれない。
Windows 7を使っています。
ポータブルモードでmt5を実行することをお勧めします:
terminal.exe /portable
を実行すると、現在のmt5ディレクトリで作業しているインジケータが表示されます。
予測能力をテストするために、バックシフトさせるための修正:
32 行目 挿入:
入力 int TimeShift = 10; // インジケータの予測能力を評価するために、何本分バックシフトさせるか。
54行目 replace:
PlotIndexSetInteger(0, PLOT_SHIFT, Nfut);
with:
PlotIndexSetInteger(0, PLOT_SHIFT, Nfut - TimeShift);
55行目に挿入:
PlotIndexSetInteger(1, PLOT_SHIFT, -TimeShift);
87行目で置換:
if(CopyRates(NULL, 0, 0, Npast, rates) <= 0) return(0);
with:
if(CopyRates(NULL, 0, TimeShift, Npast, rates) <= 0) return(0);
一見の価値あり。
誰が取引で使うのでしょうか?
このインジケータはトレンドを全く考慮しておらず、トレンドに反して数千の5桁のポイントを予測することが判明しました。
このインジケータは高いタイムフレームで使用するのがベストだと思います。D1では1ヶ月間、驚くほどの精度で予測しましたが、トレンドが始まったとき、私は非常に失望しました(最後の段落を参照)。
ありがとう
一見の価値あり。
トレードでは誰が使っていますか?
私はまた、誰かが彼らのTSで外挿を使用している場合、具体的にどのように、非常に興味がありますか?そして、聖杯を検索するこの方向はどのように有望ですか?
純粋に直感的には、これが必要とされているものであると思われるが、何とかこの外挿のテストと予測では、少なくとも私のために、それはそう判明し、現実と非常に悪い相関...
どの外挿器を選べばいいのか、どれが一番正確なのか教えてください。おそらくフーリエ級数だけでなく、方法は無限にあります。例えば、最も単純な方法から、MAやMACDのクロスから始めて、カーブを予測することもできますし、怠け者でなければ、異なる経験的分解、平均化、そしてまたコッポニング......。理論的には想像がつきますが、コード化しようとすると1年では無理です(((
エクストポレーターが線を引く代わりに、近い将来の確率分布を設定してくれたらクールなんだけど。
エクストラポレーターが線を引く代わりに、近い将来の確率分布を設定したらクールだと思う。
フォトショップで練習すれば、そんな風にできると思うんだけど))))
興味深いインジケーター!作成者に感謝します。
このインジケータの予測の質を確認するために、コードにもう1つパラメータStartを追加しました。
また、マウスの動きのイベント・ハンドラも追加しました。
開始するには、Ctrlキーを押しながらマウスを動かすだけでよい(十字線を有効にすることをお勧めする)。
チャート上の位置がStartになります。
スイッチを切るには、Ctrl以外のキーを押してください。
//+--------------------------------------------------------------------------+
//| Fourier_Extrapolator_of_Price.mq5 |
//| Copyright 2010, gpwr |
//+--------------------------------------------------------------------------+
// Start をシフトできるようにした ( CTRL を押す)
#property copyright "gpwr"
#property version "1.00"
#property description "三角法(マルチトーン)モデルによる始値の外挿"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//---.将来のモデル出力
#property indicator_label1 "Modeled future"
#property indicator_type1 DRAW_LINE
#property indicator_color1 赤
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//-.-- 過去のモデル出力
#property indicator_label2 "Modeled past"
#property indicator_type2 DRAW_LINE
#property indicator_color2 青
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- グローバル定数
#define pi 3.141592653589793238462643383279502884197169399375105820974944592
//--- インジケータの入力
input int Npast =300; // 三角関数の系列をフィッティングする過去のバー
input int Nfut =50; // 将来の予測バー
input int Nharm =20; // モデルのナルモニクス
input double FreqTOL =0.00001; // 周波数計算の許容誤差
input int Start =0; // どのバーから始めるか
//--- グローバル変数
int N;
int key=0;
int start=0;
//--- インジケータ・バッファ
double ym[],xm[];
//+------------------------------------------------------------------------+
//|カスタム・インジケータ初期化関数 |
//+--------------------------------------------------------+
void OnInit()
{
//--- グローバル変数の初期化
N=MathMax(Npast,Nfut+1);
//--- インジケータバッファのマッピング
ArraySetAsSeries(xm,true);
ArraySetAsSeries(ym,true);
SetIndexBuffer(0,ym,INDICATOR_DATA);
SetIndexBuffer(1,xm,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
IndicatorSetString(INDICATOR_SHORTNAME, "Fourier("+string(Npast)+")");
PlotIndexSetInteger(0,PLOT_SHIFT,Nfut);
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
start=Start;
}
//+------------------------------------------------------------------------+
//|カスタム・インジケータ反復関数 |
//+--------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime&.Time[],
const double& Open[],
const double& High[],
const double& Low[],
const double& Close[],
const long&tick_volume[],
const long& volume[],
const int& spread[])
{
{ // データ不足のチェック
if(rates_total<Npast)
{
Print("Error:not enough bars in history!");
return(0);
}
//--- インジケータバッファをEMPTY_VALUEに初期化
ArrayInitialize(xm,EMPTY_VALUE);
ArrayInitialize(ym,EMPTY_VALUE);
//--- 全ての価格を利用可能にする
MqlRates rates[];
ArraySetAsSeries(rates,true);
if(CopyRates(NULL,0,start,Npast,rates)<=0) return(0);
//--- メインサイクル
//--- 入力データの準備
double x[];
ArrayResize(x,Npast);
double av=0;
for(int i=0;i<Npast;i++)
{
x[i]=rates[i].open;
av+=x[i];
}
.av/=Npast;
//--- モデル出力の初期化
for(int i=0;i<N<N;i++)
{
{ xm[i+start]=av;
if(i<=Nfut) ym[i+start]=av;
}
//--- 三角関数モデルのフィットと予測値の計算
for(int harm=1;harm<=Nharm;harm++)=Nharm;harm++)
{
double w,m,a,b;
Freq(x,Npast,w,m,a,b);
for(int i=0;i<N;i++)
{
xm[i+start]+=m+a*MathCos(w*i)+b*MathSin(w*i);
if(i<=Nfut) ym[Nfut-i+start]+=m+a*MathCos(w*i)-b*MathSin(w*i);
}.
}
return(rates_total);
}
//--- Ctrl 押しとマウス移動のイベントハンドラ
void OnChartEvent(const int id, // イベント識別子
const long& lparam, // long 型のイベントパラメータ
const double& dparam, // double 型のイベントパラメータ
const string& sparam // string 型のイベントパラメータ
)
.{
double y;
int window=0;
datetime ttt;
if(id==CHARTEVENT_KEYDOWN) key=(int)lparam;
if(id==CHARTEVENT_MOUSE_MOVE && key==17)
{
ChartXYToTimePrice(0,(int)lparam,(int)dparam,window,ttt,y);
if(ttt!=0) start=iBarShift(NULL,0,ttt,false);
Comment("x = ",lparam,", y = ",dparam,", Price = ",y,", start = ",start);
ArrayInitialize(xm,EMPTY_VALUE);
ArrayInitialize(ym,EMPTY_VALUE);
//--- 全ての価格を利用可能にする
MqlRates rates[];
ArraySetAsSeries(rates,true);
if(CopyRates(NULL,0,start,Npast,rates)<=0) return;
//--- メインサイクル
//--- 入力データの準備
double x[];
ArrayResize(x,Npast);
double av=0;
for(int i=0;i<Npast;i++)
{
x[i]=rates[i].open;
av+=x[i];
}
.av/=Npast;
//--- モデル出力を初期化する
for(int i=0;i<N;i++)
{
xm[i+start]=av;
if(i<=Nfut) ym[i+start]=av;
}
//--- 三角関数のモデルを当てはめ、予測値を計算する
for(int harm=1;harm<=Nharm;harm++)
{
double w,m,a,b;
Freq(x,Npast,w,m,a,b);
for(int i=0;i<N;i++)
{
xm[i+start]+=m+a*MathCos(w*i)+b*MathSin(w*i);
if(i<=Nfut) ym[Nfut-i+start]+=m+a*MathCos(w*i)-b*MathSin(w*i);
}.
}
}
//+------------------------------------------------------------------+
//| Quinn and Fernandes algorithm for finding frequency |
//+------------------------------------------------------------------+
void Freq(double& x[],int n,double& w,double& m,double& a,double& b)
{
double z[];
ArrayResize(z,n);
double alpha=0.0;
double beta=2.0;
z[0]=x[0]-xm[0+start];
while(MathAbs(alpha-beta)>FreqTOL)
{
alpha=beta;
z[1]=x[1]-xm[1+start]+alpha*z[0];
double num=z[0]*z[1];
double den=z[0]*z[0];
for(int i=2;i<n;i++)
{
z[i]=x[i]-xm[i+start]+alpha*z[i-1]-z[i-2];
num+=z[i-1]*(z[i]+z[i-2]);
den+=z[i-1]*z[i-1];
}
.beta=num/den;
}
w=MathArccos(beta/2.0);
TrigFit(x,n,w,m,a,b);
}
//+------------------------------------------------------------------------+
//| 三角級数の最小二乗フィッティング |
//+--------------------------------------------------------+
void TrigFit(double& x[],int n,double w,double& m,double& a,double& b)
{
double Sc =0.0;
double Ss=0.0;
double Scc=0.0;
double Sss=0.0;
double Scs=0.0;
double Sx=0.0;
double Sxc=0.0;
double Sxs=0.0;
for(int i=0;i<n;i++)
{
double c=MathCos(w*i);
double s=MathSin(w*i);
double dx=x[i]-xm[i+start];
Sc +=c;
Ss +=s;
Scc+=c*c;
Sss+=s*s;
Scs+=c*s;
Sx +=dx;
Sxc+=dx*c;
Sxs+=dx*s;
}
.Sc /=n;
Ss /=n;
Scc/=n;
Sss/=n;
Scs/=n;
Sx /=n;
Sxc/=n;
Sxs/=n;
if(w==0.0)
{
m=Sx;
a=0.0;
b=0.0;
}
.else
{
// a、b、mの計算
double den=MathPow(Scs-Sc*Ss,2)-(Scc-Sc*Sc)*(Sss-Ss*Ss);
a=((Sxs-Sx*Ss)*(Scs-Sc*Ss)-(Sxc-Sx*Sc)*(Sss-Ss*Ss))/den;
b=((Sxc-Sx*Sc)*(Scs-Sc*Sc*Ss)-(Sxs-Sx*Ss)*(Scc-Sc*Sc*Sc))/den;
m=Sx-a*Sc-b*Ss;
}
}
int iBarShift(string symbol,int timeframe,datetime time,bool exact=false)
{
if(time<0) return(-1);
ENUM_TIMEFRAMES tf=TFMigrate(timeframe);
datetime Arr[],time1;
CopyTime(symbol,tf,0,1,Arr);
time1=Arr[0];
if(CopyTime(symbol,tf,time,time1,Arr)>0)
{
if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
if(time<time1) return(1);
else return(0);
}
.else return(-1);
}
ENUM_TIMEFRAMES TFMigrate(int tf)
{
switch(tf)
{
case 0: return(PERIOD_CURRENT);
case 1: return(PERIOD_M1);
case 5: return(PERIOD_M5);
case 15: return(PERIOD_M15);
case 30: return(PERIOD_M30);
case 60:return(PERIOD_H1);
case 240: return(PERIOD_H4);
case 1440: return(PERIOD_D1);
case 10080: return(PERIOD_W1);
case 43200: return(PERIOD_MN1);
case 2: return(PERIOD_M2);
case 3: return(PERIOD_M3);
case 4: return(PERIOD_M4);
case 6:return(PERIOD_M6);
case 10: return(PERIOD_M10);
case 12: return(PERIOD_M12);
case 16385: return(PERIOD_H1);
case 16386: return(PERIOD_H2);
case 16387: return(PERIOD_H3);
case 16388: return(PERIOD_H4);
case 16390:return(PERIOD_H6);
case 16392: return(PERIOD_H8);
case 16396: return(PERIOD_H12);
case 16408: return(PERIOD_D1);
case 32769: return(PERIOD_W1);
case 49153: return(PERIOD_MN1);
default: return(PERIOD_CURRENT);
}
}.
...