MACD论坛里一个海龟交易系统。

Discussion in 'General Topics on Software and Data' started by ilian, Aug 23, 2005.

  1. 单就代码本身来讲:HOW:=CASH*0.01/N;{波动性百分比决定头寸规模}
    可以放在各分支之上,无论怎样都是要算此值的。

    ENTERPRICE:买入价格,表示上次交易的买入价格。

    BUY(HOW,STOP,ENTERPRICE+0.5*N);{在上头寸(即第二头寸)+0.5个N以STOP指令买进} HOW数量的股票,这段代码最无争议也是海龟交易系统的精髓。

    但如果有PositionCount=5或以上的情况怎么处理呢?
     
  2. 这段代码表明海龟交易系统是一个多次买入一次卖出的系统而无论是盈利或亏损。

    不对称啊?不知是海龟系统的错或是代码作者的错?
     
  3.  
  4. .................................................

    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));”结果一样。
     
  5. 或者(结果一样):


    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 ///////////////////////////////};
     
  6. 第一个最大争议依然在此处:
    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了。
     
  7. 这里引伸出一个问题

    如果
    N:=(19*N+TR)/20
    就是5天调整N值的算法,什么是进行这种修正的条件呢?

    战神兄的条件是:

    IF DayCount=5 OR BARPOS=20 THEN BEGIN。。。。

    这样肯定是不妥的啊!

    怎样的写法才能让计算机明白呢?
     
  8. 看了这段后似乎有点明白了

    波动性----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日简单平均开始计算初始值。
     

  9. “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值}
    N:(19*N+TR)/20;{计算N值}
    DayCount:=0;
    END

    DayCount:=DayCount+1;
    END;
     
  10. 请教战神兄一简单问题:下面这段代码

    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:=0;
    END

    对于上市一年的公司BARPOS=20 是不成立的,也即最初的N是不可能计算的啊!最初的值没有,后面的N也就无从谈起了啊!
     
  11. BARPOS=20 的问题想明白了,即假定BARPOS为20开始计算N,但5天调整N是怎样成立的,希战神兄指点。
     
  12. 战神觉者:
    海龟交易系统中还缺少一段判断上次买入点是否获利的代码,如果上次获利下一次将被忽略。
     
  13. lee

    lee

    好,我也开始学习系统交易了,向大侠学习
     
  14. 将代码引入分析家后出来的图形不美观。因为是BMP所以不能传上。
    问题是存在的。
     
  15. 将引用的贴出来共同研究一下

    海龟交易系统是世界著名的机械交易系统(好坏自己评),对于想了解什么是交易系统的朋友们

    应该是很好的入门。

    一个机械的交易系统都有明确、唯一的买卖信号,比如二条均线就构成了一个交易系统,只不过它还是属于技术指标的范畴。完整的交易系统头寸(仓位)调整和风险控制是它的灵魂,而海龟就是这样的系统。

    简介:

    买卖信号:海龟的买卖很简单创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为例)
     
  16. 将测试结果放上还看一看,在A股市场是无法实现盈利的,关键还在学习思路。
     
  17. 此段代码突出 了买与卖的动作,很清晰。
    但还是不明白IF P=5 OR BARSCOUNT(C)=20 THEN BEGIN {5个交易日调 N} 的条件作用。
     
  18. 最终的突破可能还得来自于:
    对海龟理论的透彻理解以及分析家常见编程写法的理解。
     
  19. 第一讲:海龟交易系统宣言 (更是学习笔记)

    1。任何交易法则都只是成功交易的一部分(包括海龟交易系统)成功交易的最重要的方面是:

    信心
    连续性
    纪律

    2。不能或不愿遵守法则不会给你带来任何好处。不连续遵守法则的人就不会赚钱,就会从课程中掉队。

    3。想求得成功的交易员会找到一条增强对自己的交易法则的信心的途径,以便能够连续地应用自己的法则

    有信心有纪律连续地应用我们所学到的法则,是一切成功的全部秘密



    海龟交易系统是一个完整的交易系统,它包括了交易的各个方面,实际上没有给交易员留下一点主观想象决策的余地。

    海龟交易系统也是一套机械交易系统,对交易员在交易中必须制定的每项决策,海龟系统都会给出答案。

    自信,一致性以及由彻底检测过的机械交易系统所保证的纪律,是大多数能够赢利的交易员成功的关键
     

  20. 第二版的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突破调一次):

    VARIABLE: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);
    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;