有一点相关 file:///C:/Documents%20and%20Settings/p910332/Local%20Settings/Temporary%20Internet%20Files/Content.IE5/2JC7L2NM/256,1,客户期货投资中的有效决策
代码的结构分析 第一个 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 更易于阅读。 要完全弄明白还需对结构中的函数进行学习。
三十讲的题目讨论 第一讲:海龟交易系统宣言 。。。。。。。。。 第三十讲:对海龟交易系统的评价 大家一起来想想其余的题目。 第二讲:何为海龟交易系统 第三讲:头寸规模----海龟交易系统的精髓(一) 第四讲:头寸规模----海龟交易系统的精髓(二) 第五讲:海龟交易系统实战---入市 第六讲:海龟交易系统实战---止损 第七讲:海龟交易系统实战---离市 第八讲:海龟交易系统实战---策略 第九讲:海龟交易系统实战---其它 有待细化。20051201
公式中用到的函数解析 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,加入停损单,次周期达到设定价格即操作买入,否则放弃。 所谓停损就是股价比设定的价格要差,具体说来对于买入或卖空就是高于设定价格,对于卖出或买空就是低于设定价格
逐个学 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元位置下卖出限价单,若价格达到或高于该价格则卖出全部持仓。
代码解读 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未有初始值。 今天就到此了,请问此代码在分析家中运行成功吗?
这样分隔更易于各位理解(以下程序在分析家最新版本通过): 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;
在分析家版的海龟版编写技术中最重要的是这一段(下面代码)。此段代码块是用来管理多重头寸,并实现“止损(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 {///////////////////////////////////////////////}
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表达的意思就清楚了。即下一个介入点。反之亦然。