恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

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