应一哥们建议写下R-Breaker系统,根据昨日价格计算出六个价位作为今日盘中交易的参考价位,只是比Pivot Points的设置少了一个枢轴点。它的买卖规则也不难理解,即突破上区间,做多;破下区间,做空。做多后,回撤至次上区间,则认为假突破,反手;做空类似。
这个系统很有名,我也不废话了,直接附上TB论坛里穿堂风大神分享的代码了,解读如下:
Params
Numeric notbef(9.00);//声明数值参数notbef,初值为9.00,其实不用这个直接表示Time>0.0900更方便的。//
Numeric notaft(14.55);//声明数值参数notaft,初值为14.55,同理的,可在正文直接表示Time<0.1455。//
Numeric f1(0.35);//声明数值参数f1,初值为0.35.//
Numeric f2(0.07);//声明数值参数f2,初值为0.07.//
Numeric f3(0.25);//声明数值参数f3,初值为0.25.//
Numeric reverse(1.00);//声明数值参数reverse,初值为1.00.//
Numeric rangemin(0.2);//声明数值参数rangemin,初值为0.2.//
Numeric xdiv(3);//声明数值参数xdiv,初值为3.//
Vars
NumericSeries ssetup(0);//声明数值序列变量ssetup,初值0.//
NumericSeries bsetup(0);//声明数值序列变量bsetup,初值0.//
NumericSeries senter(0);//声明数值序列变量senter,初值0.//
NumericSeries benter(0);//声明数值序列变量benter,初值0.//
NumericSeries bbreak(0);//声明数值序列变量bbreak,初值0.//
NumericSeries sbreak(0);//声明数值序列变量sbreak,初值0.//
NumericSeries ltoday(0);//声明数值序列变量ltoday,初值0.//
NumericSeries hitoday(9999);//声明数值序列变量hitoday,初值为9999.//
NumericSeries startnow(0);//声明数值序列变量startnow,初值0.//
NumericSeries div(0);//声明数值序列变量div,初值0.//
BoolSeries rfilter(false);////声明布尔型序列变量rfilter,初值为假。//
Numeric i_reverse;//声明数值变量i_reverse.//
Numeric i_rangemin;//声明数值变量i_rangemin.//
Numeric i_vB;//声明数值变量i_vB.//
Numeric i_vS;//声明数值变量i_vS.//
Begin
i_reverse = reverse*(OpenD(0)/100);//变量i_reverse = 参数reverse * (当天开盘价OpenD(0) / 100).//
i_rangemin = rangemin*(OpenD(0)/100);//变量i_rangemin = 参数rangemin * (当天开盘价OpenD(0) / 100).//
if(BarStatus==0)//当前为第一根k线的。//
{
startnow=0;//变量startnow = 0.//
div=max(xdiv,1);//代入相应参数,即Max(3,1),可得变量div = 3.//
}
if(Date != Date[1])//假如当前日期不等于前一天的日期的。//
{
SetGlobalVar(0,0);//全局变量,就是系统本身只定义了一个GlobalVar全局变量,这个全局变量一共有0到49共50个存储位置,你希望在第一个位置放进一个数据(在本软件中一般放下的是静态数据,不因K线的移动而改变),就用setglobalvar(0,你的数),放进第二个数又不希望覆盖第一个,就用setglobalvar(1,你的数),最多能放下共50个静态数据;然后是引用这些数据了,就用getglobalvar(存储位置)等等,这个全局变量最起码是生存于当前的程序模块中,比如用户函数、技术指标、K形态、特征走势、交易指令中。
设置setglobalvar(0,你的数),setglobalvar(1,你的数),setglobalvar(2,你的数),setglobalvar(3,你的数),.....可以设置到setglobalvar(49,你的数).
调用getglobalvar(0,你的数),getglobalvar(1,你的数),getglobalvar(2,你的数),getglobalvar(3,你的数),...getglobalvar(49,你的数)。//
SetGlobalVar(1,0);//设置第二个数据位置了,值为0。//
startnow=startnow+1;//变量startnow = 0 + 1.//
ssetup=hitoday[1]+f1*(Close[1]-ltoday[1]);//代入初始相应数值,即ssetup = 9999 + 0.35 * (前一根k线收盘价 - 0)。//
senter=((1+f2)/2)*(hitoday[1]+Close[1])-(f2)*ltoday[1]; //同上代入,senter = ((1+0.07)/2)*(9999+Close[1])-0.07*0.//
benter=((1+f2)/2)*(ltoday[1]+Close[1])-(f2)*hitoday[1];//同上代入相应数值了。//
bsetup=ltoday[1]-f1*(hitoday[1]-Close[1]);//同上的。//
bbreak=ssetup+f3*(ssetup-bsetup);//把上面求得的值代入就行了。//
sbreak=bsetup-f3*(ssetup-bsetup);//同上。//
hitoday=High;//变量hitoday = 当前最高价High//
ltoday=Low;//变量ltoday = 当前最低价Low//
rfilter=(hitoday[1]-ltoday[1])>=i_rangemin;//变量rfilter = (前一变量hitoday[1] - 前一变量ltoday[1]) >= i_rangemin,其实就是昨天振幅是否大于等于当前开盘价/100*0.2//
}
if(High>hitoday)//假如当前最高价大于hitoday,一般比如焦炭、螺纹很少大于的,铜、锌到是可以。//
{
hitoday=High;//变量hitoday = 当前最高价。//
}
if(Low
{
ltoday=Low;//变量itoday = 当前最低价。//
}
if(Time*100>=notbef and Time*100=2 and rfilter)//假如时间大于9点,并且小于两点五十五分,并且变量startnow >=2 并且rfilter为真。//
{
if(Time != GetGlobalVar(1) and GetGlobalVar(1) != 0)//getglobalvar(1)获取上面我们已经设置的第二个位置,假如时间不等于位置2数值,并且位置2数值不等于0的时候,才执行下列语句(显然我们上边设置第二位置值为0,不符合这个条件的)。//
{
SetGlobalVar(1,10000);//设置第二位置,值为10000.//
}
if(hitoday>=ssetup and marketposition>-1 and GetGlobalVar(1)<1)//假如变量hitoday >= 变量ssetup,并且 MarketPosition >-1(觉得应该写成<>-1,要不然理解就是没有持仓,或者可以持有多单时),并且获取位置2的数值(初值0)小于1的。//
{
If(Low<=(senter+(hitoday-ssetup)/div))//代入上面算得的数值,假如当前最低价Low <= (变量senter + (变量hitoday - 变量ssetup)/3).//
{
SellShort(1,senter+(hitoday-ssetup)/div);//卖出1手,价格就是依据这个(变量senter + (变量hitoday - 变量ssetup)/3)算得的值。//
SetGlobalVar(1,Time);//这个设置第二位置,值为当前时间,设置这个时间,我也不知道干啥用的。//
Return;//不再执行了。//
}
}
if(ltoday<=bsetup and marketposition<1 and GetGlobalVar(1)<1)//假如变量itoday <= 变量bsetup,并且MarketPosition <1,并且获取位置2的数值(初值0)小于1的。//
{
If(High>=(benter-(bsetup-ltoday)/div))//假如当前最高价High >= (变量benter - (变量bsetup - 变量ltoday)/3)//
{
Buy(1,benter-(bsetup-ltoday)/div);//买1手,价格就是依据这个(变量benter - (变量bsetup - 变量ltoday)/3)算得的值了。//
SetGlobalVar(1,Time);//设置第二位置,值为当前时间。//
Return;//不再执行。//
}
}
if(marketposition==-1)//假如持有空单的情况。//
{
SetGlobalVar(0,1);//设置第一位置,值为1.//
if(High-EntryPrice>=i_reverse)//假如当前最高价High - 进场价EntryPrice >=变量i_reverse值//
{
BuyToCover(1,entryprice+i_reverse);//平仓1手,价格为进场价EntryPrice + 变量i_reverse值//
Return;//不再执行。//
}
}
if(marketposition==1)//假如持有多单。//
{
SetGlobalVar(0,1);//设置第一位置,值为1.//
if(EntryPrice-Low>=i_reverse)//假如进场价EntryPrice - 当前最低价Low >= 变量i_reverse值//
{
Sell(1,entryprice-i_reverse);//平仓1手,价格为进场价EntryPrice - 变量i_reverse值//
Return;//不再执行。//
}
}
if(marketposition==0)//假如没有持仓的时候。//
{
if(High>=bbreak and GetGlobalVar(0) == 0)//假如当前最高价 >=变量bbreak ,并且获取第一位置值(初值0)等于0.//
{
Buy(1,bbreak);//买一手,价格为bbreak值。//
Return;//不再执行。//
}
}
if(marketposition==0)//假如没有持仓情况。//
{
if(low<=sbreak and GetGlobalVar(0) == 0)//当前最低价Low <=sbreak,并且获取第一位置数值(初值0)等于0.//
{
SellShort(1,sbreak);//卖出1手,价格为sbreak值。//
Return;//不再执行。//
}
}
}
if(Time*100>=notaft and Time<0.1600)//假如时间大于两点五十五分,并且时间小于四点。//
{
if(marketposition==-1)//持有空单的时候。//
{
BuyToCover(1,Open);//以开盘价,平仓。//
}
if(marketposition==1)//持有多单的时候。//
{
Sell(1,Open);//以开盘价,平仓。//
}
}
End
这个系统我只解读,没有实盘,也没有在超级图表上测试的,但根据我自己解读的,我觉得要用这个系统,你得优化很多条件才行。