FC2ブログ
3/4 最初
http://blog-imgs-36.fc2.com/a/m/a/amamiyaprog/ParabolicSAR1.txt
3/5 修正1
http://blog-imgs-36.fc2.com/a/m/a/amamiyaprog/ParabolicSAR2.txt
3/5 修正2
http://blog-imgs-36.fc2.com/a/m/a/amamiyaprog/ParabolicSAR3.txt
3/6 修正3

# パラボリック 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 $PriceCheck = 0;
my $PrevEP = 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){
# Flag
$Long = 1;
$Short = 0;
$Check = 0;
$PriceCheck = ($EP == $$Low[$i + 1] ? 1 : 0);
# 初期化
$EP = $$High[$i + 1];
$PrevEP = $EP;
$AF = $StepAF;
}else {
# 最高値更新
if($EP < $$High[$i]){
# Extreme Price 極大値
$PrevEP = $EP;
$EP = $$High[$i];
# Acceleration Factor 加速因子
if($AF < $MaxAF){
$AF = $AF + $StepAF;
$AF = $MaxAF if($AF > $MaxAF);
}
}
}

# Stop and Reversal
if($PriceCheck == 1){
# トレンドの転換時の極大値 = 一つ前の安値
$SAR = $$Low[$i + 1];
# Flag
$PriceCheck = 0;
}else {
$SAR = $PrevSAR + ($AF * ($EP - $PrevSAR));
}

# 交差してたら下降トレンドに転換
if($$Low[$i] <= $SAR){
# Stop and Reversal 極大値 = 最新の高値 なら前回の最高値を使用する
$SAR = ($EP != $$High[$i] ? $EP : $PrevEP);
# Flag
$Long = 0;
$Short = 1;
$Check = 1;
}
}else {
# 下降トレンド
if($Short == 1){
if($Check == 1){
# Flag
$Long = 0;
$Short = 1;
$Check = 0;
$PriceCheck = ($EP == $$High[$i + 1] ? 1 : 0);
# 初期化
$EP = $$Low[$i + 1];
$PrevEP = $EP;
$AF = $StepAF;
}else {
# 最安値更新
if($EP > $$Low[$i]){
# Extreme Price 極大値
$PrevEP = $EP;
$EP = $$Low[$i];
# Acceleration Factor 加速因子
if($AF < $MaxAF){
$AF = $AF + $StepAF;
$AF = $MaxAF if($AF > $MaxAF);
}
}
}
}

# Stop and Reversal
if($PriceCheck == 1){
# トレンドの転換時の極大値 = 一つ前の高値
$SAR = $$High[$i + 1];
# Flag
$PriceCheck = 0;
}else {
$SAR = $PrevSAR + ($AF * ($EP - $PrevSAR));
}

# 交差してたら上昇トレンドに転換
if($SAR <= $$High[$i]){
# Stop and Reversal 極大値 = 最新の安値 なら前回の最安値を使用する
$SAR = ($EP != $$Low[$i] ? $EP : $PrevEP);
$PrevEP = 0;
# Flag
$Long = 1;
$Short = 0;
$Check = 1;
}
}

# 一つ前のParabolic SAR
$PrevSAR = $SAR;

# パラボリック Parabolic SAR
$parabolic[$i] = $SAR;
}

return @parabolic;
}

参考URL
パラボリック (Parabolic Time Price System)

メモ
1 2周目以降値が同じくなるので買い持ち・売り持ちのどちらから始めてもかまわない
2 $EPの初期値は、接触した地点の高値・安値を使用するので1つ後ろにずらす

一言
トレンドが転換した時に値に対しパラボリックの位置が上下逆になるバグがある

追記 3/5 その1
ましになったかな?

追記 3/5 その2
やっとメタトレーダーと同じ感じになった
いまわかっている残りの問題はパラボリックが接触した地点で最高値・最安値を付けた場合同値になるのみ
(($$Low[$i] <= $SAR) && ($EP != $$High[$i])) (($SAR <= $$High[$i]) && ($EP != $$Low[$i]))と置き換えれば良いのかな?

追記 3/6
トレンドが転換した地点で最高値・最安値を付けた場合に対応
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

Author:雨宮
Firefoxを使用しているので気づかなかったけど、IE6でソースコードを上手くコピーできない

5/3
携帯用ならIE6でもソースコードをコピーできる
携帯用

検索フォーム


あわせて読みたいブログパーツ
一寸先は闇 RSS