楼主: 挖矿专家
3277 9

[源码分享] 波动率突破+简单过滤 基于Matlab与AT量能实现 附策略源码 [推广有奖]

  • 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 论坛币
策略说明:

策略基本概念是基于区间突破, 当前close突破n天前的均值+m倍的标准差,就long或short。加了一个过滤器,另外收盘价在均线之上。 然后利用移动止损, n天前的ATR,滚动式的获利方式。 策略的概念其实很简单, 核心是回望窗口n天。 n不是固定值, 是实时根据当前市场的状态(波动性等等)计算的。本策略采用60分钟,每隔10分钟进行一次采样。

测试时间较长,从11年到17年,绩效曲线相对稳定。


由 Auto-Trader 提供回测曲线报告:

QQ图片20170605151328.png


策略源代码:

  1. function RBtry(bInit,bDayBegin,cellPar)%
  2. %% 函数说明
  3. %  上面的三个参数是一种固定结构。
  4. %  当在调用该函数如 RBtry(a1,a2,a3,a4,a5,...).所有的参数都会被赋值给cellPar,即cellPar={a1,a2,a3,a4,a5,...}
  5. %  bInit,在策略逻辑运行前为1,类似优矿等平台的initialize函数。当开始判断是否下单后,该变量为0.
  6. %  bDayBegin 在一天的第一根Bar为1,其他时刻为0

  7. %% 外部和全局参数声明,这是一个固定结构.
  8.     global g_idxKDay; % 注册日数据的index.日数据是分钟数据的合成.如在日中获取,当日的数据仅是当日已出现数据的合成,不包含之后的数据。   
  9.     global g_idxKMin; %
  10.     global g_idxSignal;
  11.     global openPrice; %记录开盘价
  12.     global histExtre; %记录历史达到的极值点,用于跟踪止盈
  13.     global TLen;
  14.     N=cellPar{1};                           
  15.     m=cellPar{2};
  16.     Freq = cellPar{3};
  17.     stoploss = cellPar{4};                  
  18.     stopprofit = cellPar{5};                 
  19.     trailinggap = cellPar{6};                                 
  20. %% 初始化回测帐户
  21.     if bInit
  22. %         traderSetParalMode(false);%默认是true,因子计算函数并行执行,速度快,不能调试,false串行执行可以设断点调试
  23.         g_idxKDay = traderRegKData('day',1);% 只有注册之后才能获取数据。分钟数据的获取方法为 traderRegKData('min',1)。后面的数字是刷新频率。
  24.         g_idxKMin = traderRegKData('min',Freq);%
  25.         TLen = length(g_idxKDay(:,1));
  26.         g_idxSignal = traderRegUserIndi(@getSignal,{g_idxKMin,N,m}); %计算因子。调用需要函数如getRange,大括号内是输入参数
  27.         openPrice = nan(1,TLen);
  28.         histExtre = nan(1,TLen);
  29. %% 交易逻辑
  30.     else
  31.         dSignal = traderGetRegUserIndi(g_idxSignal,1);
  32.         [mp,~,~]=traderGetAccountPositionV2(1,1:TLen);
  33.         % ——————————————————调仓———————————————————
  34.         for i=1:TLen
  35.            dataDay = traderGetRegKData(g_idxKMin(i,:),1,false);
  36.            % 数据长度足够;数据非空;当日的成交价不为0;当日高低不同
  37.            if isempty(dSignal(i,:)) || isempty(dataDay) || dataDay(6,end) ==0 || dataDay(3,end)- dataDay(4,end)==0
  38.                continue;
  39.            end
  40.            
  41.             %% 记录历史达到的最大有利值
  42.                if mp(i)>0
  43.                    histExtre(i) = max(histExtre(i),dataDay(3,end));
  44.                elseif mp(i)<0
  45.                    histExtre(i) = min(histExtre(i),dataDay(4,end));
  46.                end
  47.            %%平仓,信号依次为反转平仓、止损平仓、跟踪止损平仓
  48.            %多单
  49.            closeBuy1 = mp(i)>0 && dataDay(5,end)<openPrice(i)-stoploss*dSignal(i,end);
  50.            closeBuy2 = mp(i)>0 && histExtre(i)>openPrice(i)+stopprofit*dSignal(i,end) && dataDay(5,end)<histExtre(i)-trailinggap*dSignal(i,end);
  51.            %空单
  52.            closeSell1 = mp(i)<0 && dataDay(5,end)>openPrice(i)+stoploss*dSignal(i,end);
  53.            closeSell2 = mp(i)<0 && histExtre(i)<openPrice(i)-stopprofit*dSignal(i,end) && dataDay(5,end)>histExtre(i)+trailinggap*dSignal(i,end);
  54.   
  55.            if closeBuy1 + closeBuy2 + closeSell1 + closeSell2>0
  56.                traderPositionToV2(1,i,0,0,'market','close');
  57.            end
  58.            
  59.            % 开仓
  60.            amount = 2000;
  61.            if mp(i) == 0 && dSignal(i+TLen,end)>0 %&& dSignal(i+2*TLen,end)>0
  62.                traderDirectBuyV2(1,i,amount,0,'market','buy1');%开多单
  63.                openPrice(i) = dataDay(5,end);
  64.                histExtre(i) = dataDay(5,end);
  65.            elseif  mp(i) == 0 && dSignal(i+TLen,end)<0% && dSignal(i+2*TLen,end)<0
  66.                traderDirectSellV2(1,i,amount,0,'market','sell1');%开空单
  67.                openPrice(i) = dataDay(5,end);
  68.                histExtre(i) = dataDay(5,end);
  69.            end
  70.         end
  71.     end   
  72. end

  73. %% 计算因子的自定义函数
  74. function value=getSignal(cellPar,bpPFCell)
  75. %调用该函数的参数将会全部被赋给cellPar
  76. %bpPFCell为一个时间序列,标记特定的刷新时刻

  77. %%%参数声明
  78.     idxK =cellPar{1};
  79.     N = cellPar{2};
  80.     m = cellPar{3};

  81. %%%函数计算
  82.      [targetNum,~]=size(idxK);
  83.       value = nan(1,3*targetNum);%第一个ATR,第三个均值突破
  84.     for i=1:targetNum
  85.         regKMatrix = traderGetRegKData(idxK(i,:),N+10,false,bpPFCell);
  86.         regKMatrix(:,any(isnan(regKMatrix),1))=[];
  87.         [~,KLen]=size(regKMatrix);
  88.         if KLen>=N+2
  89.             value1  =  abs(regKMatrix(3,end-N+1:end) - regKMatrix(4,end-N+1:end));%  当日最高价减去当日最低价
  90.             value2  =  abs(regKMatrix(3,end-N+1:end) - regKMatrix(5,end-N:end-1));%  当日最高价减去前日收盘价的绝对值
  91.             value3  =  abs(regKMatrix(4,end-N+1:end) - regKMatrix(5,end-N:end-1));%    当日最低价减去前日收盘价的绝对值
  92.             TRlist=max(value1,max(value2,value3));
  93.             value(i) = mean(TRlist);
  94.             stds = std(regKMatrix(5,end-N+1:end));
  95.             means = mean(regKMatrix(5,end-N+1:end));
  96.             
  97.             if regKMatrix(5,end)>stds*m + means
  98.                 value(i+targetNum) = 1;
  99.             elseif  regKMatrix(5,end)<-stds*m + means
  100.                  value(i+targetNum) = -1;
  101.             else
  102.                  value(i+targetNum) = 0;
  103.             end
  104.             stds = std(regKMatrix(5,end-13:end));
  105.             means = mean(regKMatrix(5,end-13:end));
  106.              value(i+2*targetNum) = (regKMatrix(5,end)-means)/stds/.015;
  107.         end
  108.     end
  109. end
  110.                
