FC2ブログ
最初
http://blog-imgs-36.fc2.com/a/m/a/amamiyaprog/PointandFigure1.txt

修正1
http://blog-imgs-36.fc2.com/a/m/a/amamiyaprog/PointandFigure2.txt

修正2 3/23

# ポイント&フィギュア チャート Point and Figure Chart
# 引数 値幅 値 ($PriceRange, \@Price)
# 戻り値 PointandFigureChart (@PointAndFigureChart)
sub POINTANDFIGURECHART{
my ($PriceRange, $Price) = @_;
my @PointAndFigureChart = ();
my %TempPointAndFigureChart = ();
my $TempHigh = 0;
my $TempLow = 0;
my $PrevTempHigh = 0;
my $PrevTempLow = 0;
my $Highest = 0;
my $Lowest = 0;
my $Reverse = 3;
my $Up = 1;
my $Down = 1;
my $Check = 0;
my $Number = 0;
my $count = @$Price - 1;

# 値幅と配列数の確認
if(($PriceRange <= 0) || ($count < 0)){
return 0;
}

# 計算
$TempHigh = $PrevTempHigh = $Highest = int($$Price[$count] / $PriceRange) * $PriceRange;
$TempLow = $PrevTempLow = $Lowest = int($$Price[$count] / $PriceRange) * $PriceRange;
for(my $i = $count - 1; $i >= 0; $i--){
if($Up == 1){
if(($TempHigh - ($PriceRange * ($Reverse + 1))) >= $$Price[$i]){
# トレンドの変化 陰転
$PrevTempHigh = $TempHigh - $PriceRange;
$TempLow = (int($$Price[$i] / $PriceRange) * $PriceRange);
# 同値でないならば、値幅を足す
$TempLow = $TempLow + $PriceRange if($TempLow < $$Price[$i]);
# Flag
$Check = 1;
}else {
# 高値更新
if(($TempHigh + $PriceRange) < $$Price[$i]){
$TempHigh = (int($$Price[$i] / $PriceRange) * $PriceRange);
}
}
}else {
if($Down == 1){
if(($TempLow + ($PriceRange * ($Reverse + 1))) <= $$Price[$i]){
# トレンドの変化 陽転
$PrevTempLow = $TempLow + $PriceRange;
$TempHigh = (int($$Price[$i] / $PriceRange) * $PriceRange);
# Flag
$Check = 1;
}else {
# 安値更新
if(($TempLow - $PriceRange) > $$Price[$i]){
$TempLow = (int($$Price[$i] / $PriceRange) * $PriceRange);
# 同値でないならば、値幅を足す
$TempLow = $TempLow + $PriceRange if($TempLow < $$Price[$i]);
}
}
}
}

# 非時系列
if(($Check == 1) || ($i == 0)){
# ポイント&フィギュア Point and Figure
if($Up == 1){
$TempPointAndFigureChart{'high'}->[$Number] = $TempHigh;
$TempPointAndFigureChart{'low'}->[$Number] = $PrevTempLow;
$TempPointAndFigureChart{'flag'}->[$Number] = 1;
# 下降トレンドに転換
# Flag
$Up = 0;
$Down = 1;
# 最高値
$Highest = $TempHigh if($Highest < $TempHigh);
}else {
if($Down == 1){
$TempPointAndFigureChart{'high'}->[$Number] = $PrevTempHigh;
$TempPointAndFigureChart{'low'}->[$Number] = $TempLow;
$TempPointAndFigureChart{'flag'}->[$Number] = -1;
# 上昇トレンドに転換
# Flag
$Up = 1;
$Down = 0;
# 最安値
$Lowest = $TempLow if($Lowest > $TempLow);
}
}

$Number++;
$Check = 0;
}
}

# UP = O DOWN = X
# ポイント&フィギュア チャート Point and Figure Chart
my $Range = ($Highest - $Lowest) / $PriceRange;
for(my $i = 0; $i < $Number; $i++){
my $high = $TempPointAndFigureChart{'high'}->[$i];
my $low = $TempPointAndFigureChart{'low'}->[$i];
my $flag = $TempPointAndFigureChart{'flag'}->[$i];

for(my $j = 0; $j <= $Range; $j++){
my $p = $Highest - ($PriceRange * $j);

if(($low <= $p) && ($p <= $high)){
if($flag == 1){
# UP = X
$PointAndFigureChart[$j] .= "X";
}elsif ($flag == -1){
# DOWN = O
$PointAndFigureChart[$j] .= "O";
}
}else {
# Flagが無いなら空白
$PointAndFigureChart[$j] .= " ";
}
}
}

# 右端に価格帯をつける
for(my $i = 0; $i <= $Range; $i++){
my $p = $Highest - ($PriceRange * $i);

$PointAndFigureChart[$i] .= "\t$p";
}

return @PointAndFigureChart;
}

サンプル

