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

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

  1. 有一点相关

    file:///C:/Documents%20and%20Settings/p910332/Local%20Settings/Temporary%20Internet%20Files/Content.IE5/2JC7L2NM/256,1,客户期货投资中的有效决策
     
  2. 代码的结构分析

    第一个
    IF BARPOS>=20 THEN BEGIN
    END。
    代表仅对20天及以上的数据进行分析。此也是代码的常用语句。条件判断。

    第二个
    IF DayCount=5 OR BARPOS=20 THEN BEGIN{5天调整N值}
    END

    第三个

    IF EntPoint=EntAndExitSign THEN BEGIN{说明STOP指令买进头寸成功}

    第四个到第七个

    IF PositionCount=1 THEN BEGIN{第一头寸}
    HOW:=CASH*0.01/N;{波动性百分比决定头寸规模}
    BUY(HOW,STOP,HHV(H,20));{在20日新高STOP指令买进}
    END
    IF PositionCount=2 THEN BEGIN{如到第二头寸}
    HOW:=CASH*0.01/N;{波动性百分比决定头寸规模}
    BUY(HOW,STOP,ENTERPRICE+0.5*N);{在上头寸(即第一头寸)+0.5个N以STOP指令买进}
    END
    IF PositionCount=3 THEN BEGIN{如到第三头寸}
    HOW:=CASH*0.01/N;
    BUY(HOW,STOP,ENTERPRICE+0.5*N);{在上头寸(即第二头寸)+0.5个N以STOP指令买进}
    END
    IF PositionCount=4 THEN BEGIN
    HOW:=CASH*0.01/N;
    BUY(HOW,STOP,ENTERPRICE+0.5*N);
    END

    对 PositionCount的各种情况进行处理,实际运行时仅一种能够被选择。


    第八个
    IF SellSign=True THEN BEGIN
    ExitPoint:=EXITBARS+1;

    进行了一次增值运算。

    第九个
    IF ExitPoint=EntAndExitSign THEN BEGIN {说明卖出成功}
    PositionCount:=1;{头寸计算复原}
    SellSign:=False;

    二个条件判断:

    IF BARPOS=20 THEN

    IF ENTERPRICE-2*N<LLV(L,10) THEN
    SELL(100%,STOP,LLV(L,10));{退出离盈利头寸}
    ELSE
    SELL(100%,STOP,ENTERPRICE-2*N);{退出亏损头寸}
    END


    从清晰的角度讲第四个到第七个IF THEN BEGIN END改成

    SWITCH CASE 更易于阅读。

    要完全弄明白还需对结构中的函数进行学习。
     
  3. Re: 代码的结构分析

    这个程序还要改才合乎原意.
     
  4. 大飞兄不妨就给我们来个“海龟系统”三十讲,并带领大家做个完整的正宗的“海龟交易系统”
     
  5. 支持。期待。。。
     
  6. 支持。期待。。。
     
  7. 三十讲的题目讨论

    第一讲:海龟交易系统宣言
    。。。。。。。。。
    第三十讲:对海龟交易系统的评价

    大家一起来想想其余的题目。

    第二讲:何为海龟交易系统
    第三讲:头寸规模----海龟交易系统的精髓(一)
    第四讲:头寸规模----海龟交易系统的精髓(二)
    第五讲:海龟交易系统实战---入市
    第六讲:海龟交易系统实战---止损
    第七讲:海龟交易系统实战---离市
    第八讲:海龟交易系统实战---策略
    第九讲:海龟交易系统实战---其它

    有待细化。20051201
     
  8. 公式中用到的函数解析

    1. BARPOS 数据位置
    函数返回当前是第几根K线。特别的,对于日线数据就表示从上市到现在总共有多少交易日。
    4. BUY 买入
    本函数仅能用于交易系统。
    BUY(V,Type,P);
    表示买入V股当前股票,Type表示买入类型,P表示买入价格,所有参数均可以省略。
    V:买入股数或买入资金百分比(N%),省略表示100%;
    Type:可以是本周期收盘(THISCLOSE),次周期开盘(MARKET),次周期限价单(LIMIT),次周期停损单(STOP);
    P:对于限价单、停损单需要指定的买入价格
    例如:
    IF CLOSE>OPEN THEN
    BUY(1000,CLOSE);表示收阳线则在本周期收盘价上买入1000股。
    BUY(50%,LIMIT,CLOSE-0.2);表示在次周期CLOSE-0.2元位置下买入限价单,若价格达到或低于该价格则用50%资金买入。

    6. CASH 现金存量
    交易系统中当前的现金存量
    该函数仅在使用Buy,Sell新交易函数的交易系统中有效.

    7. ENTERBARS 买入位置
    交易系统中上次买入到当前的周期数
    该函数仅在使用Buy,Sell新交易函数的交易系统中有效.
    20. SELL 卖出
    本函数仅能用于交易系统。
    SELL(V,Type,P);
    表示卖出V股当前股票,Type表示卖出类型,P表示卖出价格,所有参数均可以省略。
    V:卖出股数或卖出持仓百分比(N%),省略表示100%;
    Type:可以是本周期收盘(THISCLOSE),次周期开盘(MARKET),次周期限价单(LIMIT),次周期停损单(STOP);
    P:对于限价单、停损单需要指定的卖出价格
    例如:
    IF CLOSE>OPEN THEN
    SELL(1000,CLOSE);表示收阳线则在本周期收盘价上卖出1000股。
    SELL(100%,LIMIT,CLOSE+0.2);表示在次周期CLOSE+0.2元位置下卖出限价单,若价格达到或高于该价格则卖出全部持仓。
    8. ENTERPRICE 买入价格
    交易系统中上次交易的买入价格
    该函数仅在使用Buy,Sell新交易函数的交易系统中有效.
    8. STOP 停损买入
    STOP,加入停损单,次周期达到设定价格即操作买入,否则放弃。
    所谓停损就是股价比设定的价格要差,具体说来对于买入或卖空就是高于设定价格,对于卖出或买空就是低于设定价格
     
  9. 逐个学

    1。BARPOS 数据位置
    函数返回当前是第几根K线。特别的,对于日线数据就表示从上市到现在总共有多少交易日。
    IF BARPOS>=20 THEN BEGIN
    END。

    *可认为新股上市20天后,才将其纳入系统的考虑范围*
    2。BARPOS=20 仅用于判断。但结合标准定义是取新股上市第二十天做为计算的起点。

    3。BUY 买入
    本函数仅能用于交易系统。
    BUY(V,Type,P);
    表示买入V股当前股票,Type表示买入类型,P表示买入价格,所有参数均可以省略。
    V:买入股数或买入资金百分比(N%),省略表示100%;
    Type:可以是本周期收盘(THISCLOSE),次周期开盘(MARKET),次周期限价单(LIMIT),次周期停损单(STOP);
    P:对于限价单、停损单需要指定的买入价格
    例如:
    IF CLOSE>OPEN THEN
    BUY(1000,CLOSE);表示收阳线则在本周期收盘价上买入1000股。
    BUY(50%,LIMIT,CLOSE-0.2);表示在次周期CLOSE-0.2元位置下买入限价单,若价格达到或低于该价格则用50%资金买入。


    HOW以做过计算:HOW:=CASH*0.01/N;{波动性百分比决定头寸规模}

    ENTERPRICE 买入价格
    交易系统中上次交易的买入价格
    该函数仅在使用Buy,Sell新交易函数的交易系统中有效.

    8. STOP 停损买入
    STOP,加入停损单,次周期达到设定价格即操作买入,否则放弃。
    所谓停损就是股价比设定的价格要差,具体说来对于买入或卖空就是高于设定价格,对于卖出或买空就是低于设定价格

    BUY(HOW,STOP,ENTERPRICE+0.5*N);
    {在上头寸(即第一头寸)+0.5个N以STOP指令买进HOW}

    4。SELL(100%,STOP,LLV(L,10));{退出离盈利头寸}
    SELL(100%,STOP,ENTERPRICE-2*N);{退出亏损头寸}

    20. SELL 卖出
    本函数仅能用于交易系统。
    SELL(V,Type,P);
    表示卖出V股当前股票,Type表示卖出类型,P表示卖出价格,所有参数均可以省略。
    V:卖出股数或卖出持仓百分比(N%),省略表示100%;
    Type:可以是本周期收盘(THISCLOSE),次周期开盘(MARKET),次周期限价单(LIMIT),次周期停损单(STOP);
    P:对于限价单、停损单需要指定的卖出价格
    例如:
    IF CLOSE>OPEN THEN
    SELL(1000,CLOSE);表示收阳线则在本周期收盘价上卖出1000股。
    SELL(100%,LIMIT,CLOSE+0.2);表示在次周期CLOSE+0.2元位置下卖出限价单,若价格达到或高于该价格则卖出全部持仓。
     
  10. 代码解读

    1。前三行申明了九个变量并赋了初始值。变量的作用已由其名字表明了。如:
    EntPoint:表示买入位
    ExitPoin:卖出点位
    2。TR :=MAX(HIGH,CLOSE[1])-MIN(LOW,CLOSE[1]);
    用来计算变动所谓的真实波动范围。
    MIN(LOW,CLOSE[1]:今天的最低价与昨日收盘价两量中较小的量。
    如此说来:MAX(HIGH,CLOSE[1])-MIN(LOW,CLOSE[1]); 是一个病句。真实波动范围的计算可参考海龟法则原文。
    3。第一个
    IF BARPOS>=20 THEN BEGIN
    END。
    代表仅对20天及以上的数据进行分析。此也是代码的常用语句。条件判断。也代表此系统仅考虑新股上市20天后的股票。
    4。条件分支IF BARPOS=20 THEN 在此处的意义似乎不是很大。没有它一样可进行N:=MA(TR,20),而且与第一个IF。。。。。END意思重合。
    5。IF DayCount=5 OR BARPOS=20 THEN BEGIN{5天调整N值}
    N:=(19*N+TR)/20;{计算N值}
    DayCount:=1;
    END
    从语义上并无不妥:当DayCount=5 OR BARPOS=20 任意一项满足时执行语句组
    BEGIN
    N:=(19*N+TR)/20;{计算N值}
    DayCount:=1;
    END
    其中N:=(19*N+TR)/20;{计算N值} 是海龟的精髓。

    但有几次赋值并不是很好:
    1)DayCount最初赋值为1,并无使用又被赋值为5,随后又还原为1,似乎有些乱。
    2)将DayCount=5 OR BARPOS=20 做为计算或5天调整N值的前提条件似乎也不是这样的定法,在计算式中未必然地体现出“5天调整N值”来。既使是的话也应为“与”。

    且前面的分支都有可能不被执行就到了此处。

    6。DayCount:=DayCount+1; EntPoint:=ENTERBARS+1;
    (ENTERBARS:买入位置,表示上次买入到当前的周期数。)
    两赋值也有混乱之嫌。或者不太明白其意义。ENTERBARS未有初始值。

    今天就到此了,请问此代码在分析家中运行成功吗?
     
  11. 这样分隔更易于各位理解(以下程序在分析家最新版本通过):

    VARIABLE:dayCount=1,PositionCount=1,SellSign=0;
    VARIABLE:EntAndExitSign=1,EntPoint=0,ExitPoint=0;
    VARIABLE:True=1,False=0,N=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+1;

    IF EntPoint=EntAndExitSign THEN BEGIN{说明STOP指令买进头寸成功}
    PositionCount:=PositionCount+1;{头寸计数}
    SellSign:=True;{开始以STOP卖出,如果达到指定的价格}
    END

    ExitPoint:=EXITBARS+1;

    IF ExitPoint=EntAndExitSign THEN BEGIN {说明卖出成功}
    PositionCount:=1;{头寸计算复原}
    SellSign:=False;
    END

    {///////////////////////////////////////////////}
    IF PositionCount=1 THEN BEGIN{第一头寸}
    HOW:=CASH*0.01/N;{波动性百分比决定头寸规模}
    BUY(HOW,STOP,HHV(H,20));{在20日新高STOP指令买进}
    END

    IF PositionCount=2 THEN BEGIN{如到第二头寸}
    HOW:=CASH*0.01/N;{波动性百分比决定头寸规模}
    BUY(HOW,STOP,ENTERPRICE+0.5*N);{在上头寸(即第一头寸)+0.5个N以STOP指令买进}
    END

    IF PositionCount=3 THEN BEGIN{如到第三头寸}
    HOW:=CASH*0.01/N;
    BUY(HOW,STOP,ENTERPRICE+0.5*N);{在上头寸(即第二头寸)+0.5个N以STOP指令买进}
    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(L,10) THEN
    SELL(100%,STOP,LLV(L,10));{退出离盈利头寸}
    ELSE
    SELL(100%,STOP,ENTERPRICE-2*N);{退出亏损头寸}
    END
    END;
     
  12. 在分析家版的海龟版编写技术中最重要的是这一段(下面代码)。此段代码块是用来管理多重头寸,并实现“止损(Stop )””指令精确买卖(在分析家的海龟第一版是用“收市价”进出)。因为以所谓的“市价(Market)”或者“收市价(ThisClose)”来进出场介入点将不精确,没有实战价值。而“次中价(NextMid)”等只有统计价值。只有“止损(或者以它为基础)和“
    限价(MARKET)”才具备实战价值,产生的实际执行误差(Slippage)最小。
    {///////////////////////////////////////////////}
    EntPoint:=ENTERBARS+1;

    IF EntPoint=EntAndExitSign THEN BEGIN{说明STOP指令买进头寸成功}
    PositionCount:=PositionCount+1;{头寸计数}
    SellSign:=True;{开始以STOP卖出,如果达到指定的价格}
    END

    ExitPoint:=EXITBARS+1;

    IF ExitPoint=EntAndExitSign THEN BEGIN {说明卖出成功}
    PositionCount:=1;{头寸计算复原}
    SellSign:=False;
    END

    {///////////////////////////////////////////////}
     
  13. 向战神觉者表示感谢。
     
  14. 可改成:
    PositionCount:=PositionCount-1吗?

    感觉上应是这样的。
     
  15.  

  16. ENTERBARS:在未买入的话应该是0
    EXITBARS:卖出位置,表示上次卖出到当前的周期数.初始值应与上述的一样。

    这样的假设对吗?

    但IF IF EntPoint=EntAndExitSign THEN BEGIN怎么就表示{说明STOP指令买进头寸成功}, 同理
    IF ExitPoint=EntAndExitSign THEN BEGIN 怎么就表示{说明卖出成功}


    VARIABLE:EntAndExitSign=1,EntPoint=0,ExitPoint=0; 的设置中看不出
    EntPoint=EntAndExitSign 时,系统就进行了一次买入,同样ExitPoint=EntAndExitSign 时系统也并不会执行一次卖出,因为这些变量只是作者的设置,并不是系统的交易函数,系统不会进行买卖操作。如此一来,进行过一次买卖的任务就落到
    EntPoint:=ENTERBARS+1; 与ExitPoint:=EXITBARS+1;身上了。但这样的表达又似乎不准确耶!
    如果系统未进行过买卖ENTERBARS=0,EntPoint:=ENTERBARS+1也不能表示系统进行了一次买卖。
    ENTERBARS:=EntPoint+1反而会人觉得是进行了第一次的买卖。往后
    EntPoint:=ENTERBARS+1表达的意思就清楚了。即下一个介入点。反之亦然。