# 練行足 練り足 Renko Adaptive Indicator # 引数 値幅 値 ($PriceRange, \@Price) # 戻り値 hash {'high'} {'low'} {'flag'} (%rai) sub RAI{ my ($PriceRange, $Price) = @_; my %rai = (); my $Reverse = $PriceRange * 2; my $Up = 1; my $Down = 1; my $count = @$Price - 1; # 値幅と配列数の確認 if(($PriceRange <= 0) || ($count < 0)){ return 0; } # 計算 my $TempHigh = int($$Price[$count] / $PriceRange) * $PriceRange; my $TempLow = $TempHigh; for(my $i = $count; $i >= 0; $i--){ my $ReverseFalg = 0; if($Up == 1){ $TempLow = $TempHigh - $PriceRange if(($TempHigh - $TempLow) != $PriceRange); if(($TempHigh - $Reverse) >= $$Price[$i]){ # トレンドの変化 陰転 $TempHigh = $TempHigh - $PriceRange; $TempLow = (int($$Price[$i] / $PriceRange) * $PriceRange); # 同値でないならば、値幅を足す $TempLow = $TempLow + $PriceRange if($TempLow < $$Price[$i]); # Flag $Up = 0; $Down = 1; $ReverseFalg = -1; }else { # 高値更新 if(($TempHigh + $PriceRange) <= $$Price[$i]){ $TempLow = $TempHigh; $TempHigh = $TempHigh + $PriceRange; } } }else { if($Down == 1){ $TempHigh = $TempLow + $PriceRange if(($TempHigh - $TempLow) != $PriceRange); if(($TempLow + $Reverse) <= $$Price[$i]){ # トレンドの変化 陽転 $TempLow = $TempLow + $PriceRange; $TempHigh = (int($$Price[$i] / $PriceRange) * $PriceRange); # Flag $Up = 1; $Down = 0; $ReverseFalg = 1; }else { # 安値更新 if(($TempLow - $PriceRange) >= $$Price[$i]){ $TempHigh = $TempLow; $TempLow = $TempLow - $PriceRange; } } } } # 時系列 # 練行足 練り足 Renko Adaptive Indicator $rai{'high'}->[$i] = $TempHigh; $rai{'low'}->[$i] = $TempLow; $rai{'flag'}->[$i] = $ReverseFalg; } return %rai; }