楼主: 挖矿专家
1262 3

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

  • 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 论坛币
策略思路:
买入信号: WMS上穿80
卖出信号: WMS下穿20
每只股票采取ATR跟踪止损出场

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

WMS择时.png

策略源码:

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

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

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

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

  155. end
复制代码

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



二维码

扫码加我 拉你入群

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

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


已有 1 人评分经验 论坛币 收起 理由
fantuanxiaot + 55 + 55 精彩帖子

总评分: 经验 + 55  论坛币 + 55   查看全部评分

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

使用道具

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

使用道具

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

使用道具

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

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

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

GMT+8, 2024-4-28 03:04