VLDMIの計算に必要なローソク足の本数
この記事は、先日の記事(2020年7月14日)に載せた修正版eVLDMI関数を前提にして書いています。
MT4用のインディケーター等を作成する場合、値の計算に必要なローソク足の本数を予め除外しますよね。たとえば、以下のコードにおける counted_bars をイメージしています。
[OnCalculate関数の中]
int counted_bars = indicatorcounted(); if(!counted_bars) counted_bars = 28; int limit = Bars - counted_bars; for(int i = limit - 1; i >= 0; i--){ [以下略]
コードの中にVLDMIを使用する場合、counted_bars に代入する本数は何本が良いのか考えた結果を、この記事にメモしておきます。
結論から書くと、以下の2つのうち大きい方です(各引数は、eVLDMI関数の引数を指しています)。
・引数2の2倍の本数 ・「引数3 + 引数4 - 2」の本数
コードに登場する引数は次のとおりです。
引数1 timeframe 時間軸(PERIOD_M5等) 引数2 base_period 基準期間 引数3 M_period 標準偏差を単純平均する期間 引数4 N_period 標準偏差計算期間 引数5 shift バーシフト
最大値になり得る本数
基本的に「最大値になり得る本数」を考えればいいので、候補となる本数は以下の2つです。
(1) base_period の2倍
(2) M_period + N_period - 2
(1)に関しては、コードの中でRSIの期間を「base_period の2分の1 ~ 2倍」になるように制御していることから導けます。
(2)に関しては、N日標準偏差とそのM日単純平均を計算する場合に必要な本数です。
計算必要本数(当日を除く) = M + N - 2
具体例で書いてみます。以下の例では N_period を N と略し、M_period を M と略しています。
N_period = 3 , M_period = 2 のケース
当日を T とすると、N = 3 は当日を含めて3本なので、以下のローソク足を使います。
2 1 T (当日の足のほかに、1本前と2本前)
次に、M = 2 という条件を加えると「当日から見たN日標準偏差」と「前日から見たN日標準偏差」を計算することになります。
当日から見たN日標準偏差を計算する場合に必要なローソク足は、Tを起点として3日分なので
2 1 T
前日から見たN日標準偏差を計算する場合に必要なローソク足は、T + 1 を起点として3日分なので
3 2 1 T
N_period = 4 , M_period = 3 のケース
N = 4 は当日を含めて4本なので、以下のローソク足を使います。
3 2 1 T
これに M = 3 という条件を加えると
起点が T の時 3 2 1 T 起点が T + 1 の時 4 3 2 1 T 起点が T + 2 の時 5 4 3 2 1 T
以上、2つのケースを見ましたが、いずれも以下のようになっています。
計算必要本数(当日を除く) = (N - 1) + (M - 1) = M + N - 2