フーリエ変換で未来を予測する - ページ 5

 

1週間あまりのインターバルの中で目立った周波数を紹介します(日数で表示)。

4.58.

2.58.

1.63(最強、真ん中のグラフで示す)

1.04

0.52.

0.26.


1.63日(週の第3高調波)の周期は何が原因なのか、何かご意見はありますか?

 

第1回目の予報はこちら


まだ、やるべきことはたくさんある

ANG3110、明日の予報は?

 
m_keeper:

第1回目の予報はこちら


まだ、やるべきことはたくさんある

ANG3110、明日の予報は?

実は具体的に予想はしていないんです。目分量で図面を渡すだけでいいんです。

そして、グラフには何が写っているのか、もう少し詳しく説明してください。


 
どなたか、mq4への高速でないフーリエ変換をお持ちではないでしょうか?CやPascalでの実装も可能です。
 
vaa20003:
どなたか、mq4への高速でないフーリエ変換をお持ちではないでしょうか?CやPascalでの実装も可能です。

2ページ目には

 
m_keeper:
vaa20003 です。
どなたか、mq4への高速でないフーリエ変換をお持ちではないでしょうか?CやPascalでの実装も可能です。

2ページ目をご覧ください。

ありがとう、見逃した...。

 

これまでの実績は以下の通りです。

主な市場周波数を検索し、その振幅と位相を決定し、trndを定義し、全体を加算して正規化します。

ペリオドグラムで局所最大値を検索する方法は好きではありません、検索は調和分布に基づいて行われます

で、その兆候はない。もちろん、パラメータを弄ることで切り分けることはできるが、それでも不安定で、しばしば非常にマイクロローカルな状態になることがある

の最大値です。

第二の欠点は、すべてが一つのウィンドウに表示され、メインウィンドウのいくつかのチャートにこのすべての楽しみを広げる必要があることです。

と2-3個の窓を追加しました。


すべての計算を一箇所で行い、他のすべての人(指標、専門家)がその結果にアクセスできるようにする方法を知っている人はいますか?

市場変動の適切な頻度の選択は、やはり手動で行うべきでしょう。マウスやANG3110の ようなラインで最大値を選択できると非常に便利です


ANG3110、LINEとの連携はどのように実施したのでしょうか?スクリプトで?



今投稿したものをどうするか、二言三言。

Lenght=560;//ウィンドウサイズをバーで設定する
Period_count=2;//何周期を考慮するか、それに応じて、長さは市場で見られるものよりperiod_count倍多くなければなりません。
Garmonic=9;// このパラメータと次のパラメータは、恐ろしく複雑なフィッティングの方法によって決定されます(詳しくは書きますが)
GarmonicControl=1.7。

iMAperiod=4;//フィットがうまくいかなかった場合、グラフを少し平滑化させてみる

Futur=100;//何本のバーで予測を行うか
InPast=200;// 過去のバーに対する操作、予測の推定のため、既に存在するデータを基にする。

実際、インジケーターを見るとどうなんでしょう(ちなみに今日の予報は)

すべてのグラフは、0からLenghtまでの範囲にあること(よく±5%)。

範囲が違うのは不具合です。 Refreshを押せば正常に動作します(この辺はよく分かりませんが)

薄いピンクのチャート - 用意した時系列で、コースと同じようなものにする。

太いオレンジ色 - ピリオドグラム、ピリオド値は青い線の対応する値と同じです。

青線に食い込む赤線の位置と量は、Garmonic および GarmonicControl

ペリオドグラムを支える緑のバー - 検出された周期は赤い線に強く依存します。 最も重要な周期を識別したら、結果が得られるまでGarmonic*を調整し始める必要があります。

緑の細い曲線がファゾグラムで、周波数が安定していればファゾグラムは滑らかだが、変動している場合はその周波数の発振が最近乱れたと思われ、信用できない。(0は-pi/2に対応、長さは3*pi/2に対応)。


そして、実は一番重要なのはピンクの太い線、これは予報です。予報は標高による最初のグラフと一致する必要はなく、前のグラフを繰り返す。最も重要なのは、ピボットポイントとその可能な強度です(予測されるピボットタイムは必ず異なります)。


ファイル:
 
m_keeper:

適切な市場変動頻度の選択は、結局のところ手作業で行わなければならない。マウスで最大値を選択したり、ANG3110の ように線で選択することができれば非常に便利です。


ANG3110、LINEとの連携はどのように実施したのでしょうか?スクリプトで?

あなたの場合、最も適しているのは次のオプションだと思います。

