楼主: 挖矿专家
7678 1

[源码分享] 双均线SAR组合策略+止损 附源码 [推广有奖]

  • 0关注
  • 74粉丝

讲师

22%

还不是VIP/贵宾

-

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

楼主
挖矿专家 发表于 2017-3-27 15:36:21 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
利用双均线系统决定入场,利用SAR决定出场,同时利用ATR进行止损和加仓控制。

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

双均线SAR组合+ATR止损.png

策略源码:

  1. function sjx1sarlossadd(freq) %
  2. %freq为输入频率
  3. %反手策略
  4. %双均线+SAR策略:双均线决定入场,SAR定出场。MA(5)>MA(10),做多,SAR由空转多,平空做多,SAR由多转空,平多做空。
  5. targetList = traderGetTargetList();
  6. HandleList = traderGetHandleList();
  7. global record;

  8. for i=1:length(targetList)
  9.     marketposition=traderGetAccountPosition(HandleList(1),targetList(i).Market,targetList(i).Code);
  10.     barnum=traderGetCurrentBar(targetList(i).Market,targetList(i).Code);
  11.     len=90;
  12.     dlen=90;
  13.     [time,open,high,low,close,volume,turnover,openinterest] = traderGetKData(targetList(i).Market,targetList(i).Code,'min',freq, 0-len, 0,false,'FWard');
  14.     [Dtime,Dopen,Dhigh,Dlow,Dclose,Dvolume,Dturnover,Dopeninterest] = traderGetKData(targetList(i).Market,targetList(i).Code,'day',1, 0-dlen, 0,false,'FWard');
  15.     if length(close)<len+1||length(Dclose)<dlen+1
  16.         continue;
  17.     end
  18.     [sarc,sarn,pos,turn]=SAR(high,low);
  19.     ma5=MA(Dclose,5);
  20.     ma20=MA(Dclose,20);
  21.     con1=ma5(end)>ma20(end);%做多
  22.     con2=ma5(end)<ma20(end);%做空
  23.     N=barnum-record{i}.entrybar;
  24.     if record{i}.entrybar==0
  25.         N=15;
  26.     end
  27.    
  28.     N=max(N,15);
  29.     N=min(N,50);
  30.     con20=sum(pos(end-N:end-4)==-1)>=fix(N*0.8)&&sum(pos(end-3:end)==1)>=3;%空转多,反转做多
  31.     con10=sum(pos(end-N:end-4)==1)>=fix(N*0.8)&&sum(pos(end-3:end)==-1)>=3;%多转空,反转做空
  32.    
  33.     %--止损线
  34.     ATR=ATR(Dhigh,Dlow,Dclose,20);
  35.    
  36.     %-满仓上移止损线
  37.     if record{i}.m>4
  38.         if close(end)>record{i}.entryp+2*ATR(end)&&(marketposition>0)
  39.             record{i}.entryp= record{i}.entryp+2*ATR(end);
  40.         elseif close(end)<record{i}.entryp-2*ATR(end)&&(marketposition<0)
  41.             record{i}.entrp= record{i}.entryp-2*ATR(end);
  42.         end
  43.     end
  44.     %入场
  45.     sharenum=5;
  46.     %---------------入场-------------%
  47.     if con1&&(record{i}.m==0)&&(marketposition==0)
  48.         order=traderBuy(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
  49.         if order~=0
  50.             record{i}.m= record{i}.m+1;
  51.             record{i}.entryp=close(end);
  52.             record{i}.entrybar=barnum;
  53.         end
  54.     end
  55.    
  56.     if con2&&(record{i}.m==0)&&(marketposition==0)
  57.         order=traderSellShort(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
  58.         if order~=0
  59.             record{i}.m= record{i}.m+1;
  60.             record{i}.entryp=close(end);
  61.             record{i}.entrybar=barnum;
  62.         end
  63.     end
  64.     %--加仓
  65.     %-----------------加仓----------------%
  66.     if  close(end)>record{i}.entryp+2*ATR(end)&&(record{i}.m<=4)&&(marketposition>0)
  67.         order=traderBuy(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
  68.         if order~=0
  69.             record{i}.m= record{i}.m+1;
  70.             record{i}.entryp=close(end);
  71.             record{i}.entrybar=barnum;
  72.         end
  73.     end
  74.    
  75.     if  close(end)<record{i}.entryp-2*ATR(end)&&(record{i}.m<=4)&&(marketposition<0)
  76.         order=traderSellShort(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
  77.         if order~=0
  78.             record{i}.m= record{i}.m+1;
  79.             record{i}.entryp=close(end);
  80.             record{i}.entrybar=barnum;
  81.         end
  82.     end
  83.    
  84.     %-------------------------止损出场--------------------%
  85.     %做多平仓
  86.     if marketposition>0&&record{i}.m~=0
  87.         if close(end)<record{i}.entryp-0.5*ATR(end)||con10
  88.             order= traderPositionTo(HandleList(1),targetList(i).Market,targetList(i).Code,0,0,'market','sell');
  89.             if order~=0
  90.                 record{i}.m=0;
  91.                 record{i}.entryp=close(end);
  92.                
  93.             end
  94.         end
  95.     end
  96.    
  97.     if marketposition<0&&record{i}.m~=0
  98.         if close(end)>record{i}.entryp+0.5*ATR(end)||con20
  99.             order= traderPositionTo(HandleList(1),targetList(i).Market,targetList(i).Code,0,0,'market','sell');
  100.             if order~=0
  101.                 record{i}.m=0;
  102.                 record{i}.entryp=close(end);
  103.                
  104.             end
  105.         end
  106.     end
  107.    
  108.    
  109.    
  110. end
  111. end
  112. function ATRValue=ATR(High,Low,Close,Length)
  113. ATRValue=zeros(length(High),1);
  114. TRValue=zeros(length(High),1);
  115. 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);
  116. ATRValue=MA(TRValue,Length);
  117. end

  118. function MAValue=MA(Price,Length)
  119. MAValue=zeros(length(Price),1);
  120. for i=Length:length(Price)
  121.     MAValue(i)=sum(Price(i-Length+1:i))/Length;
  122. end
  123. MAValue(1:Length-1)=Price(1:Length-1);
  124. end
复制代码


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


二维码

扫码加我 拉你入群

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

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


双均线SAR组合+ATR止损.png (126.38 KB)

双均线SAR组合+ATR止损.png

沙发
ghjktdf 发表于 2017-3-28 10:08:02
这个感觉不错~

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

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