楼主: zhouwenzi
20107 24

[程序化交易] 十大经典日内策略之RangeBreak(附源码分享) [推广有奖]

  • 1关注
  • 8粉丝

硕士生

26%

还不是VIP/贵宾

-

威望
0
论坛币
45 个
通用积分
4.0026
学术水平
2 点
热心指数
1 点
信用等级
1 点
经验
1288 点
帖子
78
精华
0
在线时间
169 小时
注册时间
2013-3-9
最后登录
2023-7-28

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
朱淋靖老师曾指出十种日内趋势跟踪的交易方法,其中RangeBreak为他提及的第一个策略。该策略是波动区间突破策略,其中range(波动区间)主要由昨日的最高和最低价格之差决定,这个比例作为参数,可由个人或者行情决定。获得range后,再利用今天的开盘价格,即可构造今天的交易的上下通道。
      LZ选择的通道为:上轨=今日开盘价+0.25*range;下轨=今日开盘价-0.25*range。与其他突破类策略一样,价格突破上轨做多,价格突破下轨做空。(当然,你也可以选择进行反趋势交易)
      而出场条件同样由上下轨决定,多头出场条件为:价格下跌上轨-0.25*range;空头出场条件为:价格上穿下轨+0.25*range。如果不能主动出场,那么在收盘前,也会进行强制平仓操作。下为源代码:
  1. %-------------------------------------------------------主体函数------------------------------------------------%
  2. function RangeBreak(freq)%

  3. targetList = traderGetTargetList();
  4. %获取目标资产信息
  5. HandleList = traderGetHandleList();
  6. %获取账户句柄
  7. global state;
  8. for k=1:length(targetList);
  9.    
  10.     %--------------------仓位、K线、当前bar的提取-----------------------------%
  11.     %获取当前仓位
  12.     [marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(k).Market,targetList(k).Code);
  13.     %策略中每次取数据的长度
  14.     lags=40;
  15.     dlags=31;
  16.     barnum=traderGetCurrentBar(targetList(k).Market,targetList(k).Code);
  17.     %数据长度限制
  18.     if(barnum<lags)
  19.         continue;
  20.     end
  21.     %获取K线数据
  22.     [time,open,high,low,close,volume,~,~] = traderGetKData(targetList(k).Market,targetList(k).Code,'min',freq, 0-lags, 0,false,'FWard');
  23.     [Dtime,Dopen,Dhigh,Dlow,Dclose,Dvolume,~,~] = traderGetKData(targetList(k).Market,targetList(k).Code,'day',1, 0-dlags, 0,false,'FWard');
  24.     if length(close)<lags || length(Dclose)<dlags
  25.         continue;
  26.     end;
  27.     %设置交易时间-----------%
  28.     gettime=datevec(time);
  29.     numtime=gettime(end,4)*100+gettime(end,5);
  30.     cont=0;
  31.     if numtime>=0900&&numtime<1400||numtime>=2100&&numtime<=2400||numtime>0000&&numtime<0100
  32.         cont=1;
  33.     end
  34.     %--------------------- 止损/入场条件计算 ------------------------------------%
  35.     range=Dhigh(end-1)-Dlow(end-1);%昨日震荡幅度
  36.     upline=Dopen(end)+0.25*range;%今日上轨
  37.     dnline=Dopen(end)-0.25*range;%今日下轨
  38.     buycon=close(end)>upline &&cont; % 突破range上轨道做多
  39.     sellshortcon=close(end)<dnline && cont; % 突破 range下轨道做空
  40.     buycon0=close(end)<upline-0.25*range;
  41.     sellcon0=close(end)>dnline+0.25*range;
  42.     shareNum=10;%交易手数的设置
  43.     %--------------------------------------仓位操作-----------------%
  44.     if cont~=0
  45.         if  marketposition==0
  46.             if buycon
  47.                 traderBuy(HandleList(1),targetList(k).Market,targetList(k).Code,shareNum,0,'market','buy');%开多单
  48.             elseif sellshortcon
  49.                 traderSellShort(HandleList(1),targetList(k).Market,targetList(k).Code,shareNum,0,'market','sellshort');%开空单
  50.             end
  51.         end
  52.         
  53.         if  marketposition>0 && buycon0
  54.             traderSell(HandleList(1),targetList(k).Market,targetList(k).Code,shareNum,0,'market','sell');%平多单
  55.         end
  56.         
  57.         if  marketposition<0 && sellcon0
  58.             traderBuyToCover(HandleList(1),targetList(k).Market,targetList(k).Code,shareNum,0,'market','buytocover');%平空单
  59.         end
  60.     end
  61.     if cont==0
  62.         traderPositionTo(HandleList(1),targetList(k).Market,targetList(k).Code,0 ,0,'market','out');
  63.     end
  64. end
  65. end

  66. function ATRValue=ATR(High,Low,Close,Length)
  67. ATRValue=zeros(length(High),1);
  68. TRValue=zeros(length(High),1);
  69. 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);
  70. ATRValue=MA(TRValue,Length);
  71. end

  72. function MAValue=MA(Price,Length)
  73. MAValue=zeros(length(Price),1);
  74. for i=Length:length(Price)
  75.     MAValue(i)=sum(Price(i-Length+1:i))/Length;
  76. end
  77. MAValue(1:Length-1)=Price(1:Length-1);
  78. end
  79. %--------------------------------------------------------------------------分割线,下面是另一个.m文件---------------------%
  80. %策略回测函数
  81. clear
  82. clc;
  83. %-----------获取targetList-----------------%

  84. targetList(1).Market = 'CFFEX';
  85. targetList(1).Code = 'IF0000';
  86. targetList=targetList(1);
  87. %指定交易频率
  88. freq=3;

  89. %-----------------------回测----------------------------------%
  90. % 在回测时设置初始资本10000000000元、手续费率0.000026、无风险利率0.02、滑价0、默认1下一个bar的开盘价、默认0成交价、默认0直接成交
  91. % traderSetBacktest(1000000,0.000026,0.02,0,1,0,0);
  92. AccountList(1) = {'FutureBackReplay'};
  93. traderRunBacktest('rangebreak',@RangeBreak,{freq},AccountList,targetList,'min',freq,20150101,20160815,'FWard');
