设为首页收藏本站

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

请教各位高手:海龟中的一个问题 [复制链接]

Rank: 1

精华
0
UID
209592
积分
8
帖子
4
主题
4
阅读权限
10
注册时间
2015-5-22
最后登录
2021-5-25
跳转到指定楼层
1#
发表于 2017-11-9 14:37:56 |只看该作者 |倒序浏览

各位大神:以下是海龟的源码。希望实现:当持有多单时价。1、只有入场后的最高价大于 入场价+2*N 时,价格低于近期10日低点才离场;2、否则用入场价-2ATR。该如何实现。

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(BarStatus == 2 And IsCallAuctionTime) 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

Rank: 1

精华
0
UID
190805
积分
11
帖子
10
主题
1
阅读权限
10
注册时间
2014-7-18
最后登录
2017-11-14
2#
发表于 2017-11-9 15:37:06 |只看该作者
本帖最后由 our420 于 2017-11-9 15:39 编辑

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

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

  43.     fsDonchianHi = HighestFC(High[1],fsLength);
  44.     fsDonchianLo = LowestFC(Low[1],fsLength);
  45.         
  46.     ExitLowestPrice = LowestFC(Low[1],teLength);
  47.     ExitHighestPrice = HighestFC(High[1],teLength);

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

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

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

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

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

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

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

  172.             // 止损指令
  173.                         If(High >= preEntryPrice + 2 * N &&SendOrderThisBar==false) // 加仓Bar不止损
  174.                         {
  175.                                 myExitPrice = preEntryPrice + 2 * N;
  176.                                 myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
  177.                                 BuyToCover(0,myExitPrice); // 数量用0的情况下将全部平仓
  178.                                 PreBreakoutFailure = True;
  179.                         }
  180.         }
  181.     }
  182. End
复制代码

使用道具 举报

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

bottom

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

GMT+8, 2024-5-17 12:30

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部