大数跨境
0
0

干货 | 用tradeblazer实现海龟交易法则(附代码)

干货 | 用tradeblazer实现海龟交易法则(附代码) 交易开拓者TB
2017-11-17
0
导读:海龟交易法则核心在于信心、连续性和纪律,反映出人性的弱点;大多数人是坚持不了的,成功的海龟必定心怀信仰。

只做专业交易软件

一个完整系统的成分


市场——买卖什么

头寸规模——买卖多少

入市——何时买卖

止损——何时退出亏损头寸

离市——何时退出赢利头寸

策略——如何买卖  


一、市场

多样性、成交量大、活跃的、有可能出现趋势的合约,一旦排除做某个合约,将不再去做这个合约。


二、头寸规模

这六个条件中,我理解头寸规模是这六个规则中最重要的,在原版海龟交易法则中也是篇幅最长的一段,破产风险是一个正期望值交易系统能否正常运行下去的关键,法则中用账户总资金的1%下单:


头寸规模单位=账户总资金的1%÷市场的绝对波动幅度


市场的绝对波动幅度=ATR×合约每一点数所代表的人民币


这里的ATR是以20日计算的,在软件超级图表中输入可以直接显示出来。

▲ATR

例如100万人民币账户,此时螺纹钢1805合约价格是3705,日线级别此时ATR为98.43 ,螺纹钢一点变动为10rmb。


头寸规模单位=1000000×0.01÷(98.43×10)=10.15(手)


约等于10手螺纹钢;


如果是10万人民币账户,就是1手螺纹钢。


三、入市策略

◆系统1:以20日突破为基础的短期系统


◆系统2:以55日突破为基础的长期系统


海龟们可以自由决定如何在这两个系统之间分配资金。


◆系统1:突破20日高点或低点,以此时价格建立一个头寸规模单位,但是,如果上一次突破为赢利性突破,那么系统1的当前信号将被忽略;


◆系统2:突破55日高点或低点,此时建立一个头寸规模单位,无论前一次是否赢利;


逐步建仓:首先是建立1个头寸规模单位,然后价格同方向波动1/2个ATR值则再建立一个头寸规模单位。


四、止损

海龟们任何一笔交易风险程度都不得超过2%,也就是在建立一个头寸规模单位(账户总资金的1%)后,反方向波动2个ATR止损,这个止损值是随着增加建立头寸规模单位变化,以做多为例,再建立一个头寸单位后,止损值则增加0.5个ATR。


五、离市

赢利的情况下


◆系统1:反向突破10日退出法则


◆系统2:方向突破10日退出法则


六、在tradeblazer交易开拓者实现海龟交易法则

TurtleTrader代码

建议微信“设置”→“通用”开启“横屏模式”阅读:


Params
  Numeric RiskRatio(1);                   // % Risk Per N ( 0 - 100)
  Numeric ATRLength(20);                  // 平均波动周期 ATR Length
  Numeric boLength(20);                   // 短周期 BreakOut Length
  Numeric fsLength(55);                   // 长周期 FailSafe Length
  Numeric teLength(10);                   // 离市周期 Trailing Exit Length
  Bool LastProfitableTradeFilter(True);   // 使用入市过滤条件
Vars
  Numeric MinPoint;                       // 最小变动单位
  NumericSeries AvgTR;                    // ATR
  Numeric N;                              // N 值
  Numeric TotalEquity;                    // 按最新收盘价计算出的总资产
  Numeric TurtleUnits;                    // 交易单位
  NumericSeries DonchianHi;               // 唐奇安通道上轨,延后1个Bar
  NumericSeries DonchianLo;               // 唐奇安通道下轨,延后1个Bar
  NumericSeries fsDonchianHi;             // 唐奇安通道上轨,延后1个Bar,长周期
  NumericSeries fsDonchianLo;             // 唐奇安通道下轨,延后1个Bar,长周期
  Numeric ExitHighestPrice;               // 离市时判断需要的N周期最高价
  Numeric ExitLowestPrice;                // 离市时判断需要的N周期最低价
  Numeric myEntryPrice;                   // 开仓价格
  Numeric myExitPrice;                    // 平仓价格
  Bool SendOrderThisBar(False);           // 当前Bar有过交易
  NumericSeries preEntryPrice(0);         // 前一次开仓的价格
  BoolSeries PreBreakoutFailure(false);   // 前一次突破是否失败
