开拓者期货期权程序化系统交易论坛

标题: 系统自带海龟交易系统止损错误 [打印本页]

作者: vrvrvrvr    时间: 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或固定的数字,数字越小测试历史结果的盈利就越高,曲线也越平滑,这应该是一个错误吧?
作者: 小米    时间: 2012-12-21 11:12:30

此公式是按海龟交易法则来编写的,我们只按作者的文字要求来进行编写,并没有测试其在哪个情况下的盈利更优。您可以按自己的经验或测试结果来决定使用什么值。

有兴趣可在论坛里下载此交易法则的原文来看看。
作者: vrvrvrvr    时间: 2012-12-21 12:36:16

小米 发表于 2012-12-21 11:12
此公式是按海龟交易法则来编写的,我们只按作者的文字要求来进行编写,并没有测试其在哪个情况下的盈利更优 ...

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

这个是改成1N(1N大概是10个点)的止损结果[attach]13487[/attach]

这个是将止损改成1的结果明显是不正常的[attach]13488[/attach]
作者: vrvrvrvr    时间: 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.                         }
复制代码

作者: 小米    时间: 2012-12-21 13:21:17

vrvrvrvr 发表于 2012-12-21 12:44
如果系统编写的没有问题,更改止损应该得到正常的结果,不应该出现这样不合理的情况吧?我刚刚接触TB对编写 ...

你先了解一下海龟法则的原意,再来判断一下是否系统有问题吧
作者: vrvrvrvr    时间: 2012-12-21 13:38:08

小米 发表于 2012-12-21 13:21
你先了解一下海龟法则的原意,再来判断一下是否系统有问题吧

我当然了解海龟法则,我程序化刚接触,交易也不是新手,这个程序肯定是有问题的,海龟法则是没有问题的。
作者: vrvrvrvr    时间: 2012-12-21 13:44:30

小米 发表于 2012-12-21 13:21
你先了解一下海龟法则的原意,再来判断一下是否系统有问题吧

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

其实是你没明白整个tb的运行机制,比如那个止损,在回归测试时可以这样写,但实际运行是啥结果你考虑了吗? 实盘和测试结果完全是不同的。

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

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

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

能不忆江南? 发表于 2012-12-21 17:39
其实是你没明白整个tb的运行机制,比如那个止损,在回归测试时可以这样写,但实际运行是啥结果你考虑了吗? ...

估计您对TB也不熟悉吧?
否则就不会说出这样的话了。
海龟交易法则是没有使用到任何的未来数据,也不会有测试与实际交易不符的地方。
请先了解后再发表言论。
作者: 枫叶飘零    时间: 2012-12-23 18:57:20

我感觉着编写没有问题;当止损越小,曲线当然越平滑,因为股指弹跳性能很好;只是当止损越小时候,实际运行的时候交易越多,然后滑点越多。实际运行的时候不可能+1跳就能成交的,必须偏移几跳,模拟运行的时候因为是突破系统,很多时候都偏移1个点以上,就是5跳多。。。把滑点考虑进去,就不是止损越小,曲线越平滑了。
作者: 能不忆江南?    时间: 2012-12-23 19:29:49

小米 发表于 2012-12-23 16:41
估计您对TB也不熟悉吧?
否则就不会说出这样的话了。
海龟交易法则是没有使用到任何的未来数据,也不会有 ...

晕,想不到你作为一个官方的技术人员,竟然说出如此不靠谱的话,真不知道你是否真懂了tb,好好去培训一下了

我只问你一句,那个海龟程序中使用了high,low,然后计算了开仓价格并认为那价格一定能成交,在测试中,那个high,low都是确定的,但在实盘运行中,这些数据是确定的吗?难道测试不是使用了未来确定的high,low数据吗?你自己实盘跟踪记录一下开仓平仓命令和价格,然后对照着测试结果就知道多么不靠谱了

这个论坛我已经泡了一段时间了,你们官方技术服务人员不知道是技术不行还是有意模糊测试和实盘的巨大不同,如果是后者,真是无话可说了,把用户当炮灰了。
作者: 能不忆江南?    时间: 2012-12-23 19:29:52

小米 发表于 2012-12-23 16:41
估计您对TB也不熟悉吧?
否则就不会说出这样的话了。
海龟交易法则是没有使用到任何的未来数据,也不会有 ...

晕,想不到你作为一个官方的技术人员,竟然说出如此不靠谱的话,真不知道你是否真懂了tb,好好去培训一下了

我只问你一句,那个海龟程序中使用了high,low,然后计算了开仓价格并认为那价格一定能成交,在测试中,那个high,low都是确定的,但在实盘运行中,这些数据是确定的吗?难道测试不是使用了未来确定的high,low数据吗?你自己实盘跟踪记录一下开仓平仓命令和价格,然后对照着测试结果就知道多么不靠谱了

这个论坛我已经泡了一段时间了,你们官方技术服务人员不知道是技术不行还是有意模糊测试和实盘的巨大不同,如果是后者,真是无话可说了,把用户当炮灰了。
作者: 小米    时间: 2012-12-23 20:23:52

能不忆江南? 发表于 2012-12-23 19:29
晕,想不到你作为一个官方的技术人员,竟然说出如此不靠谱的话,真不知道你是否真懂了tb,好好去培训一下 ...


哥哥,先把海龟看明白了,了解清楚里面用到的High,low都是怎么个用法了。
或者说,看看能使用什么论据证明了你的论点,咱们再来讨论吧。
作者: 能不忆江南?    时间: 2012-12-23 22:23:16

小米 发表于 2012-12-23 20:23
哥哥,先把海龟看明白了,了解清楚里面用到的High,low都是怎么个用法了。
或者说,看看能使用什么论据证 ...

好,我就问你一句,如果明天你实盘做一下你们提供的这个海龟算法,记录一下具体的下单价格时间和成交记录,然后晚上你再用当天数据回归测试一下,有本事你就说二者完全一样,佩服你们了,估计我要换mc了
作者: 能不忆江南?    时间: 2012-12-23 22:42:00

其实这个海龟程序算是tb提供的比较好的一个例子了,但也是演示而已,不能实用的,大家可以在模型中凡是下单的地方用fileappend记录一下开平仓的时间价格手数,另外记录当时的ask和bid价格(用Q函数),然后晚上对照一下就一目了然了,tb不会把真能实用的模型提供的。

海龟算法相当好,算法绝对没问题,tb这个只是按海龟算法的步骤依葫芦画瓢写的,完全不考虑具体运行情况,所以完全不能实用。
作者: 读书山林    时间: 2013-1-8 12:04:32

楼主没仔细看代码
n值不只关系到止损
而且关系到资金管理
简单的说就是开仓手数
楼主把开仓手数固定为1手测试一下止损试试

作者: 期市新手    时间: 2013-3-25 17:03:05

能不忆江南? 发表于 2012-12-21 17:39
其实是你没明白整个tb的运行机制,比如那个止损,在回归测试时可以这样写,但实际运行是啥结果你考虑了吗? ...

不同意上述观点,TB里每次H、L都会运算的




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2