设为首页收藏本站

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

TB版海龟的疑问? [复制链接]

Rank: 5Rank: 5

精华
0
UID
6858
积分
1346
帖子
137
主题
66
阅读权限
60
注册时间
2010-2-3
最后登录
2019-12-24
跳转到指定楼层
1#
发表于 2010-8-17 14:18:07 |只看该作者 |倒序浏览
本帖最后由 z7c9 于 2010-8-17 14:19 编辑
  1. //------------------------------------------------------------------------
  2. // 简称: TurtleTrader
  3. // 名称: 海龟交易系统
  4. // 类别: 交易指令
  5. // 类型: 其他
  6. // 输出:
  7. //------------------------------------------------------------------------

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

  42.         MinPoint = MinMove*PriceScale;
  43.     AvgTR = XAverage(TrueRange,ATRLength);
  44.         N = AvgTR[1];
  45.     TotalEquity = CurrentCapital()+ Abs(CurrentContracts()*Close*ContractUnit()*BigPointValue()*MarginRatio());
  46.     TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue());
  47.     TurtleUnits = IntPart(TurtleUnits); // 对小数取整

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

  50.         fsDonchianHi = HighestFC(High[1],fsLength);
  51.     fsDonchianLo = LowestFC(Low[1],fsLength);

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

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

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

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

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

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

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

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

  185. //------------------------------------------------------------------------
  186. // 编译版本        GS2004.06.12
  187. // 版权所有        TradeBlazer Software 2003-2008
  188. // 更改声明        TradeBlazer Software保留对TradeBlazer平
  189. //                        台每一版本的TradeBlazer公式修改和重写的权利
  190. //------------------------------------------------------------------------
复制代码
NumericSeries DonchianHi;              // 唐奇安通道上轨,延后1个Bar
    NumericSeries DonchianLo;              // 唐奇安通道下轨,延后1个Bar
    NumericSeries fsDonchianHi;            // 唐奇安通道上轨,延后1个Bar,长周期
    NumericSeries fsDonchianLo;            // 唐奇安通道下轨,延后1个Bar,长周期

这四个变量貌似没必要声明为NumericSeries 吧?只需要声明为Numeric就行了吧?因为没有使用如
DonchianHi[1]的回溯。不知道理解的对不对?

Rank: 10Rank: 10Rank: 10

精华
20
UID
4
积分
22709
帖子
4802
主题
64
阅读权限
255
注册时间
2007-7-20
最后登录
2024-1-15
2#
发表于 2010-8-17 14:43:05 |只看该作者
CrossOver和CrossUnder里面有用到序列的值

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
3#
发表于 2010-8-17 14:43:49 |只看该作者
不对。必须要用到序列变量。
因为程序里可以看到有穿越的条件用到了这四个数。而 crossover,crossunder这两个穿越函数要求参与计算的数据必须是序列变量。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
6858
积分
1346
帖子
137
主题
66
阅读权限
60
注册时间
2010-2-3
最后登录
2019-12-24
4#
发表于 2010-8-17 14:48:30 |只看该作者
哦,明白。
不过还有个问题,这里有必要使用crossover和crossunder么?
用high>DonchianHi 不就表示当前bar的high大于前4周的最高值了?,这样的话不就能定义成
numeric了?

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
5#
发表于 2010-8-17 14:50:23 |只看该作者
>或是<只能表达一个大小的关系。而crossover,crossunder表示的是一个穿越的动作。
用穿越来表示条件,更容易清楚的表现出一个序列值从下向上穿越另一序列值的交叉位置

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
6858
积分
1346
帖子
137
主题
66
阅读权限
60
注册时间
2010-2-3
最后登录
2019-12-24
6#
发表于 2010-8-17 15:01:55 |只看该作者
>或是
小米 发表于 2010-8-17 14:50

你是想表达开仓穿越那一刻的动作吧,而非high>DonchianHi 的一个时间段。但是你前面有了MarketPosition==0限制了,所以也只可能是一个时间点吧?所以还是没必要用cross?

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
7#
发表于 2010-8-17 15:17:07 |只看该作者
你再琢磨一下吧.你的理解不对的.marketposition只是开仓时需要判断的条件之一,并不是说marketposition==0就能确定交叉占的.

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
6858
积分
1346
帖子
137
主题
66
阅读权限
60
注册时间
2010-2-3
最后登录
2019-12-24
8#
发表于 2010-8-17 15:25:52 |只看该作者
(A). if(marketposition==0 and high>DonchianHi)

(B). if(marketposition==0 and cross(high,DonchianHi))
逻辑上不一样么?
当marketposition==0时,第一根满足high>DonchianHi的bar开仓,随后marketposition==1,不会重复进入A逻辑吧?不就是一个点了么?

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
9#
发表于 2010-8-17 15:34:55 |只看该作者
为什么你没有考虑过marketposition==0时,已经是high>doncianhi,但是却不满足crossover(high,DonchianHi))的情况?

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
6858
积分
1346
帖子
137
主题
66
阅读权限
60
注册时间
2010-2-3
最后登录
2019-12-24
10#
发表于 2010-8-17 15:59:10 |只看该作者
为什么你没有考虑过marketposition==0时,已经是high>doncianhi,但是却不满足crossover(high,DonchianHi))的情况?
小米 发表于 2010-8-17 15:34

怎么出现这种情况的?
marketposition==0时,第一个满足high>donchianhi的bar必然满足crossover(high,dongchianhi)吧?后面的是不是满足并不重要了,因为marketposition==1了。

实在不了解,请解释清楚,比如哪种情况会出现你说的现象?

使用道具 举报

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

bottom

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

GMT+8, 2024-5-9 10:46

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部