Begin
  // 集合竞价过滤
  If(!CallAuctionFilter()) Return;

  If(BarStatus == 0)
  {
      preEntryPrice = InvalidNumeric;
      PreBreakoutFailure = false;
  }

  MinPoint = MinMove*PriceScale;
  AvgTR = XAverage(TrueRange,ATRLength);
  N = AvgTR[1];
  TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin();
  TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue());
  TurtleUnits = IntPart(TurtleUnits); // 对小数取整

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

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

  ExitLowestPrice = LowestFC(Low[1],teLength);
  ExitHighestPrice = HighestFC(High[1],teLength);

  Commentary("N="+Text(N));
  Commentary("preEntryPrice="+Text(preEntryPrice));
  Commentary("PreBreakoutFailure="+IIFString(PreBreakoutFailure,"True","False"));

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

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

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

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

  If(MarketPosition == 1) // 有多仓的情况
  {
      Commentary("ExitLowestPrice="+Text(ExitLowestPrice));
      If(Low < ExitLowestPrice)
      {
          myExitPrice = max(Low,ExitLowestPrice - MinPoint);
          myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
          Sell(0,myExitPrice);    // 数量用0的情况下将全部平仓
      }Else
      {
          If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
          {
              If(Open >= preEntryPrice + 0.5*N) // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
              {
                  myEntryPrice = Open;
                  preEntryPrice = myEntryPrice;
                  Buy(TurtleUnits,myEntryPrice);
                  SendOrderThisBar = True;
              }

              while(High >= preEntryPrice + 0.5*N) // 以最高价为标准,判断能进行几次增仓
              {
                  myEntryPrice = preEntryPrice + 0.5 * N;
                  preEntryPrice = myEntryPrice;
                  Buy(TurtleUnits,myEntryPrice);
                  SendOrderThisBar = True;
              }
          }

          // 止损指令
          If(Low <= preEntryPrice - 2 * N && SendOrderThisBar == false) // 加仓Bar不止损
          {
              myExitPrice = preEntryPrice - 2 * N;
              myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
              Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
              PreBreakoutFailure = True;
          }
      }
  }Else If(MarketPosition ==-1) // 有空仓的情况
  {
      // 求出持空仓时离市的条件比较值
      Commentary("ExitHighestPrice="+Text(ExitHighestPrice));
      If(High > ExitHighestPrice)
      {
          myExitPrice = Min(High,ExitHighestPrice + MinPoint);
          myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
          BuyToCover(0,myExitPrice);    // 数量用0的情况下将全部平仓
      }Else
      {
          If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
          {
              If(Open <= preEntryPrice - 0.5*N) // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
              {
                  myEntryPrice = Open;
                  preEntryPrice = myEntryPrice;
                  SellShort(TurtleUnits,myEntryPrice);
                  SendOrderThisBar = True;
              }

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

          // 止损指令
          If(High >= preEntryPrice + 2 * N &&SendOrderThisBar==false) // 加仓Bar不止损
          {
              myExitPrice = preEntryPrice + 2 * N;
              myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
              BuyToCover(0,myExitPrice); // 数量用0的情况下将全部平仓
              PreBreakoutFailure = True;
          }
      }
  }
End


这段代码在TB交易开拓者里是系统自带的模型。


做了10个品种的测试,时间是从2009年1月5号至今,K线级别为日线,样品为各商品指数,每个商品100万rmb,股指实际测试的时候要在500万以上——rb螺纹钢、i铁矿石、cu铜、j焦炭、ru橡胶、PTA、au黄金、sr白糖、m豆粕、IF股指:

▲多图表组合测试报告

▲多图表投资组合测试报告(交易汇总)

▲多图表投资组合测试报告(交易汇总)

▲多图表投资组合测试报告(交易盈亏曲线)

在第一批培训中,丹尼斯他们从报名的1000多人里筛选出来10个人,又另加3人,总计13人,他们有一个共同的特征是非常聪明,但是海龟们并没有全部都取得成功,大概是不到一半的海龟有稳定盈利的能力,我理解海龟交易法则核心在于信心、连续性和纪律,反映出人性的弱点;大多数人是坚持不了的,成功的海龟必定心怀信仰。



— END —

开拓者金融网

知识

专业

能力

深度




↓程序化免费培训课程  点击“阅读原文”抢先报名! 

【声明】内容源于网络
0
0
交易开拓者TB
交易开拓者(TradeBlazer)是一款针对中国证券、期货投资用户开发的量化交易软件,它集中了实时行情,技术分析,手动快捷交易及程序化交易的功能。通过使用交易开拓者,用户可以便捷地将自己的交易思想转化为计算机代码,从而实现程序化自动交易。
内容 1574
粉丝 0
交易开拓者TB 交易开拓者(TradeBlazer)是一款针对中国证券、期货投资用户开发的量化交易软件,它集中了实时行情,技术分析,手动快捷交易及程序化交易的功能。通过使用交易开拓者,用户可以便捷地将自己的交易思想转化为计算机代码,从而实现程序化自动交易。
总阅读849
粉丝0
内容1.6k