楼主: 挖矿专家
1787 1

[源码分享] 【每日一策】Matlab量化交易策略之 以小博大策略(加止损) [推广有奖]

  • 0关注
  • 74粉丝

讲师

22%

还不是VIP/贵宾

-

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

楼主
挖矿专家 发表于 2017-3-29 16:37:31 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
策略思路:

收盘价站稳今天开盘价30分钟,做多;反之做空。收盘价低于今日开盘价则多头出场,反之则空头出场,或者收盘前主动平仓。同时加入ATR止损机制。

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

以小博大+止损.png


策略源码:

  1. function bodaLoss(freq) %
  2. %freq为输入频率
  3. %len为计算使用的长度
  4. %band为波动乘数
  5. %shareNum为操作的手数
  6. %%%NEWS系统

  7. targetList = traderGetTargetList();
  8. HandleList = traderGetHandleList();
  9. global p;
  10. global record;
  11. for i=1:length(targetList)
  12.     dlen=60;
  13.     barnum=traderGetCurrentBar(targetList(i).Market,targetList(i).Code);
  14.     marketposition=traderGetAccountPosition(HandleList(1),targetList(i).Market,targetList(i).Code);   
  15.     len=20;   
  16.     [time,open,high,low,close,volume,turnover,openinterest] = traderGetKData(targetList(i).Market,targetList(i).Code,'min',freq, 0-len, 0,false,'FWard');
  17.     [Dtime,Dopen,Dhigh,Dlow,Dclose,Dvolume,Dturnover,Dopeninterest] = traderGetKData(targetList(i).Market,targetList(i).Code,'day',1, -20, 0,false,'FWard');
  18.     [mtime,mopen,mhigh,mlow,mclose,mvolume,mturnover,mopeninterest] = traderGetKData(targetList(i).Market,targetList(i).Code,'min',1, 0-dlen, 0,false,'FWard');
  19.     if length(close)<len+1||length(Dclose)<21||length(mclose)<dlen+1
  20.         continue;
  21.     end
  22.     %----------------------------日内策略---------------%
  23.     gettime=datevec(mtime);
  24.     timenum=gettime(:,4)*100+gettime(:,5);
  25.     p{i}.price=0;
  26.     p{i}.con=[];
  27.     %------------------开盘30分钟后进行操作--------------%
  28.     if timenum(end)<0945
  29.         continue
  30.     end
  31.     id=find(timenum>=0916&timenum<=0945,30,'last');%找最近的前30分钟数据的位置
  32.     if length(id)<30
  33.         continue
  34.     end
  35.     p{i}.price=mopen(id(1));%记录开盘价
  36.     for k=1:length(id)
  37.         p{i}.con=[p{i}.con,mclose(id(k))>p{i}.price];
  38.     end
  39.    
  40.     %-----------------------日内策略-----------------------------------------%
  41.      if timenum(end)>0900&&timenum(end)<1448||timenum(end)<2100&&timenum(end)>2400||timenum(end)>0000&&timenum(end)<0158
  42.         cont=1;        
  43.     else cont=0;      
  44.         p{k}.price=0;
  45.         p{k}.con=[];
  46.     end
  47.     %---------------------进出场指标--------%
  48.     ATR=ATR(Dhigh,Dlow,Dclose,20);
  49.     con1=sum(p{i}.con)>=30&&cont;%30分钟内价格均在上方,做多
  50.     con2=sum(p{i}.con)==0&&cont;%30分钟内价格均在下方,做空
  51.     con10=cont==0;
  52.     con20=cont==0;
  53.    
  54.    
  55.     %-------------------------平仓止损--------------------%
  56.     %做多平仓
  57.     if marketposition>0&&record{i}.m~=0
  58.         if close(end)<record{i}.entryp-0.5*ATR(end)||con10
  59.             order= traderPositionTo(HandleList(1),targetList(i).Market,targetList(i).Code,0,0,'market','sell');
  60.             if order~=0
  61.                 record{i}.m=0;
  62.                 record{i}.entryp=close(end);               
  63.             end
  64.         end
  65.     end
  66.    
  67.     if marketposition<0&&record{i}.m~=0
  68.         if close(end)>record{i}.entryp+0.5*ATR(end)||con20
  69.             order= traderPositionTo(HandleList(1),targetList(i).Market,targetList(i).Code,0,0,'market','sell');
  70.             if order~=0
  71.                 record{i}.m=0;
  72.                 record{i}.entryp=close(end);               
  73.             end
  74.         end
  75.     end
  76.    
  77.    
  78.     sharenum=5;
  79.     %---------------入场-------------%
  80.     if con1&&(record{i}.m==0)&&(marketposition==0)
  81.         order=traderBuy(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
  82.         if order~=0
  83.             record{i}.m= record{i}.m+1;
  84.             record{i}.entryp=close(end);
  85.         end
  86.     end
  87.    
  88.     if con2&&(record{i}.m==0)&&(marketposition==0)
  89.         order=traderSellShort(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
  90.         if order~=0
  91.             record{i}.m= record{i}.m+1;
  92.             record{i}.entryp=close(end);            
  93.         end
  94.     end   
  95.    
  96.    
  97. end
  98. end
  99. function ATRValue=ATR(High,Low,Close,Length)
  100. ATRValue=zeros(length(High),1);
  101. TRValue=zeros(length(High),1);
  102. TRValue(2:end)=max([High(2:end)-Low(2:end) abs(High(2:end)-Close(1:end-1)) abs(Low(2:end)-Close(1:end-1))],[],2);
  103. ATRValue=MA(TRValue,Length);
  104. end

  105. function MAValue=MA(Price,Length)
  106. MAValue=zeros(length(Price),1);
  107. for i=Length:length(Price)
  108.     MAValue(i)=sum(Price(i-Length+1:i))/Length;
  109. end
  110. MAValue(1:Length-1)=Price(1:Length-1);
  111. end
复制代码



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

扫码加我 拉你入群

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

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


沙发
ghjktdf 发表于 2017-3-29 19:01:13
感谢楼主分享

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

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2026-1-29 05:39