楼主: 挖矿专家
3595 5

[源码分享] 【每日一策】Matlab量化交易策略之 GFTD+止损 [推广有奖]

  • 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 论坛币
策略思路:
GFTD模型,趋势跟踪策略,利用K线收盘价的涨跌进行判断,真正交易前,需经历交易启动,到交易信号发出的过程,并且买入和卖出分别当做独立的系统进行计算。当买入计数达到4,做多,当卖出计数达到4,做空。并利用ATR控制止损和加仓。

回测曲线:

GFTD+止损.png

策略源码:

  1. function atdloss(freq)
  2. targetList = traderGetTargetList();
  3. HandleList = traderGetHandleList();
  4. global record;
  5. global record1;
  6. global record2;
  7. global record3;
  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=30;
  12.     dlen=31;
  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.    
  19.     if close(end)>close(end-4)
  20.         ud=1;
  21.     elseif close(end)<close(end-4)
  22.         ud=-1;
  23.     else
  24.         ud=0;
  25.     end
  26.     record{i}.ud=[record{i}.ud,ud];
  27.     if length(record{i}.ud)<2
  28.         continue
  29.     end
  30.     %ud为1,开始累加计算卖出启动
  31.     if record{i}.ud(end)==1
  32.         if  record{i}.ud(end)==record{i}.ud(end-1)
  33.             if isempty(record2{i}.sud)
  34.                 record2{i}.sud=[1 2];
  35.                 record2{i}.sclose=close(end-1:end);
  36.                 record2{i}.shigh=high(end-1:end);
  37.                 record2{i}.slow=low(end-1:end);
  38.             else
  39.                 record2{i}.sud=[record2{i}.sud  record2{i}.sud(end)+1];
  40.                 record2{i}.sclose=[record2{i}.sclose ;close(end)];
  41.                 record2{i}.shigh=[record2{i}.sclose; high(end)];
  42.                 record2{i}.slow=[record2{i}.sclose; low(end)];
  43.             end
  44.         else
  45.             record2{i}.sud=[];
  46.             record2{i}.sclose=[];
  47.             record2{i}.shigh=[];
  48.             record2{i}.slow=[];
  49.         end
  50.     end
  51.     %ud为-1,累加计算买入启动
  52.     if record{i}.ud(end)==-1
  53.         if record{i}.ud(end)==record{i}.ud(end-1)
  54.             if isempty(record2{i}.bud)
  55.                 record2{i}.bud=[1 2];
  56.                 record2{i}.bclose=close(end-1:end);
  57.                 record2{i}.bhigh=high(end-1:end);
  58.                 record2{i}.blow=low(end-1:end);
  59.             else
  60.                 record2{i}.bud=[record2{i}.bud  record2{i}.bud(end)+1];
  61.                 record2{i}.bclose=[record2{i}.bclose;close(end)];
  62.                 record2{i}.bhigh=[record2{i}.bclose;high(end)];
  63.                 record2{i}.blow=[record2{i}.bclose ;low(end)];
  64.             end
  65.         else
  66.             record2{i}.bud=[];
  67.             record2{i}.bclose=[];
  68.             record2{i}.bhigh=[];
  69.             record2{i}.blow=[];
  70.         end
  71.     end
  72.     %卖出启动计算完毕,进入交叉条件阶段
  73.     %交叉之前进行转接,并将原来计算清零,继续计数
  74.     if ~isempty(record2{i}.bud)&&record2{i}.bud(end)==4
  75.         record3{i}.b=record3{i}.b+1;
  76.         record3{i}.bclose=record2{i}.bclose;
  77.         record3{i}.bhigh=record2{i}.bhigh;
  78.         record3{i}.lbow=record2{i}.blow;
  79.         record2{i}.bud=[];
  80.         record2{i}.bclose=[];
  81.         record2{i}.bhigh=[];
  82.         record2{i}.blow=[];
  83.     end
  84.     %交叉之前进行转接,并将原来计算清零,继续计数
  85.     if ~isempty(record2{i}.sud)&&record2{i}.sud(end)==4
  86.         record3{i}.s=record3{i}.s+1;  %计算满足条件的次数
  87.         record3{i}.sclose=record2{i}.sclose;
  88.         record3{i}.shigh=record2{i}.shigh;
  89.         record3{i}.slow=record2{i}.slow;
  90.         record2{i}.sud=[];
  91.         record2{i}.sclose=[];
  92.         record2{i}.shigh=[];
  93.         record2{i}.slow=[];
  94.     end
  95.     %交叉条件计数
  96.     %买入交叉计数
  97.     if record3{i}.b==1
  98.         if close(end)>=record3{i}.bhigh(2)&&high(end)>record3{i}.bhigh(1)&&close(end)>record3{i}.bclose(1)
  99.             record3{i}.bcou=record3{i}.bcou+1;
  100.         end
  101.     elseif record3{i}.b>1&&record3{i}.bcou<4
  102.         record3{i}.bcou=0;
  103.         record3{i}.b=0;
  104.     end
  105.     %卖出交叉计数
  106.     if record3{i}.s==1
  107.         if close(end)<=record3{i}.slow(2)&&low(end)>record3{i}.slow(1)&&close(end)>record3{i}.sclose(1)
  108.             record3{i}.scou=record3{i}.scou+1;
  109.         end
  110.     elseif record3{i}.s>1&&record3{i}.scou<4
  111.         record3{i}.scou=0;
  112.         record3{i}.s=0;
  113.     end
  114.     %判断买入启动是否达成
  115.     if record3{i}.bcou==4
  116.         con1=1;
  117.         record3{i}.b=0;
  118.         record3{i}.bcou=0;
  119.         record3{i}.bclose=[];
  120.         record3{i}.bhigh=[];
  121.         record3{i}.blow=[];
  122.     else con1=0;
  123.     end
  124.     if record3{i}.scou==4
  125.         con2=1;
  126.         record3{i}.s=0;
  127.         record3{i}.scou=0;
  128.         record3{i}.sclose=[];
  129.         record3{i}.shigh=[];
  130.         record3{i}.slow=[];
  131.     else con2=0;
  132.     end
  133.     %------------------止损线
  134.     ATR=ATR(Dhigh,Dlow,Dclose,20);
  135.     %-------------------------------满仓上移--------------%
  136.     if record1{i}.m>3
  137.         if close(end)>record1{i}.entryp+2*ATR(end)&&(marketposition>0)
  138.             record1{i}.entryp= record1{i}.entryp+2*ATR(end);
  139.         elseif close(end)<record1{i}.entryp-2*ATR(end)&&(marketposition<0)
  140.             record1{i}.entryp= record1{i}.entryp-2*ATR(end);
  141.         end
  142.     end
  143.    
  144.     %--------------------------------止损出场---------------%
  145.     %做多平仓
  146.     if marketposition>0&&record1{i}.m~=0
  147.         if close(end)<record1{i}.entryp-0.5*ATR(end)
  148.             order= traderPositionTo(HandleList(1),targetList(i).Market,targetList(i).Code,0,0,'market','sell');
  149.             if order~=0
  150.                 record1{i}.m=0;
  151.                 record1{i}.entryp=close(end);
  152.                 record1{i}.entrybar=0;
  153.             end
  154.         end
  155.     end
  156.    
  157.     if marketposition<0&&record1{i}.m~=0
  158.         if close(end)>record1{i}.entryp+0.5*ATR(end)
  159.             order= traderPositionTo(HandleList(1),targetList(i).Market,targetList(i).Code,0,0,'market','sell');
  160.             if order~=0
  161.                 record1{i}.m=0;
  162.                 record1{i}.entryp=close(end);
  163.                 record1{i}.entrybar=0;
  164.             end
  165.         end
  166.     end
  167.    
  168.    
  169.     sharenum=5;
  170.     %---------------入场-------------%
  171.     if con1&&(record1{i}.m==0)&&(marketposition==0)
  172.         order=traderBuy(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
  173.         if order~=0
  174.             record1{i}.m= record1{i}.m+1;
  175.             record1{i}.entryp=close(end);
  176.             record1{i}.entrybar=barnum;
  177.         end
  178.     end
  179.    
  180.     if con2&&(record1{i}.m==0)&&(marketposition==0)
  181.         order=traderSellShort(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
  182.         if order~=0
  183.             record1{i}.m= record1{i}.m+1;
  184.             record1{i}.entryp=close(end);
  185.             record1{i}.entrybar=barnum;
  186.         end
  187.     end
  188.    
  189.     %----------------------------加仓----------------------%
  190.     if  close(end)>record1{i}.entryp+2*ATR(end)&&(record1{i}.m<=3)&&(marketposition>0)
  191.         order=traderBuy(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
  192.         if order~=0
  193.             record1{i}.m= record1{i}.m+1;
  194.             record1{i}.entryp=close(end);
  195.             record1{i}.entrybar=barnum;
  196.         end
  197.     end
  198.    
  199.     if  close(end)<record1{i}.entryp-2*ATR(end)&&(record1{i}.m<=3)&&(marketposition<0)
  200.         order=traderSellShort(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
  201.         if order~=0
  202.             record1{i}.m= record1{i}.m+1;
  203.             record1{i}.entryp=close(end);
  204.             record1{i}.entrybar=barnum;
  205.         end
  206.     end
  207.    
  208. end
  209. end
  210. function ATRValue=ATR(High,Low,Close,Length)
  211. ATRValue=zeros(length(High),1);
  212. TRValue=zeros(length(High),1);
  213. 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);
  214. ATRValue=MA(TRValue,Length);
  215. end

  216. function MAValue=MA(Price,Length)
  217. MAValue=zeros(length(Price),1);
  218. for i=Length:length(Price)
  219.     MAValue(i)=sum(Price(i-Length+1:i))/Length;
  220. end
  221. MAValue(1:Length-1)=Price(1:Length-1);
  222. end
复制代码



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



二维码

扫码加我 拉你入群

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

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


沙发
3862161 在职认证  发表于 2017-3-28 11:54:12 |只看作者 |坛友微信交流群
代码太乱了{:0_268

使用道具

藤椅
挖矿专家 发表于 2017-3-29 10:32:26 |只看作者 |坛友微信交流群
重新用代码编辑器编辑了一下,好看多了

使用道具

板凳
挖矿专家 发表于 2017-6-15 15:39:21 |只看作者 |坛友微信交流群

使用道具

报纸
ghjktdf 发表于 2017-6-16 10:00:38 |只看作者 |坛友微信交流群
感谢分享

使用道具

地板
azhalin 发表于 2019-7-22 18:40:18 |只看作者 |坛友微信交流群
如何联系楼主?

使用道具

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

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

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

GMT+8, 2024-4-24 02:51