一度こういうのを作ったことがあるんですよ.

 

ある日突然、「最小二乗近似とは、本来、ベクトルの線形結合を最小化することだ」という単純なことに気づきました。つまり、ある種の普遍的な近似関数を作製することができる。決まったことなので、ここで機能のタイトルを紹介します。

//+------------------------------------------------------------------+
//  Аппроксимация методом наименьших квадратов                       |
//+------------------------------------------------------------------+
bool LSA(double& V[], int M, int N, double& A[], double& C[]) {
// Имеется N векторов размером M
// и вектор их линейной комбинации Y размером естестственно тоже M.
// На вход функции они подаются в виде матрицы V[0..M-1][0..N],
// где Y размещён в столбце N 
// На выходе мы должны получить вектор коэффициентов C размером M.
// Нам нужна также матрица A[N][N+1] для размещения коэффициентов системы уравнений

重要な詳細、すべての配列VとAは本当に一次元で、配列Aはしかし純粋に動作している、しかし配列Vは正しく充填される必要があります。

また、連立一次方程式を解くための関数も必要です。これを作っていたとき、私はMQLでの実装は、 ANG3110が多項式回帰に使っているガウス法しか知りませんでした。 当然ながら、私は最も抵抗の少ない道を選び、この関数にこの特殊なアルゴリズムを使用しました。つまり、行列が対称であることがわかるので、より効率的なアルゴリズムがあるのですが、私はそれに頼らず、このような方法をとりました。

使用方法

まず、どの関数を近似するかを決めます。例えば、線形回帰とします。つまり、A*1 + B*Xの線形結合、単位ベクトルと引数そのものの2つのベクトルだけを用意することになる。

init()のどこかで、作業用配列を作成し、そのためのメモリを確保しましょう。

double V[];
double A[],С[];

...

  ArrayResize(A,6);  // размер N*(N+1)
  ArrayResize(C,2);  // размер N
  ArrayResize(V,M*3);  // M*(N+1), M - не что иное как размер выборки

あとは、Vの配列を正しく埋めて、係数を計算するだけです。これは、以下のように行うことができます。

    ind = 0;
    Stop = Start + M;
// Заполняем векторы
    for(pos = Start; i < Stop; i++) {
     V[ind] = 1.0;
     ind++;
     V[ind] = pos;
     ind++;
     V[ind] = Close[pos];   
     ind++;
    }
// Считаем коэффициенты
   LSA(V, M, N, A, C);

これで、線形回帰 C[0]+C[1]*pos の準備は完了です。

まず、アルゴリズムの確認が必要です。そのため、ang_PR (Din)-v1.mq4 インディケータ (ANG3110 ) をベースに、LSAを用いた多項式回帰インディケータを書き、その結果を比較したところ、ang_PR (Din)-v1.mq4 インディケータは、LSAを用いた多項式回帰インディケータであることが分かりました。 結果は目視で一致し、それでテストは終了しました(笑)。LSA_PR.mq4インジケータを添付しています。

ファイル:
pr_lsa.mq4  7 kb
 

これはかなり昔の話なのですが、最近になって思い出して、作った道具をまた実行に移すことにしたんです。

最初に考えたのは、引用グラフに周期性を見出すことでした。なぜかというと、高調波を検索するための離散フーリエ変換(DFT)が存在するからだ。しかし、FFTではサンプル長より短い周期の高調波しか得られない。これで、サンプル長より長い周期を持つ高調波を価格チャートに当てはめてみることができる。もちろん、フィッティングが成功しても、その実在を支持する「鉄壁の」論拠にはならないので、特定の近似値に対する信頼度の問題は、別途判断されるべきだろう。

添付のインジケーターLSA_SinLRR.mq4では、線形トレンドはハーモニックで試す前に計算されます。アッパーホライズンを使って算出されます。ある範囲内で可能なすべてのサンプル長を検索し,サンプル(基本サンプルサイズの1/4とする)のRMS誤差が最小となるものを選択する。

高調波周期は、サンプルの長さに所定の係数を乗じることで関連づけられる。例えば、2であれば、サンプルはハーモニックの半周期を含み、0.5であれば、2周期となる。サンプルの長さ自体は線形回帰と 同じ方法で決定されるが、最下層の地平線の中で列挙されるだけである。

計算量を減らすために、各ホライズンごとに異なるサンプリングステップをとっています。

ベクトル行列は以下のように記入される。

  for(i = IntShift; i < Frame; i++) {
    pos = HShift+i*Step;
    VT[ind] = MathSin(AFreq*pos);
    ind ++;
    VT[ind] = MathCos(AFreq*pos);
    ind ++;
    VT[ind] = Resid[i];   
    ind ++;
  }  //  for(i = IntShift; i < Frame; i++)

レジッドは、旧来のトレンドとの価格差です。

指標となるパラメータ。

extern double kPer = 4.0;   // Коэффициент для определения периода
extern int LRRank = 1;      // Номер старшего горизонта, больше 3-х не ставить
extern int FShift = 120;    // Расстояние в барах, на которое производится экстраполяция в будущее
extern int HShift = 1;      // Сдвиг текущего времени индикатора в прошлое в барах, бары правее него тоже будут проэктраполированы
extern double PointFactor = 0.1;  // Масштабирование гистограммы ошибок аппроксимации, 0.1 подойдёт для минуток на пятизнаке 
extern bool PriceClose = true; // Если false, то будет считаться по HL/2


うう、なぜか書くのに疲れてしまった :)

