//声明参数
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编辑过]