# パラボリック Parabolic SAR # 引数 加速因子 最大加速因子 高値 安値 ($AF, $MaxAF, \@High, \@Low) # 戻り値 ParabolicSAR (@parabolic) sub PARABOLIC{ my ($AF, $MaxAF, $High, $Low) = @_; my @parabolic = (); my $StepAF = $AF; my $EP = 0; my $Long = 1; my $Short = 1; my $count = @$High - 1; # 加速因子, 配列数の確認 if(($AF < 0) || ($AF >= $MaxAF) || ($count < 0) || (@$High != @$Low)){ return 0; } # 計算 $parabolic[$count] = $$High[$count]; $EP = $$High[$count]; for(my $i = $count - 1; $i >= 0; $i--){ my $SAR = 0; # 上昇トレンド if(($parabolic[$i + 1] < $$Low[$i]) || (($Short == 1) && ($parabolic[$i + 1] <= $$High[$i]))){ if($Short == 1){ # トレンドの転換 Stop and Reversal $SAR = $EP; # 初期化 $EP = $$High[$i]; $AF = $StepAF; # Flag $Long = 1; $Short = 0; }else { # 最高値更新 if($EP < $$High[$i]){ # Extreme Price 極大値 $EP = $$High[$i]; # Acceleration Factor 加速因子 if($AF < $MaxAF){ $AF = $AF + $StepAF; $AF = $MaxAF if($AF > $MaxAF); } } # Stop and Reversal $SAR = $parabolic[$i + 1] + ($AF * ($EP - $parabolic[$i + 1])); } }else { # 下降トレンド if(($parabolic[$i + 1] > $$High[$i]) || (($Long == 1) && ($parabolic[$i + 1] >= $$Low[$i]))){ if($Long == 1){ # トレンドの転換 Stop and Reversal $SAR = $EP; # 初期化 $EP = $$Low[$i]; $AF = $StepAF; # Flag $Long = 0; $Short = 1; }else { # 最安値更新 if($EP > $$Low[$i]){ # Extreme Price 極大値 $EP = $$Low[$i]; # Acceleration Factor 加速因子 if($AF < $MaxAF){ $AF = $AF + $StepAF; $AF = $MaxAF if($AF > $MaxAF); } } # Stop and Reversal $SAR = $parabolic[$i + 1] + ($AF * ($EP - $parabolic[$i + 1])); } } } # パラボリック Parabolic SAR $parabolic[$i] = $SAR; } return @parabolic; }