设为首页收藏本站

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

很奇怪的超高收益模型 [复制链接]

Rank: 4

精华
0
UID
85256
积分
362
帖子
57
主题
13
阅读权限
50
注册时间
2011-12-10
最后登录
2012-11-25
跳转到指定楼层
1#
发表于 2012-1-10 21:37:11 |只看该作者 |倒序浏览
在网上转悠的时候,找到一个顺势交易系统,随手测了一下,收益高得吓人。
后来仔细看了一下,原来就是一个海龟交易系统。只是把TB系统的海龟原来的止损部分扩充了一下,搞了个二级止损。就算如此,也不应该有如此高的收益。经过仔细的研究才发现其中的问题。
1,使用了百分比开仓。
2.止损部分有一点小错误。改正之后收益大幅下降。让人非常困惑。

请路过的高手看看,这是怎么回事呢?
离奇超高的收益


修改后,正常的收益图


代码见后续帖子。。。。。。
附件: 你需要登录才可以下载或查看附件。没有帐号?注册
何时才能知行合一!!!

Rank: 4

精华
0
UID
85256
积分
362
帖子
57
主题
13
阅读权限
50
注册时间
2011-12-10
最后登录
2012-11-25
2#
发表于 2012-1-10 21:38:52 |只看该作者
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); // 使用入市过滤条件
Numeric TrailingStart1(50); // 跟踪止损启动设置1
Numeric TrailingStart2(80); // 跟踪止损启动设置2
Numeric TrailingStop1(30); // 跟踪止损设置1
Numeric TrailingStop2(20); // 跟踪止损设置2
Numeric StopLossSet(50); // 止损设置

Vars
Numeric MinPoint; // 最小变动单位
NumericSeries AvgTR; // ATR
Numeric N; // N 值, ATR指数平均
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); // 前一次突破是否失败
Numeric MyExitPriceStop; // 平仓价格
NumericSeries HighestAfterEntry; // 开仓后出现的最高价
NumericSeries LowestAfterEntry; // 开仓后出现的最低价


Begin

If(BarStatus==2 && Time==0.090000 && CurrentTime<=0.090000) Return;//过滤集合竟价



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

MinPoint = MinMove*PriceScale;
AvgTR = XAverage(TrueRange,ATRLength);   //对当前bar的最高价最低价 真实范围,求指数平均
N = AvgTR[1];
TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin(); //当前Bar开盘价计算的可用资金 +UsedMargin

//计算开仓数量      变化一个点实际变化的价值(实际的损失或盈利)就是ContractUnit*BigPointvalue
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);

PlotNumeric("DonchianHi",DonchianHi);
PlotNumeric("DonchianLo",DonchianLo);
PlotNumeric("fsDonchianHi",fsDonchianHi);
PlotNumeric("fsDonchianLo",fsDonchianLo);
/*
Commentary("N="+Text(N));
Commentary("preEntryPrice="+Text(preEntryPrice));
Commentary("PreBreakoutFailure="+IIFString(PreBreakoutFailure,"True","False"));

*/


// 记录开仓后的最高最低价
If(BarsSinceentry == 0)
{

        HighestAfterEntry = Close;
        LowestAfterEntry = Close;
        If(MarketPosition <> 0)
        {
                HighestAfterEntry = Max(HighestAfterEntry,AvgEntryPrice); // 开仓的Bar,将开仓价和当时的收盘价的较大值保留到HighestAfterEntry
                LowestAfterEntry = Min(LowestAfterEntry,AvgEntryPrice); // 开仓的Bar,将开仓价和当时的收盘价的较小值保留到LowestAfterEntry
        }
}
Else
{
        //开仓之后的bar 如果high更高 记录,如果low更低,记录
        HighestAfterEntry = Max(HighestAfterEntry,High); // 记录下当前Bar的最高点,用于下一个Bar的跟踪止损判断
        LowestAfterEntry = Min(LowestAfterEntry,Low); // 记录下当前Bar的最低点,用于下一个Bar的跟踪止损判断
}

//Commentary("LowestAfterEntry="+Text(LowestAfterEntry));
MinPoint = MinMove*PriceScale;
MyEntryPrice = AvgEntryPrice;




// 空仓时  短周期突破开仓

// 当不使用过滤条件,或者使用过滤条件并且条件为    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;
        }
}
何时才能知行合一!!!

使用道具 举报

Rank: 6Rank: 6

精华
0
UID
1896
积分
1979
帖子
117
主题
33
阅读权限
70
注册时间
2008-7-16
最后登录
2013-11-16
3#
发表于 2012-1-10 22:21:32 |只看该作者
大段的源码我都支持

使用道具 举报

Rank: 4

精华
0
UID
85256
积分
362
帖子
57
主题
13
阅读权限
50
注册时间
2011-12-10
最后登录
2012-11-25
4#
发表于 2012-1-10 22:49:22 |只看该作者
本帖最后由 TBSTUDENT992 于 2012-1-12 20:30 编辑

// 有多仓的情况  止损 和 加仓
If(MarketPosition == 1) // 有多仓的情况
{
       
       
        If(Low < ExitLowestPrice)
        {         //止损
                myExitPrice = max(Low,ExitLowestPrice - MinPoint);
                myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
                Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
               
                Commentary("ExitLowestPrice="+Text(ExitLowestPrice));
       
        }Else
        {         //加仓
                If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
                {
                        If(Open >= preEntryPrice + 0.5*N) // 如果开盘就超过设定的0.5*N,则直接用开盘价增仓。  
                        {         //买入后价格上涨超过 0.5个 ATR 就 加仓
                                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不止损
                // ?有问题, 在实盘时下一个TICK里 SendOrderThisBar 会被初始化成false 所以会重复止损
                {
                        If(HighestAfterEntry[1] >= MyEntryPrice + TrailingStart2*MinPoint) // 第二级跟踪止损的条件表达式
                        {
                                If(Low <= HighestAfterEntry[1] - TrailingStop2*MinPoint)
                                {
                                        // 如果该Bar开盘价有跳空触发,则用开盘价代替
                                        MyExitPriceStop = HighestAfterEntry[1] - TrailingStop2*MinPoint;
                                        If(Open < MyExitPriceStop) MyExitPriceStop = Open;
                                        Sell(0,MyExitPriceStop);
                                        Commentary("no。2 stop win ="+Text( TrailingStop2*MinPoint));
                                        Commentary("HighestAfterEntry[1] ="+Text(HighestAfterEntry[1]));
                                       

                                }  
                        }
                        else if(HighestAfterEntry[1] >= MyEntryPrice + TrailingStart1*MinPoint)// 第一级跟踪止损的条件表达式
                        {
                                If(Low <= HighestAfterEntry[1] - TrailingStop1*MinPoint)
                                {
                                        MyExitPriceStop = HighestAfterEntry[1] - TrailingStop1*MinPoint;
                                        If(Open < MyExitPriceStop) MyExitPriceStop = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
                                        Sell(0,MyExitPriceStop);
                                        Commentary("no。1 stop win="+Text(MyExitPriceStop));
                                        Commentary("HighestAfterEntry[1] ="+Text(HighestAfterEntry[1]));


                                }
                        }
                else if (Low <= MyEntryPrice - StopLossSet*MinPoint)//可以在这里写上初始的止损处理
                {
                        MyExitPriceStop = MyEntryPrice - StopLossSet*MinPoint;
                        If(Open < MyExitPriceStop) MyExitPriceStop = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
                        Sell(0,MyExitPriceStop);
                        Commentary("stop loss="+Text(MyExitPriceStop));

                }

                PreBreakoutFailure = True;

        }

}
}




// 有空仓的情况   止损 和 加仓
If(MarketPosition ==-1) // 有空仓的情况
{
        // 求出持空仓时离市的条件比较值
       
        If(High > ExitHighestPrice)
        {
                myExitPrice = Min(High,ExitHighestPrice + MinPoint);
                myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
                BuyToCover(0,myExitPrice); // 数量用0的情况下将全部平仓
                Commentary("ExitHighestPrice="+Text(ExitHighestPrice));
       
        }Else
        {
                If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
                {
                //
                        If(LowestAfterEntry[1] <= MyEntryPrice - TrailingStart2*MinPoint) //第二级跟踪止损的条件表达式
                        {
                                If(High >= LowestAfterEntry[1] + TrailingStop2*MinPoint)
                                {
                                        MyExitPriceStop = LowestAfterEntry[1] + TrailingStop2*MinPoint;
                                        If(Open > MyExitPriceStop) MyExitPriceStop = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
                                        BuyToCover(0,MyExitPriceStop);
                                        Commentary("no。2 stop win ="+Text( TrailingStop2*MinPoint));
                                        Commentary("preEntryPrice ="+Text(preEntryPrice));
                                        Commentary("LowestAfterEntry[1] ="+Text(LowestAfterEntry[1]));

                                }          
                        }
                        else if(LowestAfterEntry[1] <= MyEntryPrice + TrailingStart1*MinPoint)// 第一级跟踪止损的条件表达式    这里本应是减号,可是网上的代码改成+号,效益狂涨!!!!                        {
                                If(High >= LowestAfterEntry[1] + TrailingStop1*MinPoint)
                                {
                                        MyExitPriceStop = LowestAfterEntry[1] - TrailingStop1*MinPoint;
                                        If(Open > MyExitPriceStop) MyExitPriceStop = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
                                        BuyToCover(0,MyExitPriceStop);
                                        Commentary("no。1 stop win="+Text(MyExitPriceStop));
                                        Commentary("preEntryPrice ="+Text(preEntryPrice));        
                                        Commentary("LowestAfterEntry[1] ="+Text(LowestAfterEntry[1]));

                                }
                                }else If(High >= MyEntryPrice + StopLossSet*MinPoint)//可以在这里写上初始的- 止损处理
                                {
                                        MyExitPriceStop = MyEntryPrice + StopLossSet*MinPoint;
                                        If(Open > MyExitPriceStop) MyExitPriceStop = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
                                        Commentary("preEntryPrice ="+Text(preEntryPrice));
                                        Commentary("stop loss="+Text(MyExitPriceStop));

                                }
                        //
                        PreBreakoutFailure = True;
                        }
                 
                }
}
何时才能知行合一!!!

使用道具 举报

Rank: 4

精华
0
UID
85256
积分
362
帖子
57
主题
13
阅读权限
50
注册时间
2011-12-10
最后登录
2012-11-25
5#
发表于 2012-1-10 22:51:23 |只看该作者
本帖最后由 TBSTUDENT992 于 2012-1-12 20:30 编辑

问题就处在上面4楼红色代码部分,就是一个减号变成加号,收益就狂涨,让人非常困惑。
请路过的高手帮忙看看是怎么回事吧?
何时才能知行合一!!!

使用道具 举报

Rank: 6Rank: 6

精华
0
UID
1896
积分
1979
帖子
117
主题
33
阅读权限
70
注册时间
2008-7-16
最后登录
2013-11-16
6#
发表于 2012-1-11 11:20:13 |只看该作者
我也遇到过类似的
赚钱的 很多都是不符合逻辑的 所以用的人少 所以就大多数都亏

使用道具 举报

Rank: 2

精华
0
UID
41209
积分
72
帖子
44
主题
6
阅读权限
30
注册时间
2011-5-23
最后登录
2013-3-31
7#
发表于 2012-1-12 17:11:23 |只看该作者
不就是应该用减号的吗?
我就是我

使用道具 举报

Rank: 2

精华
0
UID
41209
积分
72
帖子
44
主题
6
阅读权限
30
注册时间
2011-5-23
最后登录
2013-3-31
8#
发表于 2012-1-12 17:29:30 |只看该作者
start1==50跳,start2==80跳,stop1==30跳,stop2==20跳
在开空仓后,
1)最低点探到开仓价之下50~80跳间,
if(LowestAfterEntry[1] <= MyEntryPrice -TrailingStart1*MinPoint)//启动第一级跟踪止损
If(High >= LowestAfterEntry[1] + TrailingStop1*MinPoint)//如果从最低点反弹超过30点,就平仓。
2)最低点探到开仓价之下超过80跳,
if(LowestAfterEntry[1] <= MyEntryPrice - TrailingStart2*MinPoint)// 启动第二级跟踪止损
If(High >= LowestAfterEntry[1] + TrailingStop2*MinPoint) 如果从最低点反弹超过20点,就平仓。
我就是我

使用道具 举报

Rank: 4

精华
0
UID
85256
积分
362
帖子
57
主题
13
阅读权限
50
注册时间
2011-12-10
最后登录
2012-11-25
9#
发表于 2012-1-12 19:51:19 |只看该作者
楼上说的有道理。难道是我秀逗了。不过好像空仓部分,没有加仓代码。
何时才能知行合一!!!

使用道具 举报

Rank: 4

精华
0
UID
85256
积分
362
帖子
57
主题
13
阅读权限
50
注册时间
2011-12-10
最后登录
2012-11-25
10#
发表于 2012-1-12 20:32:16 |只看该作者
8楼说的对,按照正常的代码,是应该 是减号的。可是,网上某个期货公司的代码把改成加号以后,效益简直疯狂了。!!!
何时才能知行合一!!!

使用道具 举报

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

bottom

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

GMT+8, 2024-5-22 23:03

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部