# 練行足 練り足 Renko Ashi Neri Ashi # 引数 値幅 値 ($PriceRange, \@Price) # 戻り値 hash {'high'} {'low'} (%renko) sub RENKO{ my ($PriceRange, $Price) = @_; my %renko = (); my @PriceRangeHigh = (); my @PriceRangeLow = (); my $Reverse = $PriceRange * 2; my $Up = 1; my $Down = 1; my $Check = 0; my $Number = 0; 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--){ if($Up == 1){ 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; $Check = 1; }else { # 高値更新 if(($TempHigh + $PriceRange) <= $$Price[$i]){ $TempLow = $TempHigh; $TempHigh = $TempHigh + $PriceRange; # Flag $Check = 1; } } }else { if($Down == 1){ if(($TempLow + $Reverse) <= $$Price[$i]){ # トレンドの変化 陽転 $TempLow = $TempLow + $PriceRange; $TempHigh = (int($$Price[$i] / $PriceRange) * $PriceRange); # Flag $Up = 1; $Down = 0; $Check = 1; }else { # 安値更新 if(($TempLow - $PriceRange) >= $$Price[$i]){ $TempHigh = $TempLow; $TempLow = $TempLow - $PriceRange; # Flag $Check = 1; } } } } # 非時系列 if($Check == 1){ # 値動きが値幅の2倍以上動いた場合 my $limit = ($TempHigh - $TempLow) / $PriceRange; my $j = 0; while($j < $limit){ if($Up == 1){ $PriceRangeHigh[$Number] = $TempLow + (($j + 1) * $PriceRange); $PriceRangeLow[$Number] = $TempLow + ($j * $PriceRange); }else { if($Down == 1){ $PriceRangeHigh[$Number] = $TempHigh - ($j * $PriceRange); $PriceRangeLow[$Number] = $TempHigh - (($j + 1) * $PriceRange); } } $Number++; $j++; } # Flag $Check = 0; } } # 先頭を最新にする for(my $i = 0; $i < $Number; $i++){ # 練行足 練り足 Renko Adaptive Indicator $renko{'high'}->[$i] = $PriceRangeHigh[$Number - ($i + 1)]; $renko{'low'}->[$i] = $PriceRangeLow[$Number - ($i + 1)]; } return %renko; }