单就代码本身来讲:HOW:=CASH*0.01/N;{波动性百分比决定头寸规模} 可以放在各分支之上,无论怎样都是要算此值的。 ENTERPRICE:买入价格,表示上次交易的买入价格。 BUY(HOW,STOP,ENTERPRICE+0.5*N);{在上头寸(即第二头寸)+0.5个N以STOP指令买进} HOW数量的股票,这段代码最无争议也是海龟交易系统的精髓。 但如果有PositionCount=5或以上的情况怎么处理呢?
................................................. IF BARPOS>=20 THEN BEGIN //因为这里采用的是20日突破系统,所以日线至少等于或大于20。 ///////////////////////////// IF BARPOS=20 THEN //注意:此条件结构只执行一次,这里的N代表前一日 N:=MA(TR,20); //N。初次计算前一日N时海龟用20日的TR简单平均表示。 ////////////////////////// ///////////////////////// IF DayCount=5 OR BARPOS=20 THEN BEGIN//是的“DayCount=5”初值不是5,所以加了个OR,当“BARPOS=20”时表示第一次计算N。 N:=(19*N+TR)/20;//计算N值 DayCount:=1; END DayCount:=DayCount+1; .................................................... END ENTERBARS:在未买入的话是“空”,买入后从0开始计算。EXITBARS同理。 在“IF PositionCount=4 THEN BEGIN BUY(HOW,STOP,ENTERPRICE+0.5*N); END” 后再加入“ IF PositionCount=5 THEN BEGIN BUY(HOW,STOP,ENTERPRICE+0.5*N); END”就可以了。 “MAX(HIGH,CLOSE[1])-MIN(LOW,CLOSE[1]);” 计算TR应该非常正确啊。这个我到测试过了,和分析家的算法 “MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));”结果一样。
或者(结果一样): VARIABLE:dayCount=1,PositionCount=1; VARIABLE:EntAndExitSign=0,SellSign=0; VARIABLE:True=1,False=0; TR :=MAX(HIGH,CLOSE[1])-MIN(LOW,CLOSE[1]); IF BARPOS>=20 THEN BEGIN {/////////////////////////////////////////////} IF BARPOS=20 THEN N:=MA(TR,20); {///////////////////////////////////////////////} IF DayCount=5 OR BARPOS=20 THEN BEGIN{5天调整N值} N:=(19*N+TR)/20;{计算N值} DayCount:=1; END DayCount:=DayCount+1; {/////////////////////////////////////////////} EntPoint:=ENTERBARS; IF EntPoint=EntAndExitSign THEN BEGIN{说明STOP指令买进头寸成功} PositionCount:=PositionCount+1;{头寸计数} SellSign:=True;{开始以STOP卖出,如果达到指定的价格} END ExitPoint:=EXITBARS; IF ExitPoint=EntAndExitSign THEN BEGIN {说明卖出成功} PositionCount:=1;{头寸计算复原} SellSign:=False; END {///////////////////////////////////////////////} HOW:=CASH*0.01/N;;{波动性百分比决定头寸规模} IF PositionCount=1 THEN BEGIN{第一头寸} BUY(HOW,STOP,HHV(H,20));{在20日新高STOP指令买进} END IF PositionCount=2 THEN BEGIN{如到第二头寸} BUY(HOW,STOP,ENTERPRICE+0.5*N);{在上头寸(即第一头寸)+0.5个N以STOP指令买进} END IF PositionCount=3 THEN BEGIN BUY(HOW,STOP,ENTERPRICE+0.5*N); END IF PositionCount=4 THEN BEGIN BUY(HOW,STOP,ENTERPRICE+0.5*N); END {///////////////////////////////////////////////} IF SellSign=True THEN BEGIN IF ENTERPRICE-2*N<LLV(LOW,10) THEN SELL(100%,STOP,LLV(LOW,10));{退出离盈利头寸} ELSE SELL(100%,STOP,ENTERPRICE-2*N);{退出亏损头寸} END {///////////////////////////////////////////////} END;{////////////////此END对应IF BARPOS>=20 THEN BEGIN ///////////////////////////////};
第一个最大争议依然在此处: IF DayCount=5 OR BARPOS=20 THEN BEGIN{5天调整N值} N:=(19*N+TR)/20;{计算N值} DayCount:=1; END 假设一个特殊情况:对一支新股,刚好上市20天,那么BARPOS=20或对一支BARPOS=20 的新股票,其N值在前面的语句就已经计算了的啊? IF BARPOS=20 THEN N:=MA(TR,20); 依此次的“或”条件IF DayCount=5 OR BARPOS=20 THEN BEGIN,是一定还要再算一次的N:=(19*N+TR)/20,这样对一个BARPOS=20 的股票就有两个N了。
这里引伸出一个问题 如果 N:=(19*N+TR)/20 就是5天调整N值的算法,什么是进行这种修正的条件呢? 战神兄的条件是: IF DayCount=5 OR BARPOS=20 THEN BEGIN。。。。 这样肯定是不妥的啊! 怎样的写法才能让计算机明白呢?
看了这段后似乎有点明白了 波动性----N的含意 海龟用一个理查德.丹尼斯和比尔.埃克哈特称之为N的概念来表示某个特定市场根本的波动性。 N就是TR(True Range,实际范围)的20日指数移动平均,现在更普遍地称之为ATR。从概念上来看,N表示单个交易日某个特定市场所造成的价格波动的平均范围,它说明了开盘价的缺口。N同样用构成合约基础的点(points)进行度量。 每日实际范围的计算: TR(实际范围)=max(H-L,H-PDC,PDC-L) 式中: H-当日最高价 L-当日最低价 PDC-前个交易日的收盘价 用下面的公式计算N: N=(19×PDN+TR)/20 式中: PDN-前个交易日的N值 TR-当日的实际范围 因为这个公式要用到前个交易日的N值,所以,你必须从实际范围的20日简单平均开始计算初始值。
“N:=MA(TR,20); ”这里的N其实是当第一次的PDN(即海龟说的“实际范围”的20日简单平均开始计算初始值),每个Symbol只执行一次。 为的是计算“N:=(19*N+TR)/20”时需要。以后PDN都将是前一日的N,而“N:=MA(TR,20);”不会再执行。 其实要理解最好用分析家调试器观察。 结构不会错的。可以直接把下面这一段COPY到分析家的公式编辑器后从幅图看输出的N值是不是5天调整一次。(不过dayCount初值为0而不是1否则,像上面我写的是4天调整一次N了) VARIABLE:dayCount=0; TR :=MAX(HIGH,CLOSE[1])-MIN(LOW,CLOSE[1]); IF BARPOS>=20 THEN BEGIN {/////////////////////////////////////////////} IF BARPOS=20 THEN N:=MA(TR,20); IF DayCount=5 OR BARPOS=20 THEN BEGIN{5天调整N值} N19*N+TR)/20;{计算N值} DayCount:=0; END DayCount:=DayCount+1; END;
请教战神兄一简单问题:下面这段代码 IF BARPOS=20 THEN N:=MA(TR,20); IF DayCount=5 OR BARPOS=20 THEN BEGIN{5天调整N值} N19*N+TR)/20;{计算N值} DayCount:=0; END 对于上市一年的公司BARPOS=20 是不成立的,也即最初的N是不可能计算的啊!最初的值没有,后面的N也就无从谈起了啊!
将引用的贴出来共同研究一下 海龟交易系统是世界著名的机械交易系统(好坏自己评),对于想了解什么是交易系统的朋友们 应该是很好的入门。 一个机械的交易系统都有明确、唯一的买卖信号,比如二条均线就构成了一个交易系统,只不过它还是属于技术指标的范畴。完整的交易系统头寸(仓位)调整和风险控制是它的灵魂,而海龟就是这样的系统。 简介: 买卖信号:海龟的买卖很简单创20或50天新高就买入,创10天或20天新低就卖出,具体也可以自己调整。 头寸管理和险风控制策略:海龟使用总资金风险百分比和N波动的系数策略来决定买入多少、什么时候(用N确定)加仓、加多少并且以2N来确定保护性损止。 N每7天调整一次(五个交易日)。 好了这就是海龟,一个完整的交易系统。以下是我写的海龟交易系统的实现程序(测式版)。 VARIABLE:J=1,I=1,P=1; IF BARSCOUNT(C)>=20 THEN BEGIN IF P=5 OR BARSCOUNT(C)=20 THEN BEGIN {5个交易日调 N} TR := MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW)); N:=SMA(TR ,20 ,1 ); P:=1; END; P:=P+1; IF H=HHV(H,20) AND J=1 THEN BEGIN {创20日新高?} BB:=CASH*0.01/(N*100);{确定买多少} BB:=100*BB; BUY( BB); J:=0; END IF L=LLV(L,10) AND J=0 THEN BEGIN {创10日新低?全部卖出} SELL(); J:=1; I:=1; END IF C-ENTERPRICE>(N/2) AND i<4 AND J=0 THEN BEGIN {用 N加码部分,最多总共建仓4次} BB:=CASH*0.01/(N*100); BB:=100*BB; BUY( BB); I:=I+1; END; IF ENTERPRICE-C>=(2*N) THEN {用N止损} SELL(); END; 下图: BXXX是买入的股数(总共最多(以N确定加码多少和什么时候加码)4次,含加码部分),SXXX是卖出全部股数。(以总资金100W为例)
第一讲:海龟交易系统宣言 (更是学习笔记) 1。任何交易法则都只是成功交易的一部分(包括海龟交易系统)成功交易的最重要的方面是: 信心 连续性 纪律 2。不能或不愿遵守法则不会给你带来任何好处。不连续遵守法则的人就不会赚钱,就会从课程中掉队。 3。想求得成功的交易员会找到一条增强对自己的交易法则的信心的途径,以便能够连续地应用自己的法则 有信心有纪律连续地应用我们所学到的法则,是一切成功的全部秘密 海龟交易系统是一个完整的交易系统,它包括了交易的各个方面,实际上没有给交易员留下一点主观想象决策的余地。 海龟交易系统也是一套机械交易系统,对交易员在交易中必须制定的每项决策,海龟系统都会给出答案。 自信,一致性以及由彻底检测过的机械交易系统所保证的纪律,是大多数能够赢利的交易员成功的关键
第二版的FXJ海龟交易系统主要参考WLD的Turtle_original_V2,其实是模拟它的多头版本并加入五天调整N值和 头寸调整法则。 如果屏蔽掉WLD版Turtle_original_V2的空头信号和分析家版的“五天调整N值”,那么它们的买卖信号,介入价格将一致。 WLD(屏蔽掉了空头): var N, L1, S1, L2, S2, L3, S3, L4, S4, SE, LE, SL: float; var BAR, P : integer; for Bar := 20 to BarCount - 1 do begin //ApplyAutoStops(bar); if PriceClose(bar) > 5000 then setpositionsize(priceclose(bar)*1.1); SE := Highest( Bar, #High, 10); LE := Lowest( Bar, #Low, 10); if ActivePositionCount=3 then begin BuyAtStop( Bar + 1, L4, 'L4'); //ShortAtStop (Bar + 1, S4, 'S4'); end; if ActivePositionCount=2 then begin BuyAtStop( Bar + 1, L3, 'L3'); //ShortAtStop (Bar + 1, S3, 'S3'); end; if ActivePositionCount=1 then begin BuyAtStop( Bar + 1, L2, 'L2'); //ShortAtStop (Bar + 1, S2, 'S2'); end; if ActivePositionCount = 0 then begin N := ATR( Bar, 20 ); L1 := Highest( Bar, #High, 20); S1 := Lowest( Bar, #Low, 20); L2 := L1 +0.5*N; S2 := S1 -0.5*N; L3 := L2 +0.5*N; S3 := S2 -0.5*N; L4 := L3 +0.5*N; S4 := S3 -0.5*N; BuyAtStop( Bar + 1, L1, 'L1'); //ShortAtStop (Bar + 1, S1, 'S1'); end; for p := 0 to PositionCount -1 do begin if PositionActive(p) then if Positionlong(p) then SL := PositionEntryPrice(p)-2*N else SL := PositionEntryPrice(p)+2*N; end; for p := 0 to PositionCount -1 do begin if PositionActive(p) then if Positionlong(p) then SellAtStop( Bar + 1, SL, p, 'LongStop') else CoverAtStop( Bar + 1, SL, p, 'ShortStop'); if PositionActive(p) then if Positionlong(p) then SellAtStop( Bar + 1, LE, p, 'LongExit') else CoverAtStop( Bar + 1, SE, p, 'ShortExit'); end; end; FXJ(屏蔽掉了五天调整N值,直接像Turtle_original_V2 20突破调一次): VARIABLEositionCount=1; VARIABLE:EntAndExitSign=0,SellSign=0; VARIABLE:True=1,False=0; TR :=MAX(HIGH,CLOSE[1])-MIN(LOW,CLOSE[1]); IF BARPOS>=20 THEN BEGIN IF BARPOS=20 THEN N:=MA(TR,20); EntPoint:=ENTERBARS; IF EntPoint=EntAndExitSign THEN BEGIN PositionCount:=PositionCount+1; SellSign:=True; END ExitPoint:=EXITBARS; IF ExitPoint=EntAndExitSign THEN BEGIN PositionCount:=1; SellSign:=False; END IF PositionCount=1 THEN BEGIN N:=(19*N+TR)/20; HOW:=CASH*0.01/N; BUY(HOW,STOP,HHV(HIGH,20)); END IF PositionCount=2 THEN BEGIN HOW:=CASH*0.01/N; BUY(HOW,STOP,ENTERPRICE+0.5*N); END IF PositionCount=3 THEN BEGIN HOW:=CASH*0.01/N; BUY(HOW,STOP,ENTERPRICE+0.5*N); END IF PositionCount=4 THEN BEGIN HOW:=CASH*0.01/N; BUY(HOW,STOP,ENTERPRICE+0.5*N); END IF SellSign=True THEN BEGIN IF ENTERPRICE-2*N<LLV(LOW,10) THEN SELL(100%,STOP,LLV(LOW,10)); ELSE SELL(100%,STOP,ENTERPRICE-2*N); END END;