インジケータを制御するためのスクリプトを作るのです。


//==============================================================
#import "user32.dll"
int      PostMessageA(int hWnd,int Msg,int wParam,int lParam);
#import
#define WM_COMMAND   0x0111
//==============================================================
int i0,ip,T;
int t0,tp,t0n,tpn;
string Symb;
int Per;
//**************************************************************
int init() 
{ 
   Symb=Symbol();
   Per=Period();
   
   t0=WindowTimeOnDropped();
   T=64; 

   i0=iBarShift(Symbol(),Period(),t0);
   ip=i0+T;
   tp=Time[ip];
   t0n=t0;
   tpn=tp;
   
   ObjectCreate("RCh",4,0,tp,0,t0,0);
   ObjectSet("RCh",OBJPROP_COLOR,DodgerBlue); 
}
//**************************************************************
int start() 
{
   int hwnd=WindowHandle(Symb,Per);        
   if (hwnd!=0) 
   {
      PostMessageA(hwnd,WM_COMMAND,33324,0); 
      GlobalVariableSet("gi0",i0);
      GlobalVariableSet("gip",ip);
   } else return(0);
   //---- 
   while(IsStopped()==false) 
   {
      t0=ObjectGet("RCh",OBJPROP_TIME2); 
      if (t0>Time[0]) t0=Time[0]; 
      tp=ObjectGet("RCh",OBJPROP_TIME1); 
      i0=iBarShift(NULL,Per,t0);
      ip=iBarShift(NULL,Per,tp);
      
      T=ip-i0;
      if (T<2) {T=2; ip=i0+T; tp=Time[ip];}
      
      if (t0n!=t0 || tpn!=tp) 
      {
         GlobalVariableSet("gi0",i0);
         GlobalVariableSet("gip",ip);
         PostMessageA(hwnd,WM_COMMAND,33324,0);
         t0n=t0;
         tpn=tp;
      } 
      
      Sleep(200);
   }
   //=============================================
   return(0);
}
//**************************************************************
void deinit() 
{
   ObjectDelete("RCh"); 
   GlobalVariableDel("gi0");
   GlobalVariableDel("gip");
}
//**************************************************************

インジケーターのint start()の後に挿入するのです。

   if (GlobalVariableCheck("gi0")) 
   {
      i0=GlobalVariableGet("gi0"); 
      ip=GlobalVariableGet("gip");
      T=ip-i0;
      SetIndexShift(2,T/2);
      SetIndexShift(3,T/2);
   }
   else 
   {
      i0=0; T=T0; SetIndexShift(2,T/2); SetIndexShift(3,T/2);
   }


まずインジケータをチャートに置き、スクリプトを捨ててLRチャンネルでチャートを動かす。

自分でできるようになるか、ヒントを与えることができればいいのですが。

 

ありがとうございます、セリフが整理されました。


もう1つお聞きしてもいいですか?

現在、メインウィンドウに1つ、マイウィンドウに2つ、計3つのチャートに情報が表示されています。

パラメータはどちらか一方にのみ設定され、グローバル変数に格納される

パラメータはどちらか一方にのみ設定され、"PF_"+Symbol()+"_"+DoubleToStr(Period(),0)+"_key "のグローバル変数に格納されます。

また、最大値に関する情報をグローバル変数に格納しています。

問題は、1つのチャートに対して3回計算を実行しなければならないことです。

当初はiCustomを試してみましたが、私の意見としては、iCustomでは

先に追加されたチャートのデータを再度計算し、少なくとも init

で、すでに(グローバル変数によって)開始されていることを確認します。

で計算を行わず、iCustomはEmptyを返す。

アレイをグローバルにする方法はないのでしょうか?

GlobalVariableに何千もの値を詰め込むと、動作がかなり遅くなるような気がするのですが、どうでしょうか?

文字列の検索を行うので、動作がかなり遅くなります。

 
m_keeper:

配列をグローバル化する方法はありますか?

何が必要なのかよくわからないのですが、大量のデータを保存しておいて、それをまた読み込む必要があるときは、中間ファイルへの書き込みなどを利用すると簡単です。

int handle=FileOpen("Test.dat",FILE_BIN|FILE_WRITE)。

FileWriteArray(handle,arr,0,Narr)。

そして、別のプログラムから読み返す。

int handle=FileOpen("Test.dat",FILE_BIN|FILE_READ)。

FileReadArray(handle,arr,0,Narr)。

詳しくは、MT4ヘルプをご参照ください。