用我的系统测试了一下,结果见http://itfin.afraid.org/tmp/backtest.html,具体代码为: $global->{Cache}{signalfactory}{'ybgl'}=Finance::Trade::SignalFactory->new(name=>'ybgl',type_id=>1,depends=>['high','low','close'], expr=>'lift=function(x,n){c(rep(NA,n),x[1length(x)-n)])}; window=function(x,f,n){running(x,fun=f,width=n,align=\"right\",allow.fewer=FALSE,pad=TRUE,simplify=TRUE)}; close1=lift(close,1);tr=lift(pmax(high-low,abs(close1-high),abs(close1-low)),d_lag);atr=filter(tr,rep(1,d_ma)/d_ma,method=\"convolution\",sides=1); hh=lift(window(high,max,d_win),1);ll=lift(window(low,min,d_win),1); r=rep(0,length(close));r[which(close>hh & tr>=fac*atr)]=1;r[which(close<ll & tr>=fac*atr)]=-1;r', para=>[{-name=>'d_lag',-type=>'I'},{-name=>'d_win',-type=>'I'},{-name=>'d_ma',-type=>'I'},{-name=>'fac',-type=>'F'}], defaultpara=>[3,7,20,2.],Global=>$global); sub ybglStrategy { my ($targetmap,$account,$date,$sigmap,$delta)=@_; return if !defined($sigmap); my $portfolio=$account->getPortfolio($date); for my $tid(@$targetmap){ my $tradable=$account->{Global}{Cache}{tradable}{$tid}; if($portfolio->Asset($tid)>0){ if($tradable->getLow($date)<$tradable->{stoploss}){ push(@$delta,{tid=>$tid,percentage=>0,price=>$tradable->{stoploss},tag=>'stoploss'}); last; }elsif(any (map {$_<0} values(%{$sigmap->{$tid}}))){ push(@$delta,{tid=>$tid,percentage=>0,tag=>'signalsell'}); last; }else{ $tradable->{stoploss}+=max($tradable->getPrice($date)-$tradable->getPrice($date,-1),0); if(($tradable->getPrice($date)-$tradable->{buyprice})>=($tradable->{buy_count}*1.5*$tradable->{maxloss})){ $tradable->{buy_count}++; push(@$delta,{tid=>$tid,percentage=>min($tradable->{buy_count}*$tradable->{position_percentage},0.98),tag=>'positionadjust'}); }else{} } }else{ if(all(map {$_>0} values(%{$sigmap->{$tid}}))){ if(!$portfolio->RiskAssetCount()){ $tradable->{buyprice}=$tradable->getPrice($date); $tradable->{stoploss}=min(map {$tradable->getLow($date,$_)} (-7..-1)); $tradable->{maxloss}=$tradable->{buyprice}-$tradable->{stoploss}; $tradable->{buy_count}=1; $tradable->{position_percentage}=0.03*$tradable->{buyprice}/$tradable->{maxloss}; push(@$delta,{tid=>$tid,percentage=>$tradable->{position_percentage},tag=>'signalbuy'}); last; }else{} }else{} } } } $engine->backtestTS('ybgl(3,7,20,2.)-main::ybglStrategy,20000101,20050601') 另外把这个系统加到demo的例子里了,可以访问http://itfin.afraid.org/fc用密码test登录(用户名可随意输,但要有唯一性,以免与别人的session冲突)进行针对个股的测试.
版主请看一下! VARIABLE:I=1; TR:=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW)); ATR:=MA(TR,10); IF BARSLAST(TR/ATR>=2)=0 AND C>HHV(REF(H,1),3) THEN BB:=CASH*0.03/(ATR*100); BB:=BB*100; BUY(BB); IF BARSLAST(TR/ATR>=2)=0 AND C<LLV(REF(L,1),3) THEN SELL(); IF C-ENTERPRICE>(1.5*ATR) AND I<3 THEN BEGIN BB:=CASH*0.02/(ATR*100); BB:=100*BB; BUY(BB); I:=I+1; END; 这是我写的一个交易系统,但不知中间那有不对的地方,在分析家上测试速度特别慢,是不是循环或分支有问题?请版主或大地飞鹰帮忙看一下!!谢谢!!
Re: 版主请看一下! 我没有引入分析家,不知道速度如何。 你的表达没有反映这个系统的关键,距离太远了。qls已经做得很好了,ilian版主说qls是分析家的超级版主,我估计使用分析家也就是这个水平。使用分析家准确地表达出这个系统有点难,但是基本要点出来了,差别是在细节。你在qls的程序的基础上改进吧。