簡単に説明すると、要旨は以下の通りです。この機能は最適を装うものではなく、単にパンケーキのように近似値を作り、フライパンから出してすぐに試せるものです :) .したがって、インジケーターはそのように作られています。つまり、スタイルや効率という点では、何ら気負うことなく作られているのです。

この場合、あまり早くは動作しないので、履歴は計算されません。ビジュアライザーで勉強したほうがいいということです。でも、すぐに飽きちゃうんですよね :)でも、患者さんの誰かがその恩恵を受ける方法を見つける可能性は否定できません :) 。


一般的に、私は首尾一貫した説明をすることができなかったと認識しています。誰かが興味を持っている場合、彼らはおそらく説明を頼りにすることができます。


基本的に、私たちは別の指標について話をすることになっていて、それは提示されたものよりもより美しく近似し、外挿するものです。つまり、私はそれに感動して、ついに出来高価格決定論の立場になってしまったらしい。でも、だからといって、そのピースの長さがまだ確定していないので、簡単にはいきません :) .

でも、もう書く気力がないので、写真を何枚かあげるくらいしかできません :)

外挿に成功した近似値の例

インパルスによって外挿が「阻止された」近似値の例

ファイル:
lsa_sinlr.mq4  14 kb
 
Candid:

HShiftが設定されず、最初の行の実際の位置によって決定されるように、ちょっとしたコードを追加していただけませんか? より正確には、<0に設定されていれば、両方のメカニズムが機能し、チャート上で履歴に深く入り込み、その時点での予測とその後に起こったことを分析することが可能になるのです。)

 
ForexTools:

HShiftが設定されず、最初の行の実際の位置によって決定されるように、ちょっとしたコードを追加していただけませんか? より正確には、もしそれが<0に設定されていれば、両方のメカニズムが機能し、履歴の奥深くのチャート上にドラッグして、その時点での予測とその後に起こったことを分析することが可能になります。)

はい、かなり便利です、バージョンをあげます。ただし、私はグラフィカルな操作に特にこだわりがあるわけではないので、すべてがスムーズにいく保証はないことを申し添えておきます。


ところで、右下のヒストグラムは、ベースサンプルの近似誤差とアウトオブサンプルの外挿誤差を示していると、私はどこにも明示的に言わなかったと思うのですが。これらの情報は、状況を把握するために関連性があると考えるのが妥当である。


追伸:そうだ、一行追加するのを忘れていた。11:50にインジケータを交換

ファイル:
 

もうひと言。なぜ、直線的なトレンドをとるのですか?とにかく、本当のトレンドはリニアに見えるんです。このようなデトレンドが無意識にできるのであれば、高調波の裏側にもリアリティがあるのではと期待されます。

多項式の次数を上げることは原理的に問題なく、実際、私は放物線のオプションから始めました。これは、初歩的なことですが、いくつかの行を追加・修正するだけで、誰でも練習として自分でやってみることができます。

 

こんにちは。

図面について説明してください。縦の線に 興味があります。青い線の間が予報のデータということでよろしいでしょうか? 赤い線は何を意味しているのでしょうか?- 予想との乖離の瞬間は? 赤(青)の予想線にギャップがあるのはなぜ?

あなたのMQLプログラミングのレベルは私には低すぎるので、コードを見たことがありません、そのレベルに近づくのは夢のようです?

 

Prival:

図面について教えてください。縦の線に興味があります。青い線の間が予報のデータということでよろしいでしょうか? 赤い線は何を意味しているのでしょうか?- 赤(青)の予報線に隙間があるのはなぜ?


そうですね、実は青い線の間で近似しているんです。青と赤の間で、外挿のRMSが計算されます。HShiftでずらして(今はチャートに沿って線をドラッグするだけ)、見えないところを見るのが私たちの力量です。

ギャップは「無駄」であり、指標のワーキングウィンドウは時間と共にシフトし、テールは残される。これなら常設の窓で簡単に直せますが、順応性があるので、安く掃除する方法はまだ思いつきません。

ラインを塗り替えたバージョンをお渡ししています。

ファイル:
 

あなたの新しいコードは、私が望んでいたように動作しませんでした :(

特にft.AutoRefreshと組み合わせると効果絶大です。

ファイル:
lsa_sinlr_1.mq4  16 kb
 

ForexTools:

特にft.AutoRefreshと組み合わせると効果的です。

あなたのバージョンはより干渉に強いと思いますが、おそらくそこにもHShift--を追加する必要があり、ユーザーのアクションがない場合、ウィンドウは時間とともに移動するようになります。しかし、うーん、もしかしたら、それこそ避けたかったことなのでは?
 
もちろんです!歴史を分析する場合、グラフはどこにも行かず、私が線を引いた場所に「立つ」べきです。
 
ForexTools:
もちろんです!歴史を分析する場合、グラフはどこにも行かず、私が線を引いた場所に「立つ」べきです。

まあ、最初は据え置き型のバリエーションを作って、それを置き換えたんですけどね :) 。私はまず、再描画のダイナミズムに興味を持ちました。のようなパラメータを追加するのは簡単です。

if (ModeMoving) HShift--;
しかし、良すぎるのも良くない。変種を眠らせておくのも良くない。
理由: