设为首页收藏本站

 找回密码
 注册
查看: 5969|回复: 17
打印 上一主题 下一主题

系统自带海龟交易系统止损错误 [复制链接]

Rank: 2

精华
0
UID
113920
积分
54
帖子
18
主题
4
阅读权限
30
注册时间
2012-12-6
最后登录
2015-12-1
跳转到指定楼层
1#
发表于 2012-12-21 10:47:17 |只看该作者 |倒序浏览
  1.             // 止损指令
  2.                         If(Low <= preEntryPrice - 2 * N && SendOrderThisBar == false) // 加仓Bar不止损
  3.                         {
  4.                                 myExitPrice = preEntryPrice - 2 * N;
  5.                                 Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
  6.                                 PreBreakoutFailure = True;
  7.                         }
复制代码
以上代码为系统自带海龟交易系统的止损部分代码,如果我把2*N改为N或1*N或固定的数字,数字越小测试历史结果的盈利就越高,曲线也越平滑,这应该是一个错误吧?

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
2#
发表于 2012-12-21 11:12:30 |只看该作者
此公式是按海龟交易法则来编写的,我们只按作者的文字要求来进行编写,并没有测试其在哪个情况下的盈利更优。您可以按自己的经验或测试结果来决定使用什么值。

有兴趣可在论坛里下载此交易法则的原文来看看。

使用道具 举报

Rank: 2

精华
0
UID
113920
积分
54
帖子
18
主题
4
阅读权限
30
注册时间
2012-12-6
最后登录
2015-12-1
3#
发表于 2012-12-21 12:36:16 |只看该作者
小米 发表于 2012-12-21 11:12
此公式是按海龟交易法则来编写的,我们只按作者的文字要求来进行编写,并没有测试其在哪个情况下的盈利更优 ...

是这样的,这个方法肯定没有问题,但是这个止损系统的编写肯定是有问题的,不是系统优化,具体原因我没有细看,一会我看一下,肯定是编写的问题。
这个是原版2N(2N大概是20个点)的止损结果如下

这个是改成1N(1N大概是10个点)的止损结果

这个是将止损改成1的结果明显是不正常的
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 2

精华
0
UID
113920
积分
54
帖子
18
主题
4
阅读权限
30
注册时间
2012-12-6
最后登录
2015-12-1
4#
发表于 2012-12-21 12:44:32 |只看该作者
如果系统编写的没有问题,更改止损应该得到正常的结果,不应该出现这样不合理的情况吧?我刚刚接触TB对编写系统不太了解,只是觉得这个系统肯定是有问题的,我所更改的内容就是以下代码中两处“2 * N”应该是止损的额度吧?改这个应该不会造成系统错误的吧?但是改为以后结果就变成上面贴图的样子了。海龟系统是最新版TB自带的模型,没办法更改的,我全部复制出来新建的公式,做的修改。
  1.             // 止损指令
  2.                         If(Low <= preEntryPrice - 2 * N && SendOrderThisBar == false) // 加仓Bar不止损
  3.                         {
  4.                                 myExitPrice = preEntryPrice - 2 * N;
  5.                                 Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
  6.                                 PreBreakoutFailure = True;
  7.                         }
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
5#
发表于 2012-12-21 13:21:17 |只看该作者
vrvrvrvr 发表于 2012-12-21 12:44
如果系统编写的没有问题,更改止损应该得到正常的结果,不应该出现这样不合理的情况吧?我刚刚接触TB对编写 ...

你先了解一下海龟法则的原意,再来判断一下是否系统有问题吧

使用道具 举报

Rank: 2

精华
0
UID
113920
积分
54
帖子
18
主题
4
阅读权限
30
注册时间
2012-12-6
最后登录
2015-12-1
6#
发表于 2012-12-21 13:38:08 |只看该作者
小米 发表于 2012-12-21 13:21
你先了解一下海龟法则的原意,再来判断一下是否系统有问题吧

我当然了解海龟法则,我程序化刚接触,交易也不是新手,这个程序肯定是有问题的,海龟法则是没有问题的。

使用道具 举报

Rank: 2

精华
0
UID
113920
积分
54
帖子
18
主题
4
阅读权限
30
注册时间
2012-12-6
最后登录
2015-12-1
7#
发表于 2012-12-21 13:44:30 |只看该作者
小米 发表于 2012-12-21 13:21
你先了解一下海龟法则的原意,再来判断一下是否系统有问题吧

