楼主: 挖矿专家
2739 4

[源码分享] 【每日一策】Matlab量化交易策略之 RSI择时 [推广有奖]

  • 0关注
  • 74粉丝

讲师

22%

还不是VIP/贵宾

-

威望
0
论坛币
2016 个
通用积分
5.2622
学术水平
21 点
热心指数
21 点
信用等级
21 点
经验
6055 点
帖子
403
精华
0
在线时间
151 小时
注册时间
2017-2-8
最后登录
2017-6-27

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
股票池:沪深300所有股票

入场:当RSI下降到30以下进入超卖区,回到50的时候买入
出场:当RSI上升到70之上进入超买区,直接卖出
资金分配:买入的股票采取等资金分配

回测曲线(由Auto-trader提供回测报告)

RSI择时.png


策略源码:

  1. function RSI1(n1,n2,n4) % 威廉指标.
  2. %获取目标资产信息
  3. targetList = traderGetTargetList(); % 在RunBackTest中选择好的标的.
  4. %获取账户信息
  5. HandleList = traderGetHandleList();
  6. %=================================================================
  7. % RunBackTest的参数设置
  8. % n1=12; % RSI的短期参数
  9. % n2=24; % RSI的长期参数
  10. % n4=2; % 几倍ATR
  11. %=================================================================
  12. % 定义持有的账户为全局变量
  13. global holdingList;
  14. if isempty(holdingList) % 判断cc是否为空值
  15.     holdingList(1).Market=0;
  16.     holdingList(1).Code=0;
  17.     holdingList(1).OpenBar=0;
  18.     holdingList(1).OpenPrice=0;
  19.     holdingList(1).Sharebum=0;
  20.     holdingList(1).StopLoss=0;
  21. end

  22. % 定义可用金额
  23. global available;
  24. if isempty(available) % 判断cc是否为空值
  25.     available=100000000;
  26. end
  27. % 定义初始金额,每只股票的最大仓位为初始资金的1/300
  28. initial=100000000;
  29. initialeach=initial/length(targetList);
  30. k1=0;
  31. %------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  32. for i = 1:length(targetList) % 每个股票过一遍   
  33.     % lags为策略需要往前获取多少天
  34.     lags=n2+2;
  35.     %策略中每次取数据的长度
  36.     barnum=traderGetCurrentBar(targetList(i).Market,targetList(i).Code); % K线的序号,后面会增加,前面的值对应的日期固定.
  37.     % 数据长度限制,排除了前lags根k线
  38.     if(barnum<lags)
  39.         continue;
  40.     end
  41.    
  42.     % 策略开始部分
  43.     [time,open,high,low,close,volume,turnover,openinterest] = traderGetKData(targetList(i).Market,targetList(i).Code,'day',1, 0-lags, 0,false,'FWard');
  44.     if length(close)<n2+2
  45.         continue;
  46.     end
  47.     if time(end)>=datenum('1-Jan-2014')
  48.         if length(close)<n2+2
  49.             continue;
  50.         end

  51.         % RSI
  52.         [SRSI]=traderRSI(n1,targetList(i).Market,targetList(i).Code,'day',1, 0-lags, 0,false,'FWard');
  53.         [LRSI]=traderRSI(n2,targetList(i).Market,targetList(i).Code,'day',1, 0-lags, 0,false,'FWard');
  54.         a1=SRSI(end)>LRSI(end) && SRSI(end-1)<LRSI(end-1);
  55.         a2=(SRSI(end)>50 && SRSI(end)<80) || (SRSI(end)<20);
  56.         buy1=a1 && a2;     
  57.         if buy1
  58.             k1=k1+1;
  59.             stockList(k1).Market=targetList(i).Market;
  60.             stockList(k1).Code=targetList(i).Code;
  61.             stockList(k1).Price=close(end);
  62.             [ATR1, ~]=traderATR(14,targetList(i).Market,targetList(i).Code,'day',1,0-lags,0,false,'FWard');
  63.             stockList(k1).ATR=ATR1(end);
  64.         end
  65.     end
  66. end
  67. %--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  68. % 判断股票池里面的股票是否要买入,买入多少手
  69. if k1~=0
  70.     for i=1:length(stockList)
  71.         % 等权重买入
  72.         sharenum=floor(initialeach/stockList(i).Price);
  73.         % 设置每只股票的交易手数,使得最大的亏损不大于初始账户的 n2%.
  74. %         sharenum=floor(stockList(i).Price*initialeach/stockList(i).ATR/10000);
  75.         % 获取当前bar序号
  76.         barnum=traderGetCurrentBar(stockList(i).Market,stockList(i).Code);
  77.         %获取当前仓位
  78.         [marketposition,~,~]=traderGetAccountPosition(HandleList(1),stockList(i).Market,stockList(i).Code);
  79.         if marketposition ==0 && (sharenum*stockList(i).Price)<=1*available && time(end)>=datenum('1-Jan-2014')
  80.             orderID1=traderBuy(HandleList(1),stockList(i).Market,stockList(i).Code,sharenum,0,'market','buy1'); % 开多单
  81.             if orderID1~=0
  82.                 [~,~,price] = traderGetAccountPosition(HandleList(1),stockList(i).Market,stockList(i).Code); % 记录开仓的价格
  83.                 available=available-sharenum*price;
  84.                 if holdingList(1).Market==0
  85.                     holdingList(1).Market=stockList(i).Market;
  86.                     holdingList(1).Code=stockList(i).Code;
  87.                     holdingList(1).OpenBar=barnum+1;
  88.                     holdingList(1).OpenPrice=price;
  89.                     holdingList(1).Sharebum=sharenum;
  90.                     holdingList(1).StopLoss=price-n4*stockList(i).ATR;
  91.                 else
  92.                     holdingList1(1).Market=stockList(i).Market;
  93.                     holdingList1(1).Code=stockList(i).Code;
  94.                     holdingList1(1).OpenBar=barnum+1;
  95.                     holdingList1(1).OpenPrice=price;
  96.                     holdingList1(1).Sharebum=sharenum;
  97.                     holdingList1(1).StopLoss=price-n4*stockList(i).ATR;
  98.                     holdingList=[holdingList,holdingList1];
  99.                 end
  100.             end
  101.         end
  102.     end
  103. end

  104. %--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  105. % 出场设置
  106. if holdingList(1).Code~=0
  107.     for i=1:length(holdingList)
  108.         [ATR2, ~]=traderATR(14,holdingList(i).Market,holdingList(i).Code,'day',1,0-lags,0,false,'FWard');
  109.         [time1,open1,high1,low1,close1,volume1,turnover1,openinterest1] = traderGetKData(holdingList(i).Market,holdingList(i).Code,'day',1, 0-lags, 0,false,'FWard');
  110.         barnum=traderGetCurrentBar(holdingList(i).Market,holdingList(i).Code);        
  111.         if barnum>holdingList(i).OpenBar && high1(end-1)>high1(end-2)
  112.             holdingList(i).StopLoss=high1(end-1)-n4*ATR2(end-1);
  113.         end
  114.         exitlong1=close1(end)<holdingList(i).StopLoss;
  115.         % RSI
  116.         [SRSI]=traderRSI(n1,holdingList(i).Market,holdingList(i).Code,'day',1, 0-lags, 0,false,'FWard');
  117.         [LRSI]=traderRSI(n2,holdingList(i).Market,holdingList(i).Code,'day',1, 0-lags, 0,false,'FWard');
  118.         a1=SRSI(end)<LRSI(end) && SRSI(end-1)>LRSI(end-1);
  119.         % 卖出信号:
  120.         exitlong2=a1;
  121.         
  122.         exitlong=exitlong1 || exitlong2;
  123.         if barnum>=holdingList(i).OpenBar && exitlong2
  124.             orderID2=traderPositionTo(HandleList(1),holdingList(i).Market,holdingList(i).Code,0,0,'market','sell1');
  125.             if orderID2~=0
  126.                 exitprice=traderOrderFilledPrice(HandleList(1),orderID2);
  127.                 available=available+exitprice*holdingList(i).Sharebum;
  128.                 holdingList(i).Sharebum=0;
  129.             end
  130.         end
  131.         
  132.     end
  133.     % 删除已经卖出的股票
  134.     holdingList2(1).Market=0;
  135.     holdingList2(1).Code=0;
  136.     holdingList2(1).OpenBar=0;
  137.     holdingList2(1).OpenPrice=0;
  138.     holdingList2(1).Sharebum=0;
  139.     holdingList2(1).StopLoss=0;
  140.     for i=1:length(holdingList)
  141.         if holdingList(i).Sharebum~=0
  142.             holdingList2=[holdingList2,holdingList(i)];
  143.         end
  144.     end
  145.     holdingList=holdingList2(2:end);
  146. end
  147. %--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  148. end
复制代码


更多免费策略源码下载请登录DigQuant社区-策略资源下载~




二维码

扫码加我 拉你入群

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

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


沙发
65425856 发表于 2017-6-9 15:38:42 |只看作者 |坛友微信交流群

使用道具

藤椅
挖矿专家 发表于 2017-6-15 10:22:59 |只看作者 |坛友微信交流群
感谢支持

使用道具

板凳
ghjktdf 发表于 2017-6-15 18:30:37 |只看作者 |坛友微信交流群
感谢楼主分享

使用道具

报纸
tianwk 发表于 2021-2-22 23:56:27 |只看作者 |坛友微信交流群

thanks for sharing

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 23:23