以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (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 ;
EXTGBDATASET(strPreEntryPrice,myEntryPrice ) ;
统一一下开仓价应该就可以了。
要么
tbuy( _TDEBUG,PosNum,LMT,h),ALLOWREPEAT ;
EXTGBDATASET(strPreEntryPrice,h ) ;
要么
tbuy( _TDEBUG,PosNum,LMT,myEntryPrice),ALLOWREPEAT ;
EXTGBDATASET(strPreEntryPrice,myEntryPrice ) ;


--  作者:admin
--  发布时间:2012/11/3 11:27:01
--  
谢谢分享,请发帖人在一周时间内回复确认问题是否解决,解决后请及时给解决人金币结贴,逾期版主将强行进行金币扣除,并惩罚性对不结贴用户的论坛积分进行扣除
[此贴子已经被作者于2012-11-3 11:27:20编辑过]