设为首页收藏本站

 找回密码
 注册
查看: 2313|回复: 0
打印 上一主题 下一主题

CCI择时策略(附源码) [复制链接]

精华
0
UID
247176
积分
162
帖子
72
主题
68
阅读权限
0
注册时间
2017-2-14
最后登录
2017-5-18
跳转到指定楼层
1#
发表于 2017-2-20 16:18:58 |只看该作者 |倒序浏览
策略名称:CCI择时

策略思路:
1.CCI 为正值时,视为多头市场;为负值时,视为空头市场;
2.常态行情时,CCI 波动于±100 的间;强势行情,CCI 会超出±100 ;
3.CCI>100 时,买进,直到CCI

回测曲线:


策略代码:
function  CCI1(n)  %  顺势指标
%获取目标资产信息
targetList  =  traderGetTargetList();  %  在RunBackTest中选择好的标的.
%获取账户信息
HandleList  =  traderGetHandleList();
%=================================================================
%  RunBackTest的参数设置
%  n=20;  %  CCI的参数
%=================================================================
%  定义持有的账户为全局变量
global  holdingList;
if  isempty(holdingList)  %  判断cc是否为空值
        holdingList(1).Market=0;
        holdingList(1).Code=0;
        holdingList(1).OpenBar=0;
        holdingList(1).OpenPrice=0;
        holdingList(1).Sharebum=0;
end
%  定义可用金额
global  available;
if  isempty(available)  %  判断cc是否为空值
        available=100000000;
end
%  定义初始金额,每只股票的最大仓位为初始资金的1/300
initial=100000000;
initialeach=initial/length(targetList)*2;
k1=0;
%------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
for  i  =  1:length(targetList)  %  每个股票过一遍        
        %  lags为策略需要往前获取多少天
        lags=30;
        %策略中每次取数据的长度
        barnum=traderGetCurrentBar(targetList(i).Market,targetList(i).Code);  %  K线的序号,后面会增加,前面的值对应的日期固定.
        %  数据长度限制,排除了前lags根k线
        if(barnum<lags)
                continue;
        end
        
        %  策略开始部分
        [time,open,high,low,close,volume,turnover,openinterest]  =  traderGetKData(targetList(i).Market,targetList(i).Code,'day',1,  0-lags,  0,false,'FWard');
                if  length(close)<30
                        continue;
                end
      
                TP=(high+low+close)/3;
                MATP=mean(TP(end-n+1:end));
                a1=abs(TP(end-n+1:end)-MATP);              
                meanDev=mean(a1);
                CCI=(TP-MATP)/(0.015*meanDev);
                a=CCI(end)>100  &&  CCI(end-1)<100;  %  CCI上穿100,买入
                if  a
                        k1=k1+1;
                        stockList(k1).Market=targetList(i).Market;
                        stockList(k1).Code=targetList(i).Code;
                        stockList(k1).Price=close(end);
                        [ATR1,  ~]=traderATR(14,targetList(i).Market,targetList(i).Code,'day',1,0-lags,0,false,'FWard');
                        stockList(k1).ATR=ATR1(end);
                end
        end
%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
%  判断股票池里面的股票是否要买入,买入多少手
if  k1~=0
        for  i=1:length(stockList)
                %  等权重
                sharenum=floor(initialeach/stockList(i).Price/100)*100;
                %  设置每只股票的交易手数,使得最大的亏损不大于初始账户的  n2%.
%                  sharenum=floor(stockList(i).Price*initialeach/stockList(i).ATR/10000);
                %  获取当前bar序号
                barnum=traderGetCurrentBar(stockList(i).Market,stockList(i).Code);
                %获取当前仓位
                [marketposition,~,~]=traderGetAccountPosition(HandleList(1),stockList(i).Market,stockList(i).Code);
                if  marketposition  ==0  &&  (sharenum*stockList(i).Price)<=1*available  
                        orderID1=traderBuy(HandleList(1),stockList(i).Market,stockList(i).Code,sharenum,0,'market','buy1');  %  开多单
                        if  orderID1~=0
                                [~,~,price]  =  traderGetAccountPosition(HandleList(1),stockList(i).Market,stockList(i).Code);  %  记录开仓的价格
                                available=available-sharenum*price;
                                if  holdingList(1).Market==0
                                        holdingList(1).Market=stockList(i).Market;
                                        holdingList(1).Code=stockList(i).Code;
                                        holdingList(1).OpenBar=barnum+1;
                                        holdingList(1).OpenPrice=price;
                                        holdingList(1).Sharebum=sharenum;
                                else
                                        holdingList1(1).Market=stockList(i).Market;
                                        holdingList1(1).Code=stockList(i).Code;
                                        holdingList1(1).OpenBar=barnum+1;
                                        holdingList1(1).OpenPrice=price;
                                        holdingList1(1).Sharebum=sharenum;
                                        holdingList=[holdingList,holdingList1];
                                end
                        end
                end
        end
end
%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
%  出场设置
if  holdingList(1).Code~=0
        for  i=1:length(holdingList)
%                  [ATR2,  ~]=traderATR(14,holdingList(i).Market,holdingList(i).Code,'day',1,0-lags,0,false,'FWard');
                [time1,open1,high1,low1,close1,volume1,turnover1,openinterest1]  =  traderGetKData(holdingList(i).Market,holdingList(i).Code,'day',1,  0-lags,  0,false,'FWard');
                barnum=traderGetCurrentBar(holdingList(i).Market,holdingList(i).Code);
                TP=(high1+low1+close1)/3;
                MATP=mean(TP(end-n+1:end));
                a1=abs(TP(end-n+1:end)-MATP);              
                meanDev=mean(a1);
                CCI=(TP-MATP)/(0.015*meanDev);
                %  出场条件设定,当CCI指标回到100,并距离前次上穿100在m天之内,我们卖出.或者下穿-100
                b1=CCI(end-1)>100  &&  CCI(end)<=100;
                b2=holdingList(1).OpenBar-barnum<6;
                exitlong1=b1  &&  b2;
                exitlong2=CCI(end-1)>-100  &&  CCI(end)<-100;
                exitlong=  exitlong1  ||  exitlong2;
        
                if  barnum>=holdingList(i).OpenBar  &&  exitlong
                        orderID2=traderPositionTo(HandleList(1),holdingList(i).Market,holdingList(i).Code,0,0,'market','sell1');
                        if  orderID2~=0
                                exitprice=traderOrderFilledPrice(HandleList(1),orderID2);
                                available=available+exitprice*holdingList(i).Sharebum;
                                holdingList(i).Sharebum=0;
                        end
                end
               
        end
        %  删除已经卖出的股票
        holdingList2(1).Market=0;
        holdingList2(1).Code=0;
        holdingList2(1).OpenBar=0;
        holdingList2(1).OpenPrice=0;
        holdingList2(1).Sharebum=0;
        for  i=1:length(holdingList)
                if  holdingList(i).Sharebum~=0
                        holdingList2=[holdingList2,holdingList(i)];
                end
        end
        holdingList=holdingList2(2:end);
end
%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
end

更多免费策略源码下载,请登录atrader社区-策略服务  下载
http://www.atrader.com.cn/stra.php

CCI择时策略源码下载:http://www.atrader.com.cn/stra.php?mod=model&pid=88
附件: 你需要登录才可以下载或查看附件。没有帐号?注册
您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-6 20:33

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部