FC2ブログ

# Moving Average Convergence Divergence
# 引数 期間 期間 期間 値 ($ShortPeriod, $LongPeriod, $SignalPeriod, \@Price)
# 戻り値 hash {'macd'} {'signal'} {'osci'} (@macd)
sub MACD{
my ($ShortPeriod, $LongPeriod, $SignalPeriod, $Price) = @_;
($ShortPeriod, $LongPeriod) = ($LongPeriod, $ShortPeriod) if($ShortPeriod > $LongPeriod);
my %macd = ();
my @shortema = ();
my @longema = ();
my $shortalpha = 2 / ($ShortPeriod + 1);
my $longalpha = 2 / ($LongPeriod + 1);
my $count = @$Price - $LongPeriod;

# 期間と配列数の確認
if(($ShortPeriod <= 0) || ($LongPeriod <= 0) || ($SignalPeriod <= 0) || (($count - 1) < 0)){
return 0;
}

# ShortEMA
for(my $i = @$Price - $ShortPeriod; $i >= $count; $i--){
my $ avg = 0;
if($i == (@$Price - $ShortPeriod)){
for(my $j = 0; $j < $ShortPeriod; $j++){
$avg += $$Price[$i + $j];
}
$avg = $avg / $ShortPeriod;
}else {
$avg = $shortema[$i + 1] + ($shortalpha * ($$Price[$i] - $shortema[$i + 1]))
}
$shortema[$i] = $avg;
}
# LongEMA
for(my $i = 0; $i < $LongPeriod; $i++){
$longema[$count] += $$Price[$count + $i];
}
$longema[$count] = $longema[$count] / $LongPeriod;

# 計算
for(my $i = $count - 1; $i >= 0; $i--){
# ShortEMA
$shortema[$i] = $shortema[$i + 1] + ($shortalpha * ($$Price[$i] - $shortema[$i + 1]));
# LongEMA
$longema[$i] = $longema[$i + 1] + ($longalpha * ($$Price[$i] - $longema[$i + 1]));

# Moving Average Convergence Divergence
$macd{'macd'}->[$i] = $shortema[$i] - $longema[$i];

# MACD Signal
if($i <= ($count - $SignalPeriod)){
my $avg = 0;
for(my $j = 0; $j < $SignalPeriod; $j++){
$avg += $macd{'macd'}->[$i + $j];
}
$avg = $avg / $SignalPeriod;

$macd{'signal'}->[$i] = $avg;

# MACD OSCI
$macd{'osci'}->[$i] = $macd{'macd'}->[$i] - $macd{'signal'}->[$i];
}
}

return %macd;
}


参考URL
テクニカル分析│MACD (Moving Average Convergence Divergence) 考案者:ジェラルド・アペル(Gerald Appel) 1970年代
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

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

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

検索フォーム


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