【MQL5】HasNan関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク

HasNan関数の働き・役割

HasNan関数は、ベクトル行列内に含まれる要素のうち、数値が「NaN(Not a Number)」であるものの数を調べるために使用します。

NaNとは

NaN」は計算結果が定義されない場合(例えば負の数値の平方根を計算するなど)に生成される特殊な値です。

この関数を使うと、データの中にNaNが含まれているかを簡単に確認できます。特に数値計算やデータ処理を行う際に、エラーや不正な値が混ざっていないかチェックする目的で役立ちます。例えば、データ分析やインジケータ(指標)の開発時に、計算結果が正しいかどうかを確認するために利用されます。

HasNan関数の引数について

ulong vector::HasNan();
 
ulong matrix::HasNan();

HasNan関数には、次の2つの書式があります。それぞれベクトル型と行列型に対応しており、どちらも引数は必要ありません。

ベクトル型の書式は、ベクトル内の要素をチェックし、NaNの個数を返します。ベクトルは、vectorクラスを使用して作成され、Tにはデータ型(例えばdouble型など)が指定されます。

行列型の書式は、行列内の要素をチェックし、NaNの個数を返します。行列は、matrixクラスを使用して作成され、Tにはデータ型(例えばdouble型など)が指定されます。

引数の補足説明

HasNan関数引数を必要とせず、ベクトル行列そのものに対して直接呼び出します。そのため、対象となるベクトル行列が正しく定義され、値が適切に設定されていることを確認してから利用する必要があります。

この関数の呼び出し例としては、ベクトルを作成し、最後の要素NaNを含む場合、NaNの個数を取得するなどが挙げられます。ベクトル内のNaNの数を確認する処理が容易になります。

関数の戻り値について

HasNan関数は、ベクトルまたは行列内に含まれるNaNの個数を返します。この戻り値は、非負の整数(ulong型)で表され、NaNが含まれていない場合は0が返されます。

HasNan関数を使ったサンプルコード

void OnStart(void)
{
   // double型の変数xを作成し、負の数の平方根を計算
   // この場合、平方根の計算結果はNaN(Not a Number)になる
   double x = sqrt(-1);
   
   // xがx自身と等しいかどうかをチェック
   // 通常の浮動小数点比較ではNaNは自身と等しくないため、結果はfalseになる
   Print("single: ", x == x);

   // ベクトルv1とv2を作成し、どちらもNaNの値を要素として含む
   vector<double> v1 = {x};
   vector<double> v2 = {x};

   // ベクトルv1とv2を比較し、その結果を表示
   // Compare関数では、NaN同士を等しいものとして扱うため、結果はtrueになる(0が返る)
   Print("vector: ", v1.Compare(v2, 0) == 0);
}

/* 実行結果:
single: false       // 単一のNaN値では自身と等しくないためfalse
vector: true        // ベクトル内のNaN同士はCompare関数で等しいとみなされるためtrue
*/

サンプルコードの解説

このコードは、NaN(Not a Number)値の特性と、ベクトルを比較する際の動作について説明するものです。


1. NaN値の生成

最初に、平方根を計算するsqrt関数を使って、負の数の平方根を計算しています。この処理は、数学的に定義されていない計算を行うため、結果として特殊な値であるNaNが生成されます。変数xにその値が代入されます。

NaNとは「Not a Number」の略で、計算が定義できない場合に浮動小数点演算で生成される特別な値です。


2. NaN値の比較

次に、xがxと等しいかどうかを調べています。この比較は、変数xが自分自身と等しいかどうかを調べる処理です。

ここで重要なポイントは、NaNという特殊な値はどの値とも等しくない、という浮動小数点のルールです。そのため、変数xが自分自身と比較されても結果は偽(false)となり、エキスパートログにsingle: falseと出力されます。


3. ベクトルへのNaN値の格納

次に、ベクトルv1とv2を作成しています。この処理では、波括弧を使った初期化リストを用いて、それぞれのベクトルNaN値を1つの要素として格納しています。

波括弧は、複数の値をまとめてベクトル初期値として設定するために使用されます。この記述において、波括弧の中に指定された値のみがベクトル要素になります。したがって、このコードではベクトルv1とv2はそれぞれ1つの要素を持ち、その唯一の要素NaN値となっています。


4. ベクトルの比較

次に、v1とv2の内容を比較しています。この処理では、ベクトルのCompareメソッドを使用しています。Compareメソッドは、2つのベクトル要素を順番に比較し、全ての要素が等しい場合に0を返します。

通常、NaNはどの値とも等しくないため比較結果は偽となりますが、Compareメソッドには特別な仕様があります。このメソッドでは、NaN同士を等しいと判定するため、結果として0が返り、比較結果は真(true)となります。


5. 実行結果の解釈

このコードを実行すると、次の結果が得られます。

  • single: falseは、変数xが自分自身と等しくないと判定されたためです。これは、NaN値が特殊な規則によってどの値とも等しくないとされるためです。
  • vector: trueは、ベクトルのCompareメソッドNaN同士を等しいと判定したためです。

HasNan関数を使ってEAを作る際のアイディア

HasNan関数を利用することで、データの品質を検証し、不正な値や計算エラーを早期に検出する仕組みを作ることが可能です。


1. 価格データの整合性チェック

価格データを格納したベクトル行列を対象に、HasNan関数を使用してデータの整合性を確認します。以下のような用途に役立ちます。

  • サーバーから受信した価格データやインジケータの計算結果が適切であるかを自動でチェック。
  • NaNが含まれている場合にEAの動作を停止する、または修正されたデータを要求する。

2. 複雑な計算モデルのデバッグ

高度なトレード戦略では、行列ベクトルを使用した計算が含まれることがあります。HasNan関数を組み込むことで、次のようなデバッグが容易になります。

  • インジケータや統計モデルの計算結果が正しいかを検証。
  • 計算中に発生するNaNを早期に検出し、エラーの発生箇所を特定。

3. 異常値を検知してリスク管理を強化

トレードの際に異常値が含まれるデータを利用してしまうと、誤った判断が下される可能性があります。HasNan関数を使って、データの健全性を確認し、異常を検出した場合には取引を回避する仕組みを作ることができます。

  • オープンポジションの際、計算エラーが発生したらエラー処理を行いポジションを閉じる。
  • エントリー条件に使用する指標にNaNが含まれている場合、取引を中止。

4. バックテストデータの品質管理

バックテストで使用するデータセットにNaNが含まれていないかを検査します。不正なデータを検出し、次のような動作を実現します。

  • テスト開始前にデータをクリーンアップする仕組みを構築。
  • データに問題があった場合に警告を出し、計算やテストの中断を実行。

5. トレードアルゴリズムの自己修復

HasNan関数EAに組み込むことで、異常値が検出された際に次のような自己修復機能を追加できます。

  • 異常値が発見された場合、影響範囲を調査し、データを修復。
  • 修復が難しい場合には、データセットを再取得してトレードロジックを再開。

実装のポイント

  • HasNan関数戻り値を定期的に監視し、異常値が検出された場合に例外処理を追加します。
  • 取引データやインジケータの計算前後で、HasNan関数を使用してデータの整合性を確認します。
  • NaNを含むデータの影響を最小限に抑えるために、エラーハンドリングを慎重に設計します。

タイトルとURLをコピーしました