ニューラルネットワークのアドバイザー、経験を共有する。 - ページ 9 12345678910 新しいコメント Aleksey Vyazmikin 2015.09.22 05:46 #81 Andrey Emelyanov:私も2013年に似たようなアルゴリズムを実装してみたのですが...。しかし、7つのインディケータを使い、ZigzagはNSのトレーニングのためのベクトルを形成するために使用されました。でも、本質は同じで、逆位置を探していたんです...。Zigzagを使い始めた頃は、インジケーターのデータや売買シグナルに縁がありませんでした。偶然にもいくつかのパターンに出会うまでは。それが、私のTSを根本から変えてしまったのです。これで、私のアルゴリズムはもっとシンプルになりました。1.分単位、時間単位で、過去1年間のパターンを計算する。2.ターニングポイントの辞書を作る(「分パターン-時間パターン」のペア)。3.ティッピングポイント辞書を使ったNSの指導(150~160組について)。これが私のアプローチの結果です。私のやり方のデメリットに1) TSの高リスク - ブレークプライスの正確な値を決定することができないため、TSはロットで9つの保留注文を配置します。1, 1, 3, 6, 14, 31, 70, 158, 355;2) 出口アルゴリズム(トロールTS)の実装が困難である。だからNSはトレードに使える。ただ、問題はNSに何を教えるかだ...。 P/S:パターンとは、A.メリルのパターン(M&W)のことです。スマートなアプローチですね。そして、パターンは、実際の価格差分を考慮することなく、マトリックス内のバーの位置として、単純に記述された - 相対的な位置のみ?私はパターンの指標をしようとするが、別のフレームで、アイデアを持っている - 最初の5つのバー我々は最後の5つの指標、およびトレンド分析のための2つの指標に指標を分析する - 我々は10の増分で分析し、アカウントの絶対的な変化を取ります。ジグザグはスマートなアイデアですが、トレンドの変化の誤ったポイントである可能性のあるフラットなウォブルから、ピークはどのようにフィルタリングするのでしょうか? Andrey Emelyanov 2015.09.22 07:11 #82 -Aleks-:理にかなったアプローチ。そして、実際の価格差は考慮せず、マトリックス内のバーの位置として単純に記述されたパターン - 相対的な位置だけですか?私はパターンの指標をしようとするが、別のフレームで、アイデアを持っている - 最初の5つのバー我々は最後の5つの指標、およびトレンド分析のための2つの指標に指標を分析する - 我々は10のステップで分析し、同時にアカウントに絶対的な変化を取ります。ジグザグについてはスマートなアイデアですが、フラットなウォブルからフィルターを通したピークが、トレンド変化の偽のポイントになる可能性は?私はこの方法でやっています。パターンのペアだけを格納する動的配列(私はこれを辞書と呼んでいます)と、シニアタイムフレームとジュニアの2つのカウンター配列があり、これらは辞書に書き込まれていなくても、パターンがペアを形成するのに何回関与したかをカウントします。 学習ベクトルは辞書に従って形成され、個々のパターンの重み=pattern_counter / maximum_counterとなる。つまり、ペア形成に多く参加するパターンを1とし、それ以外のパターンは1未満とする。NSを教えた後に得られるテーブルです。 メインパターン メインカウント スレーブパターン スレーブカウント 多層パーセプトロンの和 W2 18 W2 21 0.94914702 W14 14 W2 21 0.84972197 M15 20 M15 14 0.83269191 W1 11 W2 21 0.77499075 W13 10 W2 21 0.75006553 M15 20 M3 10 0.73813147 M15 20 M10 10 0.73812512 M15 20 M16 10 0.738099 W5 9 W2 21 0.72506739 W10 9 W2 21 0.72505412 M15 20 M11 9 0.71431236 W2 18 W1 11 0.71204136 W2 18 W5 11 0.7118911 W4 8 W2 21 0.70017271 W2 18 W4 10 0.68815217 W2 18 W7 10 0.68802818 M15 20 M7 7 0.66682395 M15 20 M14 6 0.64291215 W2 18 W13 8 0.64045346 M3 12 M15 14 0.63254238 W9 5 W2 21 0.62522345 W3 5 W2 21 0.62509623 W7 5 W2 21 0.62505511 M15 20 M12 5 0.61917222 M15 20 M8 5 0.6191331 W14 14 W1 11 0.61210667 W6 4 W2 21 0.60012943 W2 18 W14 6 0.59301682 NSの構造:入力ニューロン64個、内部ニューロン4個、出力1個。つまり、1つの入力ニューロンが1つのパターンを記述する。グリッドの学習には40〜50分かかり、NSの誤差は0.00001を超えない。こうして私は、以前は辞書に載っていなかったパターンでも、そのペアの意味を予測できるモデルを手に入れたのです。ずっとフラットピークとフォルスピークに悩まされてきましたが、ジグザグ計算のレベルでやっています。標準的なジグザグのコードを少し修正し、それをベースにZZパーセントを実装しました。今のところ、だいたい次のようなコードになっています。int MyCExtremum::GetCombiZigzag(const double &high[], // буфер цен high const double &low[], // буфер цен low const datetime &time[], // буфер время int ExtDepth, // глубина поиска экстремумов(первого прохода) double ExtDeviation,// "пороговое значение": жесткая ступенька + % роста цены int ExtBackstep // глубина поиска экстремумов(второго прохода) ) { //--- value int shift=0, whatlookfor=0, lasthighpos=0, lastlowpos=0, Deviat=1; double lasthigh=0.0, lastlow=0.0, percent=0.0; int rates_total = ArraySize(time); // размер входных таймсерий int limit = rates_total - ExtDepth; // лимит на расчеты... //+---------------------------------------------------------------+ //| ОЧЕНЬ ВАЖНАЯ ПРОВЕРКА ВЛИЯЮЩАЯ НА КОРРЕКТНОСТЬ ВЫЧИСЛЕНИЙ! | //+---------------------------------------------------------------+ if(ArrayIsSeries(high)) ArraySetAsSeries(high,false); if(ArrayIsSeries(low)) ArraySetAsSeries(low,false); if(ArrayIsSeries(time)) ArraySetAsSeries(time,false); //+---------------------------------------------------------------+ //| ПРОВЕРКИ ВХОДНЫХ ПЕРЕМЕННЫХ | //+---------------------------------------------------------------+ if(rates_total<20) { Print(__FUNCTION__," ERROR: the small size of the buffer."); return(-1); } if(ExtDeviation<0 || ExtDeviation>100) { Print(__FUNCTION__," ERROR: Is\'not correct a Deviation. The value of Deviation should be in the interval [0..100]."); return(-1); } //--- Проверка: Depth and Backstep if((ExtDepth < ExtBackstep)||(ExtDepth < 2)) { Print(__FUNCTION__+" ERROR: Is\'not correct a Depth and Backstep. The value of Depth should be greater than Backstep."); return(-1); } //--- готовим буфер ZigzagBuffer[] if(ArraySize(ZigzagBuffer)>0) ArrayFree(ZigzagBuffer); // Удаляем старые данные ArrayResize(ZigzagBuffer,rates_total, EXTREMUM_RESERVE); ArrayFill(ZigzagBuffer,0,rates_total,0.0); if(ArrayIsSeries(ZigzagBuffer)) ArraySetAsSeries(ZigzagBuffer, false); //--- if(ArraySize(HighMapBuffer)>0) ArrayFree(HighMapBuffer); // Удаляем старые данные ArrayResize(HighMapBuffer,rates_total, EXTREMUM_RESERVE); ArrayFill(HighMapBuffer,0,rates_total,0.0); if(ArrayIsSeries(HighMapBuffer)) ArraySetAsSeries(HighMapBuffer, false); //--- if(ArraySize(LowMapBuffer)>0) ArrayFree(LowMapBuffer); // Удаляем старые данные ArrayResize(LowMapBuffer,rates_total, EXTREMUM_RESERVE); ArrayFill(LowMapBuffer,0,rates_total,0.0); if(ArrayIsSeries(LowMapBuffer)) ArraySetAsSeries(LowMapBuffer, false); //--- if(ArraySize(TimeBuffer)>0) ArrayFree(TimeBuffer); // Удаляем старые данные ArrayResize(TimeBuffer, rates_total, EXTREMUM_RESERVE); ArrayFill(TimeBuffer, 0, rates_total, 0); if(ArrayIsSeries(TimeBuffer)) ArraySetAsSeries(TimeBuffer, false); //--- корректировка Deviation if(ExtDeviation < 1) { Deviat = 1; }else { Deviat = (int)ExtDeviation; } //--- получаем "свежие" минимумы и максимумы if(GetHighMapZigzag(high,ExtDepth,Deviat,ExtBackstep) < 0) return(0); if(GetLowMapZigzag(low,ExtDepth,Deviat,ExtBackstep) < 0) return(0); //--- final rejection for(shift=ExtDepth;shift<rates_total;shift++) { switch(whatlookfor) { case Start: // search for peak or lawn if(lastlow==0 && lasthigh==0) { if(HighMapBuffer[shift]!=0) { lasthigh=high[shift]; lasthighpos=shift; whatlookfor=Sill; ZigzagBuffer[shift]=lasthigh; TimeBuffer[shift]=time[shift]; } if(LowMapBuffer[shift]!=0) { lastlow=low[shift]; lastlowpos=shift; whatlookfor=Pike; ZigzagBuffer[shift]=lastlow; TimeBuffer[shift]=time[shift]; } } break; case Pike: // search for peak if(LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow && HighMapBuffer[shift]==0.0) { //--- ZigzagBuffer[lastlowpos] = 0.0; TimeBuffer[lastlowpos] = 0; //--- lastlowpos=shift; lastlow=LowMapBuffer[shift]; ZigzagBuffer[shift]=lastlow; TimeBuffer[shift]=time[shift]; //--- Обязательно: покинуть switch break; } //--- Обход "двойственности" if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow) { //--- ZigzagBuffer[lastlowpos] = 0.0; TimeBuffer[lastlowpos] = 0; //--- lastlowpos=shift; lastlow=LowMapBuffer[shift]; ZigzagBuffer[shift]=lastlow; TimeBuffer[shift]=time[shift]; //--- Обязательно: покинуть switch break; } if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0) { //--- Проверка: % роста цены percent = (HighMapBuffer[shift]-lastlow)/(lastlow/100); if(percent > ExtDeviation) { lasthigh=HighMapBuffer[shift]; lasthighpos=shift; ZigzagBuffer[shift]=lasthigh; TimeBuffer[shift]=time[shift]; whatlookfor=Sill; } percent = 0.0; } break; case Sill: // search for lawn if(HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]==0.0) { //--- ZigzagBuffer[lasthighpos] = 0.0; TimeBuffer[lasthighpos] = 0; //--- lasthighpos=shift; lasthigh=HighMapBuffer[shift]; ZigzagBuffer[shift]=lasthigh; TimeBuffer[shift]=time[shift]; //--- Обязательно: покинуть switch break; } if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh) { //--- ZigzagBuffer[lasthighpos] = 0.0; TimeBuffer[lasthighpos] = 0; //--- lasthighpos=shift; lasthigh=HighMapBuffer[shift]; ZigzagBuffer[shift]=lasthigh; TimeBuffer[shift]=time[shift]; //--- Обязательно: покинуть switch break; } if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0) { //--- Проверка: % роста цены percent = (lasthigh-LowMapBuffer[shift])/(lasthigh/100); if(percent > ExtDeviation) { lastlow=LowMapBuffer[shift]; lastlowpos=shift; ZigzagBuffer[shift]=lastlow; TimeBuffer[shift]=time[shift]; whatlookfor=Pike; } percent = 0.0; } break; default: return(-1); } } //--- return value of prev_calculated for next call return(rates_total); }MyCExtremumは、ZigZagを計算するためのクラスです。 ファイル: MyCExtremum.mqh 37 kb Advisors on neural networks, アスク! ジグザグ指標 Andrey Emelyanov 2015.09.22 07:15 #83 -Aleks-:理にかなったアプローチ。そして、実際の価格差は考慮せず、マトリックス内のバーの位置として単純に記述されたパターン - 相対的な位置だけですか?私は指標のパターンをしようとするが、別のフレームで、アイデアを持っている - 最初の5つのバー我々は最後の5つの指標、およびトレンド分析のための2つの指標に指標を分析する - 我々は10の増分で分析し、同時に考慮絶対変化させる。ジグザグはスマートなアイデアですが、トレンドの変化の誤ったポイントである可能性のあるフラットなウォブルから、ピークはどのようにフィルタリングするのでしょうか? パターンを使った指標の分析についてですが、とても興味深いですね...。指標はノイズが少ないと思いますが、「ノイズの少ないもの」と「ノイズの多いもの」を抑えるように指標を選ぶと、マルチフィルターになりますね。 TheXpert 2015.09.22 08:23 #84 Andrey Emelyanov: NSの構造:入力ニューロン64個、内部ニューロン4個、出力1個。つまり、1つの入力ニューロンが1つのパターンを記述する。 このモデルで結果を出すことを期待しているのでしょうか?インナーレイヤーは、分類器ではなく、中間圧縮機として機能します。 Aleksey Vyazmikin 2015.09.22 11:10 #85 Andrey Emelyanov:私は次のようなことをしています。パターンのペアだけを格納する動的配列(私はこれを辞書と呼んでいます)があり、パターンのペアが2回目に辞書に入った場合はそれを書き留めません。 学習ベクトルは辞書に従って形成され、個々のパターンの重み=pattern_counter / maximum_counterとなる。つまり、ペア形成に多く参加するパターンを1とし、それ以外のパターンは1未満とする。NSを教えた後に得られるテーブルです。 メインパターン メインカウント スレーブパターン スレーブカウント 多層パーセプトロンの和 W2 18 W2 21 0.94914702 W14 14 W2 21 0.84972197 M15 20 M15 14 0.83269191 W1 11 W2 21 0.77499075 W13 10 W2 21 0.75006553 M15 20 M3 10 0.73813147 M15 20 M10 10 0.73812512 M15 20 M16 10 0.738099 W5 9 W2 21 0.72506739 W10 9 W2 21 0.72505412 M15 20 M11 9 0.71431236 W2 18 W1 11 0.71204136 W2 18 W5 11 0.7118911 W4 8 W2 21 0.70017271 W2 18 W4 10 0.68815217 W2 18 W7 10 0.68802818 M15 20 M7 7 0.66682395 M15 20 M14 6 0.64291215 W2 18 W13 8 0.64045346 M3 12 M15 14 0.63254238 W9 5 W2 21 0.62522345 W3 5 W2 21 0.62509623 W7 5 W2 21 0.62505511 M15 20 M12 5 0.61917222 M15 20 M8 5 0.6191331 W14 14 W1 11 0.61210667 W6 4 W2 21 0.60012943 W2 18 W14 6 0.59301682 NSの構造:入力ニューロン64個、内部ニューロン4個、出力1個。つまり、1つの入力ニューロンが1つのパターンを記述する。グリッドの学習には40〜50分かかり、NSの誤差は0.00001を超えない。こうして私は、以前は辞書に載っていなかったパターンでも、そのペアの意味を予測できるモデルを手に入れたのです。ずっとフラットピークとフォルスピークに悩まされてきましたが、ジグザグ計算のレベルでやっています。標準的なジグザグのコードを少し修正し、それをベースにZZパーセントを実装しました。今のところ、だいたい次のようなコードになっています。アレイは面白い解決策ですね。ペア/期間間で統計値に違いはあるか、ポジティブな予測結果を与えるパターンの出現頻度のばらつきは一般にどの程度安定しているか。ジグザグについては、私もパーセントで解決していますが、さらに深い履歴でジグザグの基準区間を算出し、それに対して他の人の変化率を比較するようにしています。 Aleksey Vyazmikin 2015.09.22 11:12 #86 Andrey Emelyanov: パターンで指標を分析することについては、非常に興味深いですね......。インジケーターの方がノイズは少ないと思いますが、一方は「低いノイズ」、もう一方は「高いノイズ」を抑制するようにインジケーターを選択しないと、マルチフィルターになってしまいます。 さまざまな指標があります。私は標準的なオシレーター(とその類の無利子)を使って実験し、そのすべてで利益を上げることに成功しました - それはすべて設定次第です...。ランダムか規則性かの問題だけです。 Andrey Emelyanov 2015.09.22 21:35 #87 Комбинатор: このモデルで結果を出すことを期待しているのでしょうか?インナーレイヤーは、分類器ではなく、中間圧縮機として機能します。 これが必要な圧縮なんだ...。ある時点(現在のバー)で、64の入力のうち、0でない入力は2つだけです...で、ネットワークのタスクは、買い/売りで分けることではなく、与えられた入力でバウンドする確率がどのくらいかを測定することです。それとも私の推理がおかしいのでしょうか? Andrey Emelyanov 2015.09.22 22:12 #88 -Aleks-:アレイは面白い解決策ですね。予測結果が正となるパターン出現頻度変動の安定性は一般的にどうなのか、ペア/期間間の統計量の差はあるのか?ジグザグについては、私もパーセントで解決していますが、さらに深い履歴でジグザグの基準区間を算出し、それに対して他の人の変化率を比較するようにしています。 周知のように、A.メリルのパターンは、そのパターンがさらに発展(トレンドの維持)するか、別のパターンに変化(価格の反発)するかについて、正確な答えを与えるものではありません。そこで、1時間と1分という2つの時間軸で答えを探すことにしたのです。私はペアの再発の統計をとっており、普遍的なトレーニング辞書はまだ持っていません。でも、このつながりはきっとあるはず......。そうでなければ、蝶やコウモリなど、調和のとれた模様は生まれない。 Aleksey Vyazmikin 2015.09.23 08:05 #89 Andrey Emelyanov: 周知のように、A.メリルのパターンは、そのパターンがさらに発展(トレンドの維持)するか、別のパターンに変化(価格の反発)するかについて、正確な答えを与えるものではありません。そこで、1時間と1分という2つの時間軸で答えを探すことにしたのです。私はペアの再発の統計をとっており、普遍的なトレーニング辞書はまだ持っていません。でも、このつながりはきっとあるはず......。そうでなければ、蝶やコウモリなど、調和の取れたモデルは存在しないでしょう。 蝶やコウモリなど、人間が視覚的に認識するモデルは、人間の脳の中でしか生まれないものであり、この要素を考えるには、このテーマで認知心理学を学び、パターン認識において脳にとって何が必須で何が不要なのか、つまり、どんな誤差が許され、何が許されないのかを理解する必要があると考えている。脳のパターン語彙は限られているので、ローソク足の似たような組み合わせを一つの絵の中に入れてしまうのです。つまり、見たものを表現するのに、正確な数学的モデルを使わないのです。 Maxim Dmitrievsky 2015.09.24 03:32 #90 うちの子はまだおぼつかないけど、なんとかなりそう...。入力指標8個、出力1個、被覆層15ニューロン。2000入力ベクトル、10000学習エポック。実はこれで3回目か4回目なのですが、どれもほとんど同じ結果になっています。ニューロンや入力ベクトルを増やせばいいのだろうが、学習に時間がかかる。拾うべきパターンのおおよその見当はついており、異なる時間枠から指標を選択し、出力は意味のある情報を持っているようです。 12345678910 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
私も2013年に似たようなアルゴリズムを実装してみたのですが...。しかし、7つのインディケータを使い、ZigzagはNSのトレーニングのためのベクトルを形成するために使用されました。でも、本質は同じで、逆位置を探していたんです...。Zigzagを使い始めた頃は、インジケーターのデータや売買シグナルに縁がありませんでした。偶然にもいくつかのパターンに出会うまでは。それが、私のTSを根本から変えてしまったのです。これで、私のアルゴリズムはもっとシンプルになりました。
1.分単位、時間単位で、過去1年間のパターンを計算する。
2.ターニングポイントの辞書を作る(「分パターン-時間パターン」のペア)。
3.ティッピングポイント辞書を使ったNSの指導(150~160組について)。
これが私のアプローチの結果です。
私のやり方のデメリットに
1) TSの高リスク - ブレークプライスの正確な値を決定することができないため、TSはロットで9つの保留注文を配置します。1, 1, 3, 6, 14, 31, 70, 158, 355;
2) 出口アルゴリズム(トロールTS)の実装が困難である。
だからNSはトレードに使える。ただ、問題はNSに何を教えるかだ...。
P/S:パターンとは、A.メリルのパターン(M&W)のことです。
スマートなアプローチですね。そして、パターンは、実際の価格差分を考慮することなく、マトリックス内のバーの位置として、単純に記述された - 相対的な位置のみ?
私はパターンの指標をしようとするが、別のフレームで、アイデアを持っている - 最初の5つのバー我々は最後の5つの指標、およびトレンド分析のための2つの指標に指標を分析する - 我々は10の増分で分析し、アカウントの絶対的な変化を取ります。
ジグザグはスマートなアイデアですが、トレンドの変化の誤ったポイントである可能性のあるフラットなウォブルから、ピークはどのようにフィルタリングするのでしょうか?
理にかなったアプローチ。そして、実際の価格差は考慮せず、マトリックス内のバーの位置として単純に記述されたパターン - 相対的な位置だけですか?
私はパターンの指標をしようとするが、別のフレームで、アイデアを持っている - 最初の5つのバー我々は最後の5つの指標、およびトレンド分析のための2つの指標に指標を分析する - 我々は10のステップで分析し、同時にアカウントに絶対的な変化を取ります。
ジグザグについてはスマートなアイデアですが、フラットなウォブルからフィルターを通したピークが、トレンド変化の偽のポイントになる可能性は?
私はこの方法でやっています。
パターンのペアだけを格納する動的配列(私はこれを辞書と呼んでいます)と、シニアタイムフレームとジュニアの2つのカウンター配列があり、これらは辞書に書き込まれていなくても、パターンがペアを形成するのに何回関与したかをカウントします。
学習ベクトルは辞書に従って形成され、個々のパターンの重み=pattern_counter / maximum_counterとなる。つまり、ペア形成に多く参加するパターンを1とし、それ以外のパターンは1未満とする。NSを教えた後に得られるテーブルです。
NSの構造:入力ニューロン64個、内部ニューロン4個、出力1個。つまり、1つの入力ニューロンが1つのパターンを記述する。グリッドの学習には40〜50分かかり、NSの誤差は0.00001を超えない。
こうして私は、以前は辞書に載っていなかったパターンでも、そのペアの意味を予測できるモデルを手に入れたのです。
ずっとフラットピークとフォルスピークに悩まされてきましたが、ジグザグ計算のレベルでやっています。標準的なジグザグのコードを少し修正し、それをベースにZZパーセントを実装しました。今のところ、だいたい次のようなコードになっています。
int MyCExtremum::GetCombiZigzag(const double &high[], // буфер цен high
const double &low[], // буфер цен low
const datetime &time[], // буфер время
int ExtDepth, // глубина поиска экстремумов(первого прохода)
double ExtDeviation,// "пороговое значение": жесткая ступенька + % роста цены
int ExtBackstep // глубина поиска экстремумов(второго прохода)
)
{
//--- value
int shift=0, whatlookfor=0, lasthighpos=0, lastlowpos=0, Deviat=1;
double lasthigh=0.0, lastlow=0.0, percent=0.0;
int rates_total = ArraySize(time); // размер входных таймсерий
int limit = rates_total - ExtDepth; // лимит на расчеты...
//+---------------------------------------------------------------+
//| ОЧЕНЬ ВАЖНАЯ ПРОВЕРКА ВЛИЯЮЩАЯ НА КОРРЕКТНОСТЬ ВЫЧИСЛЕНИЙ! |
//+---------------------------------------------------------------+
if(ArrayIsSeries(high)) ArraySetAsSeries(high,false);
if(ArrayIsSeries(low)) ArraySetAsSeries(low,false);
if(ArrayIsSeries(time)) ArraySetAsSeries(time,false);
//+---------------------------------------------------------------+
//| ПРОВЕРКИ ВХОДНЫХ ПЕРЕМЕННЫХ |
//+---------------------------------------------------------------+
if(rates_total<20)
{
Print(__FUNCTION__," ERROR: the small size of the buffer.");
return(-1);
}
if(ExtDeviation<0 || ExtDeviation>100)
{
Print(__FUNCTION__," ERROR: Is\'not correct a Deviation. The value of Deviation should be in the interval [0..100].");
return(-1);
}
//--- Проверка: Depth and Backstep
if((ExtDepth < ExtBackstep)||(ExtDepth < 2))
{
Print(__FUNCTION__+" ERROR: Is\'not correct a Depth and Backstep. The value of Depth should be greater than Backstep.");
return(-1);
}
//--- готовим буфер ZigzagBuffer[]
if(ArraySize(ZigzagBuffer)>0) ArrayFree(ZigzagBuffer); // Удаляем старые данные
ArrayResize(ZigzagBuffer,rates_total, EXTREMUM_RESERVE);
ArrayFill(ZigzagBuffer,0,rates_total,0.0);
if(ArrayIsSeries(ZigzagBuffer)) ArraySetAsSeries(ZigzagBuffer, false);
//---
if(ArraySize(HighMapBuffer)>0) ArrayFree(HighMapBuffer); // Удаляем старые данные
ArrayResize(HighMapBuffer,rates_total, EXTREMUM_RESERVE);
ArrayFill(HighMapBuffer,0,rates_total,0.0);
if(ArrayIsSeries(HighMapBuffer)) ArraySetAsSeries(HighMapBuffer, false);
//---
if(ArraySize(LowMapBuffer)>0) ArrayFree(LowMapBuffer); // Удаляем старые данные
ArrayResize(LowMapBuffer,rates_total, EXTREMUM_RESERVE);
ArrayFill(LowMapBuffer,0,rates_total,0.0);
if(ArrayIsSeries(LowMapBuffer)) ArraySetAsSeries(LowMapBuffer, false);
//---
if(ArraySize(TimeBuffer)>0) ArrayFree(TimeBuffer); // Удаляем старые данные
ArrayResize(TimeBuffer, rates_total, EXTREMUM_RESERVE);
ArrayFill(TimeBuffer, 0, rates_total, 0);
if(ArrayIsSeries(TimeBuffer)) ArraySetAsSeries(TimeBuffer, false);
//--- корректировка Deviation
if(ExtDeviation < 1)
{
Deviat = 1;
}else
{
Deviat = (int)ExtDeviation;
}
//--- получаем "свежие" минимумы и максимумы
if(GetHighMapZigzag(high,ExtDepth,Deviat,ExtBackstep) < 0) return(0);
if(GetLowMapZigzag(low,ExtDepth,Deviat,ExtBackstep) < 0) return(0);
//--- final rejection
for(shift=ExtDepth;shift<rates_total;shift++)
{
switch(whatlookfor)
{
case Start: // search for peak or lawn
if(lastlow==0 && lasthigh==0)
{
if(HighMapBuffer[shift]!=0)
{
lasthigh=high[shift];
lasthighpos=shift;
whatlookfor=Sill;
ZigzagBuffer[shift]=lasthigh;
TimeBuffer[shift]=time[shift];
}
if(LowMapBuffer[shift]!=0)
{
lastlow=low[shift];
lastlowpos=shift;
whatlookfor=Pike;
ZigzagBuffer[shift]=lastlow;
TimeBuffer[shift]=time[shift];
}
}
break;
case Pike: // search for peak
if(LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow && HighMapBuffer[shift]==0.0)
{
//---
ZigzagBuffer[lastlowpos] = 0.0;
TimeBuffer[lastlowpos] = 0;
//---
lastlowpos=shift;
lastlow=LowMapBuffer[shift];
ZigzagBuffer[shift]=lastlow;
TimeBuffer[shift]=time[shift];
//--- Обязательно: покинуть switch
break;
}
//--- Обход "двойственности"
if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow)
{
//---
ZigzagBuffer[lastlowpos] = 0.0;
TimeBuffer[lastlowpos] = 0;
//---
lastlowpos=shift;
lastlow=LowMapBuffer[shift];
ZigzagBuffer[shift]=lastlow;
TimeBuffer[shift]=time[shift];
//--- Обязательно: покинуть switch
break;
}
if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0)
{
//--- Проверка: % роста цены
percent = (HighMapBuffer[shift]-lastlow)/(lastlow/100);
if(percent > ExtDeviation)
{
lasthigh=HighMapBuffer[shift];
lasthighpos=shift;
ZigzagBuffer[shift]=lasthigh;
TimeBuffer[shift]=time[shift];
whatlookfor=Sill;
}
percent = 0.0;
}
break;
case Sill: // search for lawn
if(HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]==0.0)
{
//---
ZigzagBuffer[lasthighpos] = 0.0;
TimeBuffer[lasthighpos] = 0;
//---
lasthighpos=shift;
lasthigh=HighMapBuffer[shift];
ZigzagBuffer[shift]=lasthigh;
TimeBuffer[shift]=time[shift];
//--- Обязательно: покинуть switch
break;
}
if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh)
{
//---
ZigzagBuffer[lasthighpos] = 0.0;
TimeBuffer[lasthighpos] = 0;
//---
lasthighpos=shift;
lasthigh=HighMapBuffer[shift];
ZigzagBuffer[shift]=lasthigh;
TimeBuffer[shift]=time[shift];
//--- Обязательно: покинуть switch
break;
}
if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0)
{
//--- Проверка: % роста цены
percent = (lasthigh-LowMapBuffer[shift])/(lasthigh/100);
if(percent > ExtDeviation)
{
lastlow=LowMapBuffer[shift];
lastlowpos=shift;
ZigzagBuffer[shift]=lastlow;
TimeBuffer[shift]=time[shift];
whatlookfor=Pike;
}
percent = 0.0;
}
break;
default:
return(-1);
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
MyCExtremumは、ZigZagを計算するためのクラスです。
理にかなったアプローチ。そして、実際の価格差は考慮せず、マトリックス内のバーの位置として単純に記述されたパターン - 相対的な位置だけですか?
私は指標のパターンをしようとするが、別のフレームで、アイデアを持っている - 最初の5つのバー我々は最後の5つの指標、およびトレンド分析のための2つの指標に指標を分析する - 我々は10の増分で分析し、同時に考慮絶対変化させる。
ジグザグはスマートなアイデアですが、トレンドの変化の誤ったポイントである可能性のあるフラットなウォブルから、ピークはどのようにフィルタリングするのでしょうか?
Andrey Emelyanov:
NSの構造:入力ニューロン64個、内部ニューロン4個、出力1個。つまり、1つの入力ニューロンが1つのパターンを記述する。
私は次のようなことをしています。
パターンのペアだけを格納する動的配列(私はこれを辞書と呼んでいます)があり、パターンのペアが2回目に辞書に入った場合はそれを書き留めません。
学習ベクトルは辞書に従って形成され、個々のパターンの重み=pattern_counter / maximum_counterとなる。つまり、ペア形成に多く参加するパターンを1とし、それ以外のパターンは1未満とする。NSを教えた後に得られるテーブルです。
NSの構造:入力ニューロン64個、内部ニューロン4個、出力1個。つまり、1つの入力ニューロンが1つのパターンを記述する。グリッドの学習には40〜50分かかり、NSの誤差は0.00001を超えない。
こうして私は、以前は辞書に載っていなかったパターンでも、そのペアの意味を予測できるモデルを手に入れたのです。
ずっとフラットピークとフォルスピークに悩まされてきましたが、ジグザグ計算のレベルでやっています。標準的なジグザグのコードを少し修正し、それをベースにZZパーセントを実装しました。今のところ、だいたい次のようなコードになっています。
アレイは面白い解決策ですね。ペア/期間間で統計値に違いはあるか、ポジティブな予測結果を与えるパターンの出現頻度のばらつきは一般にどの程度安定しているか。
ジグザグについては、私もパーセントで解決していますが、さらに深い履歴でジグザグの基準区間を算出し、それに対して他の人の変化率を比較するようにしています。
パターンで指標を分析することについては、非常に興味深いですね......。インジケーターの方がノイズは少ないと思いますが、一方は「低いノイズ」、もう一方は「高いノイズ」を抑制するようにインジケーターを選択しないと、マルチフィルターになってしまいます。
このモデルで結果を出すことを期待しているのでしょうか?インナーレイヤーは、分類器ではなく、中間圧縮機として機能します。
アレイは面白い解決策ですね。予測結果が正となるパターン出現頻度変動の安定性は一般的にどうなのか、ペア/期間間の統計量の差はあるのか?
ジグザグについては、私もパーセントで解決していますが、さらに深い履歴でジグザグの基準区間を算出し、それに対して他の人の変化率を比較するようにしています。
周知のように、A.メリルのパターンは、そのパターンがさらに発展(トレンドの維持)するか、別のパターンに変化(価格の反発)するかについて、正確な答えを与えるものではありません。そこで、1時間と1分という2つの時間軸で答えを探すことにしたのです。私はペアの再発の統計をとっており、普遍的なトレーニング辞書はまだ持っていません。でも、このつながりはきっとあるはず......。そうでなければ、蝶やコウモリなど、調和の取れたモデルは存在しないでしょう。
うちの子はまだおぼつかないけど、なんとかなりそう...。入力指標8個、出力1個、被覆層15ニューロン。2000入力ベクトル、10000学習エポック。
実はこれで3回目か4回目なのですが、どれもほとんど同じ結果になっています。ニューロンや入力ベクトルを増やせばいいのだろうが、学習に時間がかかる。
拾うべきパターンのおおよその見当はついており、異なる時間枠から指標を選択し、出力は意味のある情報を持っているようです。