最简单的例子,如果我手动按照规则执行的结果,与使用系统自带程序得出的结果就会不一样,这个不同只局限在止损的设定上,如果是按照10日低点退出的就没问题,如果给此系统加上止损就会有问题,海龟默认的2N止损不明显,如果把2N改成更小的值就会有问题,可能在现有的品种上按照日线级别去做的话可能体现不出来,如果用在其他小级别或把止损改小就会有问题,这也算理论上的错误吧?即使实际上不会发生,但也不代表这个系统编写的没问题啊?我就想知道这个问题到底出在哪了,因为这个程序是官方自带的,按理说是不应该有漏洞的,但现在按照此规则编写的止损就会出现问题,简单的说就是我用官方提供的海龟系统的格式来编写一个新的系统就会出现问题,这个问题出在哪还不知道

使用道具 举报

Rank: 2

精华
0
UID
113920
积分
54
帖子
18
主题
4
阅读权限
30
注册时间
2012-12-6
最后登录
2015-12-1
8#
发表于 2012-12-21 13:47:15 |只看该作者
本帖最后由 vrvrvrvr 于 2012-12-21 13:50 编辑
  1. //------------------------------------------------------------------------
  2. // 简称: TurtleTrader
  3. // 名称: 海龟交易系统
  4. // 类别: 公式应用
  5. // 类型: 内建应用
  6. //------------------------------------------------------------------------

  7. Params
  8.     Numeric RiskRatio(1);                   // % Risk Per N ( 0 - 100)
  9.     Numeric ATRLength(20);                  // 平均波动周期 ATR Length
  10.     Numeric boLength(20);                   // 短周期 BreakOut Length
  11.     Numeric fsLength(55);                   // 长周期 FailSafe Length
  12.     Numeric teLength(10);                   // 离市周期 Trailing Exit Length
  13.     Bool LastProfitableTradeFilter(True);   // 使用入市过滤条件
  14. Vars
  15.         Numeric MinPoint;                       // 最小变动单位
  16.         NumericSeries AvgTR;                                        // ATR
  17.     Numeric N;                              // N 值
  18.     Numeric TotalEquity;                    // 按最新收盘价计算出的总资产
  19.     Numeric TurtleUnits;                    // 交易单位
  20.     NumericSeries DonchianHi;                      // 唐奇安通道上轨,延后1个Bar
  21.     NumericSeries DonchianLo;                      // 唐奇安通道下轨,延后1个Bar
  22.     NumericSeries fsDonchianHi;                    // 唐奇安通道上轨,延后1个Bar,长周期
  23.     NumericSeries fsDonchianLo;                    // 唐奇安通道下轨,延后1个Bar,长周期
  24.     Numeric ExitHighestPrice;               // 离市时判断需要的N周期最高价
  25.     Numeric ExitLowestPrice;                // 离市时判断需要的N周期最低价
  26.     Numeric myEntryPrice;                   // 开仓价格
  27.     Numeric myExitPrice;                    // 平仓价格
  28.     Bool SendOrderThisBar(False);                  // 当前Bar有过交易
  29.         NumericSeries preEntryPrice(0);               // 前一次开仓的价格
  30.         BoolSeries PreBreakoutFailure(false);        // 前一次突破是否失败
  31. Begin
  32.     If(BarStatus == 0)
  33.     {
  34.                 preEntryPrice = InvalidNumeric;
  35.                 PreBreakoutFailure = false;
  36.         }       
  37.        
  38.         MinPoint = MinMove*PriceScale;
  39.     AvgTR = XAverage(TrueRange,ATRLength);
  40.         N = AvgTR[1];       
  41.     TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin();
  42.     TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue());
  43.     TurtleUnits = IntPart(TurtleUnits); // 对小数取整

  44.     DonchianHi = HighestFC(High[1],boLength);
  45.     DonchianLo = LowestFC(Low[1],boLength);

  46.         fsDonchianHi = HighestFC(High[1],fsLength);
  47.     fsDonchianLo = LowestFC(Low[1],fsLength);
  48.        
  49.         ExitLowestPrice = LowestFC(Low[1],teLength);
  50.         ExitHighestPrice = HighestFC(High[1],teLength);

  51.         Commentary("N="+Text(N));
  52.         Commentary("preEntryPrice="+Text(preEntryPrice));
  53.         Commentary("PreBreakoutFailure="+IIFString(PreBreakoutFailure,"True","False"));
  54.        
  55.     // 当不使用过滤条件,或者使用过滤条件并且条件为PreBreakoutFailure为True进行后续操作
  56.     If(MarketPosition == 0 && ((!LastProfitableTradeFilter) Or (PreBreakoutFailure)))
  57.     {
  58.         // 突破开仓
  59.         If(High > DonchianHi && TurtleUnits >= 1)
  60.         {
  61.             // 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
  62.             myEntryPrice = min(high,DonchianHi + MinPoint);
  63.             myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
  64.                         preEntryPrice = myEntryPrice;
  65.             Buy(TurtleUnits,myEntryPrice);
  66.                         SendOrderThisBar = True;
  67.                         PreBreakoutFailure = False;
  68.         }

  69.         If(Low < DonchianLo && TurtleUnits >= 1)
  70.         {
  71.             // 开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交
  72.             myEntryPrice = max(low,DonchianLo - MinPoint);
  73.             myEntryPrice = IIF(myEntryPrice > Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
  74.             preEntryPrice = myEntryPrice;
  75.             SendOrderThisBar = True;
  76.             SellShort(TurtleUnits,myEntryPrice);
  77.                         SendOrderThisBar = True;
  78.                         PreBreakoutFailure = False;
  79.         }
  80.     }

  81.     // 长周期突破开仓 Failsafe Breakout point
  82.     If(MarketPosition == 0)
  83.     {
  84.                 Commentary("fsDonchianHi="+Text(fsDonchianHi));
  85.         If(High > fsDonchianHi && TurtleUnits >= 1)
  86.         {
  87.             // 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
  88.             myEntryPrice = min(high,fsDonchianHi + MinPoint);
  89.             myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
  90.                         preEntryPrice = myEntryPrice;
  91.             Buy(TurtleUnits,myEntryPrice);
  92.                         SendOrderThisBar = True;
  93.                         PreBreakoutFailure = False;
  94.         }

  95.                 Commentary("fsDonchianLo="+Text(fsDonchianLo));
  96.         If(Low < fsDonchianLo && TurtleUnits >= 1)
  97.         {
  98.             // 开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交
  99.             myEntryPrice = max(low,fsDonchianLo - MinPoint);
  100.             myEntryPrice = IIF(myEntryPrice > Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
  101.             preEntryPrice = myEntryPrice;
  102.             SellShort(TurtleUnits,myEntryPrice);
  103.                         SendOrderThisBar = True;
  104.                         PreBreakoutFailure = False;
  105.         }
  106.     }

  107.     If(MarketPosition == 1) // 有多仓的情况
  108.     {      
  109.                 Commentary("ExitLowestPrice="+Text(ExitLowestPrice));
  110.         If(Low < ExitLowestPrice)
  111.         {
  112.             myExitPrice = max(Low,ExitLowestPrice - MinPoint);
  113.                         myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
  114.             Sell(0,myExitPrice);    // 数量用0的情况下将全部平仓
  115.         }Else
  116.         {
  117.             If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
  118.             {
  119.                 If(Open >= preEntryPrice + 0.5*N) // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
  120.                 {
  121.                     myEntryPrice = Open;
  122.                                         preEntryPrice = myEntryPrice;
  123.                     Buy(TurtleUnits,myEntryPrice);
  124.                                         SendOrderThisBar = True;
  125.                 }

  126.                 while(High >= preEntryPrice + 0.5*N) // 以最高价为标准,判断能进行几次增仓
  127.                 {
  128.                     myEntryPrice = preEntryPrice + 0.5 * N;
  129.                     preEntryPrice = myEntryPrice;
  130.                     Buy(TurtleUnits,myEntryPrice);
  131.                                         SendOrderThisBar = True;                                       
  132.                 }
  133.             }
  134.                        
  135.           // 止损指令
  136.                         If(Low <= preEntryPrice - 2 * N && SendOrderThisBar == false) // 加仓Bar不止损
  137.                         {
  138.                                 myExitPrice = preEntryPrice - 2 * N;
  139.                                 Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
  140.                                 PreBreakoutFailure = True;
  141.                         }       }
  142.     }Else If(MarketPosition ==-1) // 有空仓的情况
  143.     {
  144.         // 求出持空仓时离市的条件比较值        
  145.                 Commentary("ExitHighestPrice="+Text(ExitHighestPrice));
  146.         If(High > ExitHighestPrice)
  147.         {
  148.             myExitPrice = Min(High,ExitHighestPrice + MinPoint);
  149.                         myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
  150.             BuyToCover(0,myExitPrice);    // 数量用0的情况下将全部平仓
  151.         }Else
  152.         {
  153.             If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
  154.             {
  155.                 If(Open <= preEntryPrice - 0.5*N) // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
  156.                 {
  157.                     myEntryPrice = Open;
  158.                                         preEntryPrice = myEntryPrice;
  159.                     SellShort(TurtleUnits,myEntryPrice);
  160.                                         SendOrderThisBar = True;
  161.                 }

  162.                 while(Low <= preEntryPrice - 0.5*N) // 以最低价为标准,判断能进行几次增仓
  163.                 {
  164.                     myEntryPrice = preEntryPrice - 0.5 * N;
  165.                     preEntryPrice = myEntryPrice;
  166.                     SellShort(TurtleUnits,myEntryPrice);
  167.                                         SendOrderThisBar = True;
  168.                 }
  169.             }

  170.          // 止损指令
  171.                         If(High >= preEntryPrice + 2 * N &&SendOrderThisBar==false) // 加仓Bar不止损
  172.                         {
  173.                                 myExitPrice = preEntryPrice + 2 * N;
  174.                                 BuyToCover(0,myExitPrice); // 数量用0的情况下将全部平仓
  175.                                 PreBreakoutFailure = True;
  176.                         }      }
  177.     }
  178. End

  179. //------------------------------------------------------------------------
  180. // 编译版本        GS2010.12.08
  181. // 版权所有        TradeBlazer Software 2003-2010
  182. // 更改声明        TradeBlazer Software保留对TradeBlazer平
  183. //                        台每一版本的TradeBlazer公式修改和重写的权利
  184. //------------------------------------------------------------------------
复制代码
          // 止损指令
                        If(Low <= preEntryPrice - 2 * N && SendOrderThisBar == false) // 加仓Bar不止损
                        {
                                myExitPrice = preEntryPrice - 2 * N;
                                Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
                                PreBreakoutFailure = True;
                        }   
         // 止损指令
                        If(High >= preEntryPrice + 2 * N &&SendOrderThisBar==false) // 加仓Bar不止损
                        {
                                myExitPrice = preEntryPrice + 2 * N;
                                BuyToCover(0,myExitPrice); // 数量用0的情况下将全部平仓
                                PreBreakoutFailure = True;
                        }  
上面的代码就是系统自带的海龟交易系统,不知道问题出在哪。红色部分就是止损的部分,如果把默认的“2*N”改成小的额度系统就会出现问题。改成3N或更大的止损就没问题,因为10日低点也会退出交易。

使用道具 举报

Rank: 2

精华
0
UID
112865
积分
67
帖子
39
主题
5
阅读权限
30
注册时间
2012-10-12
最后登录
2013-7-18
9#
发表于 2012-12-21 17:39:12 |只看该作者
其实是你没明白整个tb的运行机制,比如那个止损,在回归测试时可以这样写,但实际运行是啥结果你考虑了吗? 实盘和测试结果完全是不同的。

实盘中,当那个low触发止损时,系统会按照那个myexitprice下单,但试问,当时的价格是这样的吗?或者这myexitprice能成交吗?当时市场价其实应该是close,但记住了,这个low和close也是在这个当前bar的多次运行中是变动的,所以具体啥结果天知道。

在测试中,这些数值都是确定的,因为没实时bar数据,所有的都是过去数据了,这意味着,走完了这个bar后你可以回到过去以曾经出现的myexitprice下单并成交,也就是使用了未来函数。所以才有那么好的结果,虽然是假的。。。

所以呢,这个海龟算法是对的,但程序测试是完全不靠谱的,这论坛里面没几个人明白这点的,要把实盘和程序回归测试结果吻合可不是容易的事情,最简单的就是只使用当前bar的open值和以前bar的任何数据计算下单才行,当前bar的high,low,close都不能出现。

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
10#
发表于 2012-12-23 16:41:19 |只看该作者
能不忆江南? 发表于 2012-12-21 17:39
其实是你没明白整个tb的运行机制,比如那个止损,在回归测试时可以这样写,但实际运行是啥结果你考虑了吗? ...

估计您对TB也不熟悉吧?
否则就不会说出这样的话了。
海龟交易法则是没有使用到任何的未来数据,也不会有测试与实际交易不符的地方。
请先了解后再发表言论。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-5 21:57

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部