以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp) -- 策略编写求助区 (http://weistock.com/bbs/list.asp?boardid=11) ---- 20金币悬赏贴,非高手勿入 (http://weistock.com/bbs/dispbbs.asp?boardid=11&id=29779) |
-- 作者:金字塔散户 -- 发布时间:2012/10/12 14:57:12 -- 20金币悬赏贴,非高手勿入 //声明参数 Input : T20(20,15,60,1) ;
//进场的周期 Input : T10(10,10,30,1);
//出场的周期 Input : ATRLen(20,15,30,1) ; Input : PosNum(2,1,20,1) ;
//每次交易的手数 //声明变量 BuyOrderThisBar := 0 ;
//当前Bar有过交易 VARIABLE : _DEBUG = 1 ;
//是否输出前台交易指令 VARIABLE : _TDEBUG = 1 ;
//是否输出后台交易指令 VARIABLE : _DEBUGOUT = 1 ;
//是否输出后台交易的调试信息 VARIABLE : myEntryPrice =0 ;
//开仓价格 VARIABLE : myExitPrice =0 ;
//平仓价格 VARIABLE : TurtleUnits=0 ;
//交易单位 VARIABLE : Position=0 ;
//仓位状态 //0表示没有仓位,1表示持有多头, -1表示持有空头 VARIABLE : T20Hi=Close ;
//20周期的高点 VARIABLE : T20Lo=Close ;
//20周期的低点 VARIABLE : T10Hi=Close ;
//10周期的高点 VARIABLE : T10Lo=Close ;
//10周期的低点 //准备需要计算的变量 T20Hi := ref(hhv(h,T20),1) ; T20Lo := ref(llv(l,T20),1) ; T10Hi := ref(hhv(h,T10),1) ; T10Lo := ref(llv(l,T10),1) ; AvgTR := ref(MA(TR,ATRLen),1) ; //采用全局变量保存最后一根K线的计算状态 strEntryBarPos:=strcat(STKLABEL,\'EntryBarPos\') ; strExitBarPos:=strcat(STKLABEL,\'ExitBarPos\') ; strPreEntryPrice:=strcat(STKLABEL,\'PreEntryPrice\') ; strTurtleUnits:=strcat(STKLABEL,\'TurtleUnits\') ; strPosition:=strcat(STKLABEL,\'Position\') ; strPreN:=strcat(STKLABEL,\'PreN\') ; If NOT ( workmode=1 ) then Begin
DRAWTEXTEX(1 ,0 ,0 ,0 ,\'提示:本公式仅用于后台交易!\' ),coloryellow ;
Exit ; End //If //开始执行时 初始化数据 //注意:第一个数据的Barpos=1 If BARPOS=1 Then Begin
//Position := 0 ; End //If //如果当前棒是最后一根K线,执行 If IsLastBar Then Begin
// 如果最后一根K线发生过出场信号,则那一根K线不再交易
If EXTGBDATA(strExitBarPos) = Barpos Then Begin
Goto ContinueLine ;
End
//恢复上一秒计算时保存的数据
//如果记录的进场barpos和当前的相等,说明上一个进场信号也是最后一根K线发出的。
If EXTGBDATA(strEntryBarPos) = Barpos Then Begin
myEntryPrice := EXTGBDATA(strPreEntryPrice) ;
TurtleUnits := EXTGBDATA(strTurtleUnits) ;
Position := EXTGBDATA(strPosition) ;
N := EXTGBDATA(strPreN) ;
End
//如果当前是没有持仓的状态
If Position=0 and BARPOS>T20 and h>l Then Begin
//建立多头进场条件
Long := h > T20Hi ;
//多头进场符合
if Long then begin
myEntryPrice := IF(Open>T20Hi+MINDIFF ,Open ,T20Hi+MINDIFF ) ;
Position := 1 ;
TurtleUnits := 1 ;
N := AvgTR ;
tbuy( _TDEBUG,PosNum,LMT,h),ALLOWREPEAT ;
EXTGBDATASET(strEntryBarPos,Barpos ) ;
EXTGBDATASET(strPreEntryPrice,myEntryPrice ) ;
EXTGBDATASET(strTurtleUnits,TurtleUnits ) ;
EXTGBDATASET(strPosition,Position ) ;
EXTGBDATASET(strPreN,N ) ;
end //if多头进场符合
//如果当前持有多头仓位的状态
If Position=1 and BARPOS>T20 and h>l Then Begin
//多头加仓条件
If (High>myEntryPrice+0.5*N) and TurtleUnits<4 Then Begin
myEntryPrice := IF(Open>myEntryPrice+0.5*N ,Open ,myEntryPrice+0.5*N ) ;
myEntryPrice := Ceiling(myEntryPrice/MINDIFF)*MINDIFF ;
TurtleUnits := TurtleUnits+1 ;
tbuy( _TDEBUG,PosNum,LMT,h),ALLOWREPEAT ;
EXTGBDATASET(strEntryBarPos,Barpos ) ;
EXTGBDATASET(strPreEntryPrice,myEntryPrice ) ;
EXTGBDATASET(strTurtleUnits,TurtleUnits ) ;
EXTGBDATASET(strPosition,Position ) ;
End //IF多头加仓条件
//建立多头离场条件
LongX1 := (low < T10Lo) ;
if LongX1 and EXTGBDATA(strEntryBarPos)<>Barpos and EXTGBDATA(strExitBarPos)<>Barpos then begin
myExitPrice := IF(Open<T10Lo-MINDIFF ,Open ,T10Lo-MINDIFF ) ;
Position := 0 ;
TurtleUnits := 0 ;
tsell( _TDEBUG ,0,LMT,l),ALLOWREPEAT;
EXTGBDATASET(strExitBarPos,Barpos ) ;
EXTGBDATASET(strTurtleUnits,TurtleUnits ) ;
EXTGBDATASET(strPosition,Position ) ;
end
//建立多头止损条件
LongX2 := (Low<myEntryPrice-2*N) ;
if LongX2 and Position=1 and EXTGBDATA(strEntryBarPos)<>Barpos and EXTGBDATA(strExitBarPos)<>Barpos then begin
myExitPrice := IF(Open<myEntryPrice-2*N ,Open ,myEntryPrice-2*N ) ;
myExitPrice := Floor(myExitPrice/MINDIFF)*MINDIFF ;
Position := 0 ;
TurtleUnits := 0 ;
tsell( _TDEBUG ,0,LMT,l),ALLOWREPEAT;
EXTGBDATASET(strExitBarPos,Barpos ) ;
EXTGBDATASET(strTurtleUnits,TurtleUnits ) ;
EXTGBDATASET(strPosition,Position ) ;
end
Goto ContinueLine ;
End //If如果当前持有多头仓位的状态
//如果以上3种情形都没有成立,则直接结束本次判断
Goto ContinueLine ; End //If如果当前棒是最后一根K线 //不是最后一根K线的情形 //如果当前是没有持仓的状态 If Position=0 and BARPOS>T20 and h>l Then Begin
//建立多头进场条件
Long := h > T20Hi ;
//多头进场
if Long then begin
myEntryPrice := IF(Open>T20Hi+MINDIFF ,Open ,T20Hi+MINDIFF ) ;
//buy( _DEBUG,PosNum,limitr,myEntryPrice+MINDIFF);
Position := 1 ;
TurtleUnits := 1 ;
N := AvgTR ;
BuyOrderThisBar := 1;
end //if
//不要跳转,让程序检查同一根K线是否可以加仓
//Goto ContinueLine ; End //If //如果当前持有多头仓位的状态 If Position=1 and BARPOS>T20 and h>l Then Begin
//多头加仓条件
While (High>myEntryPrice+0.5*N) and TurtleUnits<4 Do Begin
myEntryPrice := IF(Open>myEntryPrice+0.5*N ,Open ,myEntryPrice+0.5*N ) ;
myEntryPrice := Ceiling(myEntryPrice/MINDIFF)*MINDIFF ;
//buy( _DEBUG, PosNum, limitr, myEntryPrice);
TurtleUnits := TurtleUnits+1 ;
BuyOrderThisBar := 1;
End //While
//建立多头离场条件
LongX1 := (low < T10Lo) ;
if LongX1 and BuyOrderThisBar=0 then begin
myExitPrice := IF(Open<T10Lo-MINDIFF ,Open ,T10Lo-MINDIFF ) ;
//sell( _DEBUG ,0,limitr,myExitPrice-MINDIFF);
Position := 0 ;
TurtleUnits := 0 ;
end
//建立多头止损条件
LongX2 := (Low<myEntryPrice-2*N) ;
if LongX2 and Position=1 and BuyOrderThisBar=0 then begin
myExitPrice := IF(Open<myEntryPrice-2*N ,Open ,myEntryPrice-2*N ) ;
myExitPrice := Floor(myExitPrice/MINDIFF)*MINDIFF ;
//sell( _DEBUG ,0,limitr,myExitPrice);
Position := 0 ;
TurtleUnits := 0 ;
end
Goto ContinueLine ; End //If //显示账户状态 ContinueLine@ 资产:TASSET,LINETHICK0; //可用现金:CASH(0),LINETHICK0; Pos:THOLDING,LINETHICK0; //交易次数:TOTALDAYTRADE, LINETHICK0 ; //ep:myEntryPrice ; //
DEBUGOUT(\'Position=%.0f\' ,Position ) ; //
DEBUGOUT(\'TurtleUnits=%.0f\' ,TurtleUnits ) ; //
DEBUGOUT(\'BarPos=%.0f\' ,BARPOS ) ; //
DEBUGOUT(\'myEntryPrice=%.0f\' ,myEntryPrice ) ; If _DEBUGOUT>0 and IsLastBar Then Begin
DEBUGFILE2(\'c:\\debugfile.txt\',\'BarPos=%.0f\' ,BARPOS,1) ;
DEBUGFILE2(\'c:\\debugfile.txt\',\'T20Hi=%.2f\' ,T20Hi ,1) ;
DEBUGFILE2(\'c:\\debugfile.txt\',\'N=%.2f\' ,N ,1) ;
DEBUGFILE2(\'c:\\debugfile.txt\',\'AvgTR=%.2f\' ,AvgTR ,1) ;
DEBUGFILE2(\'c:\\debugfile.txt\',\'Position=%.0f\' ,Position,1 ) ;
DEBUGFILE2(\'c:\\debugfile.txt\',\'TurtleUnits=%.0f\' ,TurtleUnits,1 ) ;
DEBUGFILE2(\'c:\\debugfile.txt\',\'Open=%.2f\' ,O ,1) ;
DEBUGFILE2(\'c:\\debugfile.txt\',\'High=%.2f\' ,H ,1) ;
DEBUGFILE2(\'c:\\debugfile.txt\',\'Low=%.2f\' ,L ,1) ;
DEBUGFILE2(\'c:\\debugfile.txt\',\'Close=%.2f\' ,C ,1) ;
DEBUGFILE2(\'c:\\debugfile.txt\',\'myEntryPrice=%.0f\' ,myEntryPrice ,1) ; End //If 金字塔提供的后台模版,主要是重复开仓的问题,以下是说明 1.多头部分,1秒轮询,加仓的那段代码会出现重复开仓的情况。举个tick的例子,假设系统准备在2000点开多,如果实盘股指按照1999.8,2000,2000.2,2000,1999.8,2000这样跳动,那么2000点就会重复开仓。 2.不是用全局变量就能控制那么简单的,开仓后给全局变量赋值这是行不通的,因为不是单次开仓,而是有加仓的环节。 3.不欢迎空口说思路不实际操作的回帖,只接受修改好的完整代码或者完整代码加修改思路。 4.版上高手还是非常多的,希望能够得到你们的帮助,金币不多,在此先谢过。 [此贴子已经被作者于2012-10-12 14:57:56编辑过]
|
-- 作者:jiangsen -- 发布时间:2012/10/14 19:19:02 -- 别指望了,版上没什么高手,就算是200金币也白搭 |
-- 作者:3dian -- 发布时间:2012/11/2 15:41:47 -- 已经帮你解决,给金币吧,呵呵! |
-- 作者:admin -- 发布时间:2012/11/2 17:41:09 -- 你怎么解决的啊,分享一下啊 |
-- 作者:3dian -- 发布时间:2012/11/3 10:08:21 -- 这个例子是金字塔提供的后台交易系统的海龟例子,里面有一个小bug,就是myEntryPrice记录的不正确。当股价单边走,不会出现这个bug,问题就在于窄幅震荡的时候, 下面的语句记录就有点问题了: tbuy( _TDEBUG,PosNum,LMT,h),ALLOWREPEAT ; |
-- 作者:admin -- 发布时间:2012/11/3 11:27:01 -- 谢谢分享,请发帖人在一周时间内回复确认问题是否解决,解决后请及时给解决人金币结贴,逾期版主将强行进行金币扣除,并惩罚性对不结贴用户的论坛积分进行扣除 [此贴子已经被作者于2012-11-3 11:27:20编辑过]
|