X 93.5
XO 93.4
XO 93.3
XO 93.2
X XO 93.1
XO XO 93
XO XOX 92.9
XO XOXO 92.8
XO XOXO 92.7
X XOX XOXO 92.6
XOXOXOXOXO 92.5
XOXOXOXO O 92.4
XOXOXOX O 92.3
XOXOXO O 92.2
XO OX O 92.1
X OX O 92
X OX OX 91.9
X X OX OXO 91.8
XOX OX OXOX 91.7
XOX OX OXOXO 91.6
XOX OX OXOXO 91.5
XOX O OXOXO 91.4
XOX OXOXO 91.3
XO OXOXO 91.2
X OXOXO X 91.1
X OXOXO XO 91
X OXOXO XO 90.9
X O OXO X X XO 90.8
X X OXO XOXOXO 90.7
XOX OXO XOXOXO 90.6
XOX OXO XOXOXO 90.5
XOX O OX X X XOXOXO 90.4
X XO OXOXOXOXOXOXO 90.3
XOX OXOXOXOXOXO O X 90.2
XOX OXOXOXOXO O X 90.1
XOX OXOXOXOX O X 90
XOX O O OXOX O X 89.9
XOX OXO O X 89.8
XOX OX O X 89.7
OX OX OX X 89.6
OX OX OXOX 89.5
O OX OXOX 89.4
OX OXOX 89.3
O OXOX 89.2
OXO 89.1
O 89


データのみ

# ポイント&フィギュア Point and Figure
# 引数 値幅 値 ($PriceRange, \@Price)
# 戻り値 hash {'high'} {'middle'} {'low'} {'count'} (%PointAndFigure)
sub POINTANDFIGURE{
my ($PriceRange, $Price) = @_;
my %PointAndFigure = ();
my %TempPointAndFigure = ();
my $TempHigh = 0;
my $TempLow = 0;
my $PrevTempHigh = 0;
my $PrevTempLow = 0;
my $Reverse = 3;
my $Up = 1;
my $Down = 1;
my $Check = 0;
my $Number = 0;
my $count = @$Price - 1;

# 値幅と配列数の確認
if(($PriceRange <= 0) || ($count < 0)){
return 0;
}

# 計算
$TempHigh = $PrevTempHigh = int($$Price[$count] / $PriceRange) * $PriceRange;
$TempLow = $PrevTempLow = int($$Price[$count] / $PriceRange) * $PriceRange;
for(my $i = $count - 1; $i >= 0; $i--){
if($Up == 1){
if(($TempHigh - ($PriceRange * ($Reverse + 1))) >= $$Price[$i]){
# トレンドの変化 陰転
$PrevTempHigh = $TempHigh - $PriceRange;
$TempLow = (int($$Price[$i] / $PriceRange) * $PriceRange);
# 同値でないならば、値幅を足す
$TempLow = $TempLow + $PriceRange if($TempLow < $$Price[$i]);
# Flag
$Check = 1;
}else {
# 高値更新
if(($TempHigh + $PriceRange) < $$Price[$i]){
$TempHigh = (int($$Price[$i] / $PriceRange) * $PriceRange);
}
}
}else {
if($Down == 1){
if(($TempLow + ($PriceRange * ($Reverse + 1))) <= $$Price[$i]){
# トレンドの変化 陽転
$PrevTempLow = $TempLow + $PriceRange;
$TempHigh = (int($$Price[$i] / $PriceRange) * $PriceRange);
# Flag
$Check = 1;
}else {
# 安値更新
if(($TempLow - $PriceRange) > $$Price[$i]){
$TempLow = (int($$Price[$i] / $PriceRange) * $PriceRange);
# 同値でないならば、値幅を足す
$TempLow = $TempLow + $PriceRange if($TempLow < $$Price[$i]);
}
}
}
}

# 非時系列
if(($Check == 1) || ($i == 0)){
# ポイント&フィギュア Point and Figure
if($Up == 1){
$TempPointAndFigure{'high'}->[$Number] = $TempHigh;
$TempPointAndFigure{'low'}->[$Number] = $PrevTempLow;
# 下降トレンドに転換
# Flag
$Up = 0;
$Down = 1;
}else {
if($Down == 1){
$TempPointAndFigure{'high'}->[$Number] = $PrevTempHigh;
$TempPointAndFigure{'low'}->[$Number] = $TempLow;
# 上昇トレンドに転換
# Flag
$Up = 1;
$Down = 0;
}
}

$Number++;
$Check = 0;
}
}

# 先頭を最新にする
$PointAndFigure{'count'} = $Number - 1;
for(my $i = 0; $i < $Number; $i++){
$PointAndFigure{'high'}->[$i] = $TempPointAndFigure{'high'}->[$Number - ($i + 1)];
$PointAndFigure{'low'}->[$i] = $TempPointAndFigure{'low'}->[$Number - ($i + 1)];
}

return %PointAndFigure;
}


参考URL
P&F(ポイント&フィギュア)-テクニカル分析指標解説
川口一晃 基礎から学ぶテクニカル教室 「21.ポイント&フィギュア」

修正1
どうしてそうなるかわからないが、前後の高値が同値になることがあるので、最初に高値から値幅を引いておく。

修正2
< を <= に直した
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

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

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

検索フォーム


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