复制代码


策略执行代码:

  1. targetList(1).Market  =  'SHFE';
  2. targetList(1).Code  =  'RB0000';

  3. N=100;
  4. m=1;
  5. Freq = 60;
  6. stoploss= 2;
  7. stopprofit = 4;
  8. trailinggap = 2;

  9. AccountList(1) = {'FutureBackReplay'};
  10. traderRunBacktestV2('MoneyManageMent',@RBtry,{N,m,Freq,stoploss ,stopprofit,trailinggap },AccountList,targetList,'min',10,20110104,20170220,'FWard');
复制代码


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

二维码

扫码加我 拉你入群

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

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

关键词:MATLAB atlab matla Mat Atl function 过滤器 源代码 标准差 收盘价

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

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

标的是什么哦?

使用道具

藤椅
挖矿专家 发表于 2017-6-5 18:25:28 |只看作者 |坛友微信交流群
targetList(1).Market  =  'SHFE';
targetList(1).Code  =  'RB0000';    螺纹钢

使用道具

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

使用道具

报纸
挖矿专家 发表于 2017-6-6 16:00:35 |只看作者 |坛友微信交流群
65425856 发表于 2017-6-6 10:00
感谢楼主分享
共同学习~

使用道具

地板
ghjktdf 发表于 2017-6-7 10:05:48 |只看作者 |坛友微信交流群
感谢分享

使用道具

7
65425856 发表于 2017-6-7 20:35:07 |只看作者 |坛友微信交流群
挖矿专家 发表于 2017-6-6 16:00
共同学习~

使用道具

8
挖矿专家 发表于 2017-6-8 21:10:04 |只看作者 |坛友微信交流群
65425856 发表于 2017-6-7 20:35
感谢支持

使用道具

9
挖矿专家 发表于 2017-6-15 10:20:45 |只看作者 |坛友微信交流群
ghjktdf 发表于 2017-6-7 10:05
感谢分享
感谢支持

使用道具

10
ghjktdf 发表于 2017-6-15 18:10:43 |只看作者 |坛友微信交流群
挖矿专家 发表于 2017-6-15 10:20
感谢支持

使用道具

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

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

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

GMT+8, 2024-4-24 22:56