# クオンティテイティブ・クオリテイティブ・エスティメイション Qualitative Quantitative Estimation # 引数 期間 期間 因子 値 ($Period, $SmoothFactor, $Factor, \@Price) # 戻り値 QQE (@QualitativeQuantitativeEstimation) sub QQE{ my ($Period, $SmoothFactor, $Factor, $Price) = @_; my @QualitativeQuantitativeEstimation = (); my @Rsi = (); my @RsiSF = (); my @RsiSFMA = (); my @RsiAbs = (); my @RsiAbsEma = (); my $QQE = 0; my $PrevQQE = 0; my $Period2 = (2 * $Period) - 1; my $Loop = @$Price - (($Period + $SmoothFactor) + 1); my $count = @$Price - ($Period + $Period2 + $SmoothFactor + 1); # 期間と配列数の確認 if(($Period <= 0) || ($count < 0)){ return 0; } # 計算 @Rsi = &RSI($Period, $Price); @RsiSF = &EMA($SmoothFactor, \@Rsi); @RsiSFMA = &EMA($Period2, \@RsiSF); $RsiAbs[$Loop] = abs($RsiSF[$Loop] - $RsiSF[$Loop + 1]) while($Loop-- >= 0); @RsiAbsEma = &EMA($Period2, \@RsiAbs); for(my $i = $count; $i >= 0; $i--){ $QQE = 0; if($RsiSF[$i] < $PrevQQE){ if(($RsiSF[$i + 1] < $PrevQQE) && ($PrevQQE < ($RsiSF[$i] + ($RsiAbsEma[$i] * $Factor)))){ $QQE = $PrevQQE; }else { $QQE = $RsiSF[$i] + ($RsiAbsEma[$i] * $Factor); } }else { if(($PrevQQE < $RsiSF[$i + 1]) && (($RsiSF[$i] - ($RsiAbsEma[$i] * $Factor)) < $PrevQQE)){ $QQE = $PrevQQE; }else { $QQE = $RsiSF[$i] - ($RsiAbsEma[$i] * $Factor); } } # クオンティテイティブ・クオリテイティブ・エスティメイション Qualitative Quantitative Estimation $QualitativeQuantitativeEstimation[$i] = $QQE; # 一つ前 $PrevQQE = $QQE } return @QualitativeQuantitativeEstimation; }