# パラボリック 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 $Check = 0; my $PrevSAR = 0; my $count = @$High - 1; # 加速因子, 配列数の確認 if(($AF < 0) || ($AF >= $MaxAF) || ($count < 0) || (@$High != @$Low)){ return 0; } # 計算 $EP = $$High[$count]; $PrevSAR = $$High[$count]; for(my $i = $count - 1; $i >= 0; $i--){ my $SAR = 0; # 上昇トレンド if($Long == 1){ if($Check == 1){ # トレンドの転換 Stop and Reversal $SAR = $EP; # 初期化 $EP = $$High[$i + 1]; $AF = $StepAF; # Flag $Long = 1; $Short = 0; $Check = 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 = $PrevSAR + ($AF * ($EP - $PrevSAR)); } # 交差してたらトレンドの転換 if($$Low[$i] <= $SAR){ $Long = 0; $Short = 1; $Check = 1; } }else { # 下降トレンド if($Short == 1){ if($Check == 1){ # トレンドの転換 Stop and Reversal $SAR = $EP; # 初期化 $EP = $$Low[$i + 1]; $AF = $StepAF; # Flag $Long = 0; $Short = 1; $Check = 0; }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 = $PrevSAR + ($AF * ($EP - $PrevSAR)); } } # 交差してたらトレンドの転換 if($SAR <= $$High[$i]){ $Long = 1; $Short = 0; $Check = 1; } } $PrevSAR = $SAR; # パラボリック Parabolic SAR $parabolic[$i] = $SAR; } return @parabolic; }