全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 量化投资
2867 6
2017-02-20
策略名称:CCI择时策略说明:
1.CCI 为正值时,视为多头市场;为负值时,视为空头市场;
2.常态行情时,CCI 波动于±100 的间;强势行情,CCI 会超出±100 ;
3.CCI>100 时,买进,直到CCI

回测曲线:

QQ图片20170220100533.png

策略代码:

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



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2017-3-6 14:29:56
atrader 社区已经更名为 digquant 社区,迁移至 www.digquant.com.cn
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-3-7 14:10:58
挖矿专家 发表于 2017-3-6 14:29
atrader 社区已经更名为 digquant 社区,迁移至 www.digquant.com.cn
(*@ο@*) 哇~鼓掌~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-3-8 15:57:57
挖矿专家 发表于 2017-3-6 14:29
atrader 社区已经更名为 digquant 社区,迁移至 www.digquant.com.cn
不是人人都能成为宽客
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-3-9 10:06:26
感谢支持
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-3-9 16:55:38
挖矿专家 发表于 2017-3-9 10:06
感谢支持
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群