复制代码
策略的相关表现:
利润靠前的交易资料:
收益率靠前的交易资料
多头&空头&权益曲线的表现
多头表现
空头表现
权益曲线
策略绩效表现:
策略绩效指标表现
策略绩效分析





二维码

扫码加我 拉你入群

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

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

关键词:break range RAN bre position 经典

7140.tm.png (29.54 KB)

月度盈利情况

月度盈利情况

712F.tm.png (56.59 KB)

策略的周期分析

策略的周期分析

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
accumulation + 100 + 1 + 1 + 1 精彩帖子
fantuanxiaot + 44 + 44 精彩帖子

总评分: 经验 + 144  论坛币 + 44  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

本帖被以下文库推荐

沙发
zhouwenzi 发表于 2016-11-10 16:42:42 |只看作者 |坛友微信交流群
怎么改个字都要被重新审核

使用道具

藤椅
zhouwenzi 发表于 2016-11-10 16:43:18 |只看作者 |坛友微信交流群
强迫症就不应该重新编辑帖子

使用道具

板凳
3862161 在职认证  发表于 2016-11-10 17:23:20 |只看作者 |坛友微信交流群
zhouwenzi 发表于 2016-11-10 16:42
怎么改个字都要被重新审核
看起来还是可以的  什么频率  

使用道具

报纸
zhouwenzi 发表于 2016-11-10 17:34:15 |只看作者 |坛友微信交流群
3862161 发表于 2016-11-10 17:23
看起来还是可以的  什么频率
这个信息可以看回测函数的代码。freq=3,然后前面回测命令函数traderRunBacktest里面,freq前的为频率称号,这里是‘min’,也就是以3min为回测频率~

使用道具

地板
3862161 在职认证  发表于 2016-11-10 17:36:14 |只看作者 |坛友微信交流群
zhouwenzi 发表于 2016-11-10 17:34
这个信息可以看回测函数的代码。freq=3,然后前面回测命令函数traderRunBacktest里面,freq前的为频率称号 ...
你里面的 多头出场不是昨日的额低点么  为什么还要写成range  实时变动?

使用道具

7
3862161 在职认证  发表于 2016-11-10 17:37:22 |只看作者 |坛友微信交流群
buycon0=close(end)<upline-0.25*range;   upline 代替掉就是今日open了

使用道具

8
zhouwenzi 发表于 2016-11-10 17:41:58 |只看作者 |坛友微信交流群
3862161 发表于 2016-11-10 17:37
buycon0=close(end)
嗯嗯,就是以今天开盘价作为出场点,今天开盘价是不动,不是浮动的

使用道具

9
zhouwenzi 发表于 2016-11-10 17:43:40 |只看作者 |坛友微信交流群
3862161 发表于 2016-11-10 17:36
你里面的 多头出场不是昨日的额低点么  为什么还要写成range  实时变动?
调了一下参数,之前试了一下0.5range,发现效果没有这个好~

使用道具

10
guswanto88 发表于 2016-11-10 19:15:02 |只看作者 |坛友微信交流群
thank you

使用道具

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

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

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

GMT+8, 2024-4-27 06:53