#!/usr/bin/env perl
$| = 1;
# perl modules
use strict;
use warnings;
use Data::Dumper;
use Getopt::Long;
use Storable;
use List::Util qw/max min/;
do 'sub.pm';
################################################################################
# 常数
################################################################################
##kdj
#my $kdj_n =9;
#my $kdj_m1 = 3;
################################################################################
# read file
################################################################################
my ($gdk,$yyx,$oco)=@ARGV;
print "$gdk,$yyx,$oco\n";
my @test = qw(000011 002787);
my @list = <g:/zxzq/T0002/export/*.txt>;
#my $dir = "g:/zxzq/T0002/export/";
my %hash;
my %okay;
my %times;
my %win;
my %hash_nt;
for my $file (@list){
# print"$file\n";
my $name;
$file =~ m/export\/(\d+)\.txt/;
$name = $1;
# print"name is $name\n";
open IN, "$file" or die "connot read file $file\n";
#base
my @o;
my @c;
my @h;
my @l;
my @time;
my @ma3; ##low
my @ma5; #c
my @temp;
my @ma20; ##temp
my @v3;
my @rate;
my @flag;
my @flag_buy;
my $j = 0;
#kdj
while (<IN>){
next unless m/^20/;
my $line = $_;
my @a = split/\s+/,$line;
($time[$j],
$o[$j],
$h[$j],
$l[$j],
$c[$j]) = @a;
## wzwgs
$ma3[$j] = ma(3,$j,\@l);
$ma5[$j] = ma(5,$j,\@c);
$temp[$j] = ($h[$j] + $l[$j] + 2*$c[$j])/4;
$ma20[$j] = ma(20,$j,\@temp);
$v3[$j] = 91.1 - 100*$ma3[$j]/$ma20[$j];
$rate[$j] = ($v3[$j]>0) ? 1 : 0;
if($j>1)
{
$flag[$j] = (($rate[$j-1]>0)&&($rate[$j]==0)) ? 1 : 0;
}
if($j>4){
$flag_buy[$j] = (($flag[$j-2]==1 || $flag[$j-1]==1 || $flag[$j]==1) && ($c[$j]<$c[$j-1]) && ($ma5[$j]>$ma5[$j-1])) ? 1 : 0;
$flag_buy[$j] = (($flag_buy[$j-2]==1 || $flag_buy[$j-1]==1 || $flag_buy[$j-3]==1)) ? 0 : $flag_buy[$j];
}
else{
$flag_buy[$j]=0;
}
$j++;
}
close IN;
my $ii = @c;
## begin to search
my $aim;
for my $i (10..$ii-25){
if($flag_buy[$i]){
#print" $name at $time[$i]: flag buy is high\n";
next if($h[$i+1]==$l[$i+1]);
##高低开盘
next if(($gdk==1)&&($o[$i+1]<=$c[$i]));
next if(($gdk==0)&&($o[$i+1]>$c[$i]));
##阴阳线
next if(($yyx==1)&&($o[$i+1]<=$c[$i+1]));
next if(($yyx==0)&&($o[$i+1]>$c[$i+1]));
## buy price at open, and then scan
my $bp;
if($oco==1){ $bp = $o[$i+1];}
elsif($oco==2){ $bp = $c[$i+1];}
else{ $bp = $o[$i+2];}
for my $a (5..60){ ## aim of the ratio
my $aim =$a/100;
my $ap = $bp*(1+$aim); ## aim price
my $sp = 0; ##sale price
for my $day (1..20){ ## the day keep the stock
my $success = 0;
my $key="aim"."$a"."day"."$day";
for my $scan (1..$day){
my $rscan = ($oco==0) ? $scan+1 : $scan;
if($h[$i+1+$rscan]>=$ap){ ## got the aim
$success = 1;
$okay{$key}++;
last;
}
}
$sp = $success ? $ap : $c[$i+1+$day];
my $ratio = $success ? $aim : (($sp-$bp)/$bp);
$hash{$key} += $ratio/($day+1);
$times{$key} ++;
$win{$key} ++ if($sp>$bp);
#push(@$hash{$key},$ratio);
my $name_time = "$time[$i]"."__$name";
#if($success){print"$key\n";}
#push(@$hash_nt{$key},$name_time);
}
}
}
}
}
my %rst;
my %win_rate;
for my $key (keys %hash){
# my @array;
# @array = @$hash{$key};
# my $tot = @array;
# my $sum = 0;
# for my $i (0..@tot-1){
# $sum += $array[$i];
# }
# my $ave = $sum/$tot;
my $ave = $hash{$key}/$times{$key};
$rst{$key} = $ave;
my $r = $win{$key}/$times{$key};
$win_rate{$key} = $r;
}
open OUT,">result_$gdk$yyx$oco.txt";
my @keys = sort{$rst{$b} <=> $rst{$a}} keys %rst;
for my $key (@keys){
printf OUT "%-20s%10.4f%10d%10d%10.2f\n",
$key,$rst{$key},$times{$key},$okay{$key},$win_rate{$key};
}
close OUT;