|
■本プログラムはPerlで書かれているので、動かすにはPerlの環境が必要です。また、アルゴリズムの主要部分のみで、これだけでは動きません。
■特にご興味のある方、自分で動かしてみたいと思われる方は掲示板までどうぞ。
-----------------------------------------------------------------------
# 終値のn日平均を作成する。
sub smoothing{
$sub_av_n = $_[0];
$Av_end_Base=0;
for($i=0;$i<$sub_av_n;$i++){
$Av_end_Base+=$CSV_end{$i}/$sub_av_n;
}
for($i=0;$i<$sub_av_n;$i++){
$Av_end{$i}=$Av_end_Base;
}
for($i=$sub_av_n;$i<$nline;$i++){
$Av_end{$i}=$Av_end{$i-1};
$Av_end{$i}-=$CSV_end{$i-$sub_av_n}/$sub_av_n;
$Av_end{$i}+=$CSV_end{$i}/$sub_av_n;
# print "$CSV_end{$i}\t$Av_end{$i}\n";
}
}
# ピーク検出
sub get_Peak{
$npeak=0;
if(($refline ne "")&&($refline<$nline)){$nline=$refline}
for($i=$ikijun;$i<$nline;$i++){ # $nline-1 が今日
# ロスカットする
for($j=2;$j<=$npeak;$j++){
if($finish{$j} ne ""){next;}
if(($dir_peak{$j} eq "B")&&($CSV_end{$i} < &abs($trade{$j})*$LC1)){ # 買いの失敗
if($i==$nline-1){
print "$trade_date{$j}分買い失敗:明日の成り行きで売り注文\n";
}
else{
$dir_peak{$j}="BM";
$finish{$j}=$CSV_start{$i+1};
$finish_date{$j}=$date{$i+1};
if($i==$nline-2){
$profit=($finish{$j}+$trade{$j})*$unit;
print "$trade_date{$j}分買い失敗:成り行き売り完了 損益 $profit\n";
}
}
}
if(($dir_peak{$j} eq "T")&&(&abs($trade{$j}*$LC2) < $CSV_end{$i})){ # 売りの失敗
if($i==$nline-1){
print "$trade_date{$j}分空売り失敗:明日の成り行きで買戻し注文\n";
}
else{
$dir_peak{$j}="TM";
$finish{$j}=-$CSV_start{$i+1};
$finish_date{$j}=$date{$i+1};
if($i==$nline-2){
$profit=($finish{$j}+$trade{$j})*$unit;
print "$trade_date{$j}分空売り失敗:成り行き買戻し完了 損益 $profit\n";
}
}
}
}
if(($Av_end{$i-2}<$Av_end{$i-1})&&($Av_end{$i-1}>$Av_end{$i})){ # ピーク反転確認
if($npeak==0){
$npeak++;
$dir_peak{$npeak}="T"; # TOP
$Av_peak{$npeak}=$Av_end{$i-1};
$date_peak{$npeak}=$date{$i-1};
$nline_peak{$npeak}=$i;
# 最初はtradeはなし
}
else{ # TOP では売り
# 直前のボトムのピークとの差が指定割合より大きい場合ピークに指定
if(($Av_end{$i-1}-$Av_peak{$npeak})/($Av_end{$i-1}+$Av_peak{$npeak})>$th/2){
# 以前の仕掛りのうち、利益が出ているものをを翌日の始値で決済
for($j=2;$j<=$npeak;$j++){
if($finish{$j} ne ""){next;}
if(($dir_peak{$j} eq "B")&&(&abs($trade{$j})<=$CSV_end{$i})){ # 買いの終了
if($i==$nline-1){
print "$trade_date{$j}分買いを明日の成り行きで売り注文\n";
}
else{
$finish{$j}=$CSV_start{$i+1};
$finish_date{$j}=$date{$i+1};
if($i==$nline-2){
$profit=($finish{$j}+$trade{$j})*$unit;
print "$trade_date{$j}分買いの成り行き売り完了 損益 $profit\n";
}
}
}
if(($dir_peak{$j} eq "T")&&($CSV_end{$i}<=&abs($trade{$j}))){ # 売りの終了
if($i==$nline-1){
print "$trade_date{$j}分売りを明日の成り行きで買戻し注文\n";
}
else{
$finish{$j}=-$CSV_start{$i+1};
$finish_date{$j}=$date{$i+1};
if($i==$nline-2){
print "$trade_date{$j}分売りの成り行き買戻し完了\n";
}
}
}
}
if($i==$nline-1){
print "●トレンド検出●ピーク反転 明日 $CSV_end{$i} で新規空売り注文\n";
goto POS1;
}
if(($CSV_end{$i}<$CSV_max{$i+1})&&($CSV_min{$i+1}<$CSV_end{$i})){;}
else{
if($i==$nline-2){
print "ピーク反転 $date{$i+1} $CSV_end{$i} で新規空売りならず\n";
}
goto POS1;
}
$npeak++;
$dir_peak{$npeak}="T"; # TOP
$Av_peak{$npeak}=$Av_end{$i-1};
$date_peak{$npeak}=$date{$i-1};
$nline_peak{$npeak}=$i-1;
$trade{$npeak}=$CSV_end{$i}; # 売り:指値の場合
$trade_date{$npeak}=$date{$i+1};
if($i==$nline-2){
print "ピーク反転 $date{$i+1} $CSV_end{$i} で新規空売り注文完了\n";
}
POS1:
}
}
}
if(($Av_end{$i-2}>$Av_end{$i-1})&&($Av_end{$i-1}<$Av_end{$i})){ # BOTTOM
if($npeak==0){
$npeak++;
$dir_peak{$npeak}="B";
$date_peak{$npeak}=$date{$i-1};
$nline_peak{$npeak}=$i-1;
# 最初はtradeはなし
}
else{ # BOTTOM では買い
if(($Av_peak{$npeak}-$Av_end{$i-1})/($Av_end{$i-1}+$Av_peak{$npeak})>$th/2){
# 以前の仕掛りのうち、利益が出ているものをを翌日の始値で決済
for($j=2;$j<=$npeak;$j++){
if($finish{$j} ne ""){next;}
if(($dir_peak{$j} eq "B")&&(&abs($trade{$j})<=$CSV_end{$i})){ # 買いの終了
if($i==$nline-1){
print "$trade_date{$j}分買い決済:明日の成り行きで売り注文\n";
}
else{
$finish{$j}=$CSV_start{$i+1};
$finish_date{$j}=$date{$i+1};
if($i==$nline-2){
$profit=($finish{$j}+$trade{$j})*$unit;
print "$trade_date{$j}分買い決済:成り行き売り完了 損益 $profit\n";
}
}
}
if(($dir_peak{$j} eq "T")&&($CSV_end{$i}<=&abs($trade{$j}))){ # 売りの終了
if($i==$nline-1){
print "$trade_date{$j}分売り決済:翌日の成り行きで買戻し注文\n";
}
else{
$finish{$j}=-$CSV_start{$i+1};
$finish_date{$j}=$date{$i+1};
if($i==$nline-2){
$profit=($finish{$j}+$trade{$j})*$unit;
print "$trade_date{$j}分売り決済:成り行き買戻し完了 損益 $profit\n";
}
}
}
}
if($i==$nline-1){
print "●トレンド検出●ボトム反転 明日 $CSV_end{$i} で新規買い注文\n";
goto POS2;
}
if(($CSV_end{$i}<$CSV_max{$i+1})&&($CSV_min{$i+1}<$CSV_end{$i})){;}
else{
if($i==$nline-2){
print "ボトム反転 $date{$i+1} $CSV_end{$i} で新規買い注文ならず\n";
}
goto POS2;
}
$npeak++;
$dir_peak{$npeak}="B"; # BOTTOM
$Av_peak{$npeak}=$Av_end{$i-1};
$date_peak{$npeak}=$date{$i-1};
$nline_peak{$npeak}=$i-1;
$trade{$npeak}=-$CSV_end{$i}; # 買い:指値の場合
$trade_date{$npeak}=$date{$i+1};
if($i==$nline-2){
print "ボトム反転 $date{$i+1} $CSV_end{$i} で新規買い注文完了\n";
}
POS2:
}
}
}
}
$nline_peak{0}=0;
$Total_profit=0;
for($i=2;$i<=$npeak;$i++){
if($refline==9999){
if($finish{$i} eq ""){next;}
}else{
# if($finish{$i} ne ""){next;}
next;
}
$era=$nline_peak{$i}-$nline_peak{$i-1};
$profit=$trade{$i}+$finish{$i};
$Total_profit+=$profit;
printf "%s\t%s\t%6d\t%6d\t%6d\t%6d\t",
$date_peak{$i},$dir_peak{$i},$Av_peak{$i},$trade{$i},$finish{$i},$profit;
print "$trade_date{$i}\t$finish_date{$i}\t$era\n";
}
if($refline==9999){print "Total_profit $Total_profit\n";}
}
# 絶対値。
sub abs{
$in = $_[0];
if($in<0){return($in*(-1));}
else{return($in);}
}
|
|
|