仁心慧能 发表于 2012-9-15 22:13:01

金魔方智能交易攻略(3)-日内交易之开盘区间突破

本帖最后由 仁心慧能 于 2012-9-15 22:17 编辑

金魔方智能交易攻略(3)-日内交易之开盘区间突破作者:仁心慧能

日内交易常用的一类策略是开盘区间突破,它与前例的通道突破策略相似,其基本公式是://-------金魔方智能交易公式--------------
//例3_1 开盘区间突破策略
//用于分钟线周期
{策略:
1.当日开盘价加减指定价差形成区间
2.突破区间高点做多,跌破区间低点做空
3.当天仅做多1次,做空1次
4.日内交易,收盘前清仓
}
input:                                       
  Rng(10),        //区间范围
  EndTime(1400);  //下午14:00以后不开仓
RngH: OpenD(0) + Rng;
RngL: OpenD(0) - Rng;
if Time < EndTime*100 then begin
  if EntriesToday(Date,MP_LONG)<1 then
    Buy('', 2, RngH, -1, OT_STOP);
  if ExitsToday(Date,MP_SHORT)<1 then
    SellShort('', 2, RngL, -1, OT_STOP);
end;
SetExitOnClose;
{
注解:
1.OpenD(0)返回当日开盘价,这套函数在日内交易时方便常用;
2.EntriesToday(Date,MP_LONG)取得当天多头开仓次数,MP_LONG 是值为1的宏;
3.ExitsToday (Date,MP_SHORT)取得当天空头平仓次数,MP_SHORT 是值为-1的宏;
4.SetExitOnClose用于在收市时清仓,历史测评时以收盘价作为平仓价,自动交易时在收市前若干秒平仓,可在【策略设置】中设置,默认在收市前60秒清仓。
}

如图所示,该策略以当日开盘价加减由Rng参数指定的范围,形成一个区间,当价格突破区间时进场交易,收盘时清仓不过夜。
上例的区间范围Rng是个常数,不能适应市场变动,所以Rng通常用各种算法得到,例如,著名的Dual Thrust系统曾长期在交易系统排行榜名列三甲,其原始公式应用于日线周期,不太能如实反映日内波动,我们把它改造为应用于分钟周期的策略://-------金魔方智能交易公式--------------
//例3_2 Dual Thrust日内策略
//用于1分钟-15分钟周期
{策略:
1.根据前几日的波动范围动态调整开盘区间
2.突破区间高点做多,跌破区间低点做空
3.可选是否持仓过夜
}
input:
  K1(0.5),K2(0.5),Mday(1),Nday(1),
  ExitOnClose(1);
variable:
  BarsPerDay(48), BuyRange(1000), SellRange(1000);
if BarPos = 1 then begin  //只需计算1次
  switch DataPeriod begin   //沪深300股指期货日周期数
    case 1: BarsPerDay:=270; //1分钟周期数/每日
    case 2: BarsPerDay:=54;  //5分钟周期数/每日
    case 3: BarsPerDay:=18;  //15分钟周期数/每日
  end
end
Bars:= Mday*BarsPerDay;
MHH := HHV(H,Bars);
MHC := HHV(C,Bars);
MLL := LLV(L,Bars);
MLC := LLV(C,Bars);
Bars:= Nday*BarsPerDay;
NHH := HHV(H,Bars);
NHC := HHV(C,Bars);
NLL := LLV(L,Bars);
NLC := LLV(C,Bars);

if Date <> Date then begin  //新交易日开始,计算区间范围
  BuyRange := Max(MHH - MLC, MHC - MLL);
  SellRange := Max(NHH - NLC, NHC - NLL);
end
RngH: OpenD(0) + K1*BuyRange;
RngL: OpenD(0) - K2*SellRange;

if SessionLastBar = 0 then begin
  Buy('', DEFAULT, RngH, -1, OT_STOP,OB_NEXTBAR);
  SellShort('', DEFAULT, RngL, -1, OT_STOP,OB_NEXTBAR);
end
if ExitOnClose then SetExitOnClose;
{  
注解:
1.用不同的参数分别设置买卖区间的幅度
2.BarsPerDay为1天的K线数量,只需在第1根K线时计算1次
  用switch语句根据周期类型赋值,公式中是股指期货的每日周期数量
3.HHV(H,Bars)表示取用前一周期的指标值
  可以把之前的:=改为:进行调试
4.SessionLastBar函数用于判断是否是当日最后一个周期
5.外部参数ExitOnClose控制是否做日内交易或持仓过夜
}如图所示:
可见,在同一时间段,本例的区间与上例相比较是动态变化的,各位可以修改公式参数看看运行结果。
在实际交易中,分批开平仓是常用的技巧,金魔方如何实现呢?
且听下回分解!


wh8510 发表于 2012-9-17 12:01:09

好好好!!!!!!!!!!!!!!

zdjie312 发表于 2012-9-17 13:12:59

不错,感谢楼主

wh8510 发表于 2012-9-20 15:10:29

请教楼主,逐根模式下,如何读取当日各周期下某根K线的最高价最低价开盘价和收盘价。
比如我想要15分钟周期下第一根K线的开盘价,收盘价和最高,最低价,用一下代码只能在附图指标上用,在交易策略上却用不了。
H1:=REF(H,BARSLAST(TIME=33300,1));
L1:=REF(L,BARSLAST(TIME=33300,1));
请问楼主应该如何修改?谢谢

John 发表于 2012-9-20 15:43:48

以下是分钟周期取当天第N根K线的收盘价:
// 分钟周期下每天的第N根k线收盘价
var:
  今天第N根K线收盘价(0),
  counter(0),
  N(2);
  
if date != date then // 新的一天
  counter = 0;
  
counter++;

if counter = N then   
今天第N根K线收盘价 = close;

output: 今天第N根K线收盘价;

333333 发表于 2012-9-22 02:00:42

if date != date then // 新的一天
  counter = 0;

应该是
if date != date then // 新的一天
  counter := 0;

John 发表于 2012-9-22 03:42:35

这位朋友眼力真好!不过 counter = 0 是没问题的,金语言赋值可以用 := 也可以用 =
而在 if a = b then 里面,等号是相等的意思。

wh8510 发表于 2012-9-22 09:11:37

John 发表于 2012-9-22 03:42 static/image/common/back.gif
这位朋友眼力真好!不过 counter = 0 是没问题的,金语言赋值可以用 := 也可以用 =
而在 if a = b then 里 ...

之前一直写不出来,用了你写的也是不行 ,后来重装了下就可以了 H1:=REF(H,BARSLAST(TIME=33300,1));
L1:=REF(L,BARSLAST(TIME=33300,1)); 也是可以定位K线的,貌似简单很多。 您写的我看着有点晕
date!=date【1】 没看懂是什么意思呢

仁心慧能 发表于 2012-9-22 11:48:52

date !=date表示当前K线的日期不等于前1根K线的日期,用于分钟线周期,表示新交易日开始,也可以写成 date <>date

wh8510 发表于 2012-9-22 17:05:21

仁心慧能 发表于 2012-9-22 11:48 static/image/common/back.gif
date !=date表示当前K线的日期不等于前1根K线的日期,用于分钟线周期,表示新交易日开始,也可以写成 da ...

谢谢管理员 学习了:lol
页: [1] 2 3
查看完整版本: 金魔方智能交易攻略(3)-日内交易之开盘区间突破