Kositsin0540はじめに私の記事『インディケータの経済的計算原理』で、コード内でカスタムインディケータおよびテクニカルインディケータを毎回呼び出さないことが、作成中のインディケータの中間計算においてもっとも最適な方法であると証明する合理的で説得力のある検証を行いました。実行の最終スピードは、インディケータの中に中間計算用コードを入れると、予想と比べるとかなり遅いものとなりました。格納する追加バッファの記述を入れると、コードはかなり複雑になります。中間計算の多様性にもかかわらず、そこで必要とされるものの多くは平均化の異なるアルゴリズムです。ほとんどの場合、それらのために、そういったコードを書く手間をかなり省くシンプルで汎用的なカスタム関数を使います。本稿では、そのような関数を作成し、連携するプロセスについて述べていきます。現在バーを平均化する一般的方法は中間インディケータバッファにあります。そのバッファは必要な情報を書き込み、以前の値範囲、それは平均化期間に等しい値です、を選択し、平均値を計算します。この選択処理手順は以下です。バー数、それに対し計算が行われます。今回の場合、平均化方法は2サイクルの計算を招きます。最初のサイクルでは、データが計算され中間バッファに入れられます。二番目のサイクルで、インディケータバッファの追加セル検索を行う別のサイクルを使って、上述の式を基に平均化が行われます。関数自体に中間データの選択を集積すると、この計算はずっと簡単に見えます。この場合、平均化関数は以下のようなものです。現在バーの関数内の値選択に書き込まれます。値が選択から削除されます。この方法で、平均化コードはささいなものに見え、それ以上のインディケータバッファは要求しません。関数内部では、配列がバー一つの計算に要求される正確に必要なデータ量だけを格納します。この場合、データ計算サイクルも一つだけです。平均化関数はその関数呼び出し中に値を失わない変数を含む必要があります。異なるパラメータを有するシングルタイプの平均化は複数回一つのコードで使用されます。そのため、今日数メモリリソースの衝突を避けるため、classes関数を実装する必要があります。CMoving_Averageクラスに記述されます。CMovSeriesToolsから派生します。基本クラスにはその他私が提案する全クラスで使用される汎用コードが含まれます。そのため、それを派生クラスに何度もコピーするのは意味のないことです。平均化を使っての適用されたタスクでは、保護されたクラスメンバはな形式では使われません。そのため、今はそれを見ていくことはしません。CMoving_Averageクラスは5個のシングルタイプ関数で交際されています。その名前からそれらの機能がわかりやすいので詳細を語る必要はないと思います。MA_Methodを使って平均化のアルゴリズムを選択することができます。追加のパラメータが補われている理由です。追加パラメータは次のようなものです。とセットその目的は同じ名前のベクトル関数を全く同じです。インデックスフラグを設定します。このクラスのすべての平均化関数は固定されたパラメータを持ち、それはプログラムコードが実行されるとき変更することができないことに配慮が必要です。CMoving_AverageクラスのEMASeries()関数はこのタイプのパラメータを二重に持ちます!そして、CMoving_Averageクラスです。インディケータで使い始めることができます。指令を使いグローバルスコープで作成するインディケータコードにMASeries_Cls.mqhファイルのコンテンツを追加します。クラスの配列には平均化の各手順のための個別クラス変数やセルがあるはずです。MA4;OnCalculate()関数内のクラス変数は静的に宣言されます。理由はそれらの値がこの関数の呼び出しのと呼び出しの間で保持される必要があるからです。これで平均化自体を始めることができます。例として、価格系列の連続した4つの平均化手順を示します。}それぞれ前の平均化(最後のものは含まない)結果は平均化の次のアルゴリズムで使用され、最終結果がインディケータバッファに渡されます。このコードのもっとも重要な部分は信頼性のあるバーの開始を示すインデックス値の細心の注意を払った予備初期化だと思います。ここの場合は以下です。begin;この場合、平均化のLWMAアルゴリズムが最後のもので、それは何にも影響を与えませんが、もしそれが最後でなければ、信頼のおける情報のスタートの移動はLength4+1、長さ4ではないとなることには注意が必要です!信頼できる情報のスタートがどのナンバーからかということが前のコードからはっきりしていないなら、大きい方の数字を取って必要ならば試しにその数字を減らしていきます。比較するのはたいへん面白いと思います。検証を行うことをきめたらすぐに、MAx4.mq5に似た別のインディケータ(MAx3x1.mq5)の検証を行うことは合理的ですが、最初の平均化はテクニカルインディケータiMA()を呼んで、他の3つはCMoving_Averageクラスを使って行います。インディケータをインクルードするとすぐに、検証するため、そのベースに別の類似インディケータ(cMAx4.mq5)を作成しました。Advisorsの検証準備をしたのです。cMAx4_Test.mq5。過去12か月間についてストラテジーテスタで実行した結果をお見せします。カスタムインディケータを呼ぶインディケータが最悪の結果を示しています。このコード記述のバリアントは怠け者にだけ推奨されるものですA!!別の「リーダー」も遅れてやってきていますが、テクニカルインディケータを呼ぶことを基にしたものは、もっとましな結果です。理想からは程遠いものです。検証の真のリーダーはクラスを使って作成されたインディケータです!クラスとテクニカルインディケータの混合は二番目の成績でした。子の結果もいつもそのように出るとは限りません。インディケータ検証時間が決定的であれば、毎回そのような状況になるたびに個人的にそのようなバリアントを確認するのがよいでしょう。no前に述べたCMoving_Averageクラスは平均化のアルゴリズムを5つインクルードします。CCMOクラスは平均化アルゴリズムをとオシレータを含みます。その他のクラスは単一の平均化アルゴリズムをインクルードします。提案のクラスのどれを使うのも、そのイデオロギーは、上記で述べたCMoving_Averageクラスの使用手順とまったく同じです。すべての平均化アルゴリズムのコード(パラボリックは除き)は実行の最高速度に最適化されています。パラボリック平均化コードは手順が複雑なため、最適化されていません。最後の3個のアルゴリズムのは平均化しません。それを加えたのは、人気の技術分析家の著書があり、よく使われるのと互換性のためです。情報が理解しやすいように、平均化アルゴリズムのは.mqhファイルに個別に入れるとよいでしょう。実用のために最良バリアントは独立したファイルに持つのがよいでしょう。インディケータで使用するには、提案のクラスはすべてSmoothAlgorithms.mqhファイル一つに入れています。このファイルにはiPriceSeries.mqhファイルの関数が追加されています。関数だけが本稿の例で使用されています。)この関数は、OnCalculate()関数を呼ぶ二番目のタイプとして使用されるためインディケータと連携しています。価格時系列セットを拡張するためです。11の数字で返します。平均化クラスを使用したプログラムコード実装実用例その他クラスを使用した別の例をお見せすることで十分だと思います。それで、すべては四重平均化と同じ方法で行われることを確認してください。OnCalculate()関数を実装するバリアントをお見せしようと思います。}ただし、今回はインディケータコードにグローバルスコープからの別ファイルから適切なクラスを追加しました。<SmoothAlgorithms.mqh>では、みなさんの注意を別のものに向けたいと思います。事は、膨大な数のインディケータが一つのバーの関数として表されるということです。これはクラスを使って連携するのはひじょうに都合のよいものです。ChandeのVidya移動平均に基づきボリンジャーチャネルを描くのは面白いことです。CStdDeviationが使われます。最初のクラスを使って、移動平均VIDYAの値を取得します。二番目のクラスを使って、移動平均の価格系列の標準偏差値を計算します。その後、チャネルの上下境界の計算にこの偏差を使います。最後の3つの入力パラメータはチャンネルが必要とする値をリンクを通じて渡します。この場合、関数VidyaBandsSeries()内ではクラスの変数は宣言したりそれらを静的にすることはできません。いうのも、クラス内の静的変数はまったく異なる意味を持つからです。それがクラスのグローバルスコープで宣言を行う理由です。m_STD;一般的なボリンジャーチャネルでは、移動平均の平均期間とチャネル自体の平均化期間はつねに等しくなっています。このクラスでは、自由度が高まるようにパラメータを別に作成しました。(VidyaBBands.mq5)は、CVidyaBandsクラスを使うのにとてもシンプルなので、本稿でその分析をするに及びません。mqhファイルに収めることた必要です。私はその関数をIndicatorsAlgorithms.mqhファイルに収めました。インディケータとクラスを使わないインディケータのパフォーマンス比較まず、見つけたいのは、インディケータのコードを書いているとき、クラスの使用はどのようにパフォーマンス低下を招くのか?ということです。(JMA.mq5)を使わずに書かれ、そしてそれが前と同じ条件で検証されました。検証の最終結果に大きな差は見られません。クラスを使うのにいくつか追加で変更がありますが、それは示すメリットに比べると大したものではありません。平均化クラス使用のメリットこれらアルゴリズムを使うメリットのひとつは、とても説得力のあるものですが、呼び出しの置き換えにより、上で作成されたコードのパフォーマンスを著しく高めるということです。別のそのようなクラスの実用的メリットは、それらを使う上での利便ン性です。述べられているすべてが、インディケータを書くこの種の方法にまさにうってつけだと思えるのです。インディケータコードは最大限圧縮されており、わかりやすく、バー再計算に一度のサイクルですむことが多いのです。どんなインディケータでも簡単に作成することができます。平均化の別の手法を使えば、一般的なものでも技術的なものでも。平均化アルゴリズムの広い多様性が、従来のトレードシステムでないものを作成する大きな可能性を与えてくれます。それに伴うのはトレンドを早く見つけ出せること、そして失敗がおこりにくくなることです。特定のインディケータコードで平均化アルゴリズム使用における提案ここで述べている、異なる平均化アルゴリズムを使って作成されたインディケータをちょっと見ると、それぞれいかに違っているかがわかります。提案されるアルゴリズムがすべて等しくそれぞれの状況に適してはいない、と推測するのは妥当でしょう。どのアルゴリズムを使うかはっきりとした境界線を引くのはむつかしいですが、一般的な提案はできると思います。それ以外のノイズ除去目的の平滑化には適していません。そのため、これらアルゴリズムには未処理の価格系列や平均化しないインディケータ値を入力するのが適しています。Kaufmanのアルゴリズムを用いたインディケータMomentumの値の処理結果があります。4c_Momentum_AMA.mq5)一般的な平均化アルゴリズムには特別な提案は必要ないと思います。それらの適用範囲はきわめて広いものです。これらアルゴリズムが使われるところはどこでも、左の4つのアルゴリズムを問題なく使うことができます。JMA平均化と置き換えられたMACDインディケータがあります。JMACD.mq5):そしてここに、現在の傾向をよりよく判断するために平均化のアルゴリズムを変える代わりに計算されたインディケータを平滑化した結果があります。(インディケータJMomentum.mq5):マーケットの相場はつねに変動し、そのため永遠にファイナンシャルマーケットの特定の部分のためのただ一つの理想的アルゴリズムを見つけようと思うのは世間知らずというものです。悲しいかな!この世で永遠に変わらないものなどありませんよ!わたしにしたところで、たとえばですが、常に変動するこのマーケットで高速&中期トレンドのインディケータをよく使います。J2JMA.mq5などです。私はそれらを基にした予測にかなり満足しています。他につけ加えたいことは、平均化アルゴリズムは再利用可能だということです。平均化した値を繰り返し平均化すると良い結果が出やすくなります。事実、本稿でもインディケータをそこからドローする処理の分析を始めました。本稿も終わりがけですが、注目いただきたいのは平均化そのもののメカニズムについてです。平均化アルゴリズムは、入力パラメータ'series'の値を格納するためにほとんどがm_SeriesArray[]タイプの変数の動的配列をインクルードします。計算に重要な情報が出現するやいなや、そのようは配列に一度にメモリを割り当てる必要があります。それはクラスCMovSeriesToolsの関数SeriesArrayResize()を使って行います。return(EMPTY_VALUE);それからそれぞれのバーで配列のもっとも古い値に価格系列'series'の現在の値を書き、変数m_count内にその位置の番号を記憶する必要があります。