一个正在实盘的系统

Discussion in 'Futures' started by newk2001, Nov 11, 2009.

  1. 来海洋有一段时间了,总是索取大于付出,深以为憾.。今天斗胆把我正在使用的系统发上来请大家斧正。
    这是一个反趋势日内系统,不持仓过夜,交易频率比较高,交易的强度比较大。
    先说一下系统的设置:
    1 进场:
    当CMO指标低于-50并且当前线的收盘价在第一条布林线下轨以外时,
    下一线市价做多。反之做空。
    2 出场:满足下列条件之一就出场。
    a 价格碰触第二条布林线上轨,多头平仓,反之空头平仓。
    b 本线收盘价低于前一线最低价
    c 时间到达下午2:35分(我这时要去接孩子不能看盘 呵呵)
    3 资金管理:
    每次固定交易16手。
    再说一下系统的理念:
    通过CMO指标和布林线结合来判断市场的超买超卖。然后在动量消失前跑路,严格止损。
    目前我只用这个系统交易内盘的天然橡胶,使用5min线。
    这个系统的挑战是需要较低的手续费和较小的成交滑价。我的手续费是一个来回10块。
    下面给出系统源码(由于是自己使用,编的比较乱 :))wealth-lab 4
    var Bar, p: integer;
    var N, Space, G_Hour, G_Minute, T_Hour, T_Minute: integer;
    var Ca1, Ca2, Ca3, Ca4, Ca5, Ca6, Ca7, Ca8, Ca9: boolean;
    var Cb1, Cb2, Cb3, Cb4, Cb5, Cb6, Cb7, Cb8, Cb9: boolean;
    var Cc1, Cc2, Cc3, Cc4, Cc5, Cc6, Cc7, Cc8, Cc9: boolean;
    var Cd1, Cd2, Cd3, Cd4, Cd5, Cd6, Cd7, Cd8, Cd9: boolean;
    var Cx1, Cx2, Cx3: boolean;
    var N_Boll, N_Boll2, LongStop, ShortStop, Stop_Ratio: float;
    N := 6;
    Space := 5;
    N_Boll := 0.7;
    N_Boll2 := 2.5;
    var CMOPane: integer;
    CMOPane := CreatePane( 75, true, true );
    var BBandLower1, BBandUpper1, SMA1, EMA1, CMO1, SMA1_DISPLACED, EMA1_DISPLACED: integer;
    var BBandLower2, BBandUpper2: integer;
    BBandLower1 := BBandLowerSeries( #Close,N,N_Boll );
    BBandLower2 := BBandLowerSeries( #Close,N,N_Boll2 );
    PlotSeriesLabel( BBandLower1, 0, 009, #Thin, '' );
    PlotSeriesLabel( offsetseries( BBandLower2, -1 ), 0, 909, #Thin, '' );
    BBandUpper1 := BBandUpperSeries( #Close,N,N_Boll );
    BBandUpper2 := BBandUpperSeries( #Close,N,N_Boll2 );
    PlotSeriesLabel( BBandUpper1, 0, 009, #Thin, '' );
    PlotSeriesLabel( offsetseries( BBandUpper2, -1 ), 0, 909, #Thin, '' );
    SMA1 := SMASeries( #Close,N );
    EMA1 := EMASeries( #CLose,N );
    CMO1 := CMOSeries( #Close,N );
    SMA1_DISPLACED := OffsetSeries( SMA1, -1 );
    EMA1_DISPLACED := OffsetSeries( EMA1, -1 );
    PlotSeriesLabel( CMO1, CMOPane, 009, #Thin, '' );
    hidevolume;
    for Bar := N to BarCount - 1 do
    begin
    if LastPositionActive then
    begin
    p := LastPosition;
    if PositionLong( p ) then
    begin
    if ( GetHour( Bar ) = 14 ) and ( GetMinute( Bar ) = 35 ) then
    begin
    cb1 := true;
    end;
    if cb1 then
    begin
    SellAtMarket( Bar, p, '' );
    end;
    SellAtLimit( Bar, @BBandUpper2[ Bar - 1 ], p, '' );
    if PriceClose( Bar ) < PriceLow( Bar - 1 ) then
    begin
    SellAtlimit( Bar + 1, PriceClose( Bar ), p, 'LongStop' );
    end;
    end;
    cb1 := false;
    if PositionShort( p ) then
    begin
    if ( GetHour( Bar ) = 14 ) and ( GetMinute( Bar ) = 35 ) then
    begin
    cb3 := true;
    end;
    if cb3 then
    begin
    CoverAtMarket( Bar, p, '' );
    end;
    CoverAtLimit( Bar, @BBandLower2[ Bar - 1 ], p, '' );
    if PriceClose( Bar ) > Pricehigh( Bar - 1 ) then
    begin
    CoverAtlimit( Bar + 1, PriceClose( Bar ), p, 'ShortStop' );
    end;
    end;
    cb3 := false;
    end
    else
    begin
    if not LastPositionActive then
    begin
    T_Hour := Trunc( ( N - 1 ) * Space/60 ) + 9;
    T_Minute := ( N - 1 ) * Space - ( T_Hour - 9 ) * 60;
    Ca1 := GetHour( Bar ) > T_Hour;
    Ca2 := ( GetHour( Bar ) = T_Hour ) and ( GetMinute( Bar ) >= T_Minute );
    Ca4 := ( GetHour( Bar ) = 14 ) and ( GetMinute( Bar ) > 30 );
    Ca5 := not Ca4;
    Ca3 := Ca1 or Ca2;
    Ca6 := Ca3 and Ca5;



    Cc1 := PriceClose( Bar ) < @BBandLower1[ Bar ];
    Cc2 := CrossUnderValue( Bar, CMO1, -50 );
    Cc3 := Cc1 and Cc2;

    Cd1 := PriceClose( Bar ) > @BBandUpper1[ Bar ];
    Cd2 := CrossOverValue( Bar, CMO1, 50 );
    Cd3 := Cd1 and Cd2;

    if Ca6 and Cc3 then
    begin
    BuyAtClose( Bar, 'Long' );
    end;
    if Ca6 and Cd3 then
    begin
    ShortAtClose( Bar, 'Short' );
    end;
    end;
    end;
    end;

    这是系统测试结果(实际表现比测试大概要好一些,因为有时这个系统在停板也有信号。)

    Long + Short Long Only Short Only Buy & Hold
    Starting Capital $240,000.00 $240,000.00 $240,000.00 $240,000.00
    Ending Capital $468,240.00 $307,760.00 $400,480.00 $1,186,710.00
    Net Profit $228,240.00 $67,760.00 $160,480.00 $946,710.00
    Net Profit % 95.10% 28.23% 66.87% 394.46%
    Annualized Gain % 107.47% 31.20% 74.92% 472.80%
    Exposure 14.38% 8.66% 8.78% 100.00%

    Number of Trades 616 314 302 1
    Avg Profit/Loss $370.52 $215.80 $531.39 $946,710.00
    Avg Profit/Loss % 0.03% 0.03% 0.04% 111.67%
    Avg Bars Held 3.96 4.06 3.85 9,562.00

    Winning Trades 313 162 151 1
    Winning % 50.81% 51.59% 50.00% 100.00%
    Gross Profit $1,341,320.00 $657,880.00 $683,440.00 $946,710.00
    Avg Profit $4,285.37 $4,060.99 $4,526.09 $946,710.00
    Avg Profit % 0.36% 0.35% 0.38% 111.67%
    Avg Bars Held 4.44 4.60 4.26 9,562.00
    Max Consecutive 8 8 8 N/A

    Losing Trades 303 152 151 0
    Losing % 49.19% 48.41% 50.00% 0.00%
    Gross Loss $-1,113,080.00 $-590,120.00 $-522,960.00 $0.00
    Avg Loss $-3,673.53 $-3,882.37 $-3,463.31 $0.00
    Avg Loss % -0.31% -0.32% -0.30% 0.00%
    Avg Bars Held 3.47 3.49 3.44 0.00
    Max Consecutive 8 9 9 N/A

    Max Drawdown $-76,340.00 $-97,600.00 $-83,900.00 $-304,200.00
    Max Drawdown % -20.53% -25.52% -30.60% -34.36%
    Max Drawdown Date 2009-8-21 2009-10-16 2009-3-24 2009-9-28

    Wealth-Lab Score 593.76 268.34 592.41 310.33
    Profit Factor 1.21 1.11 1.31 INF
    Recovery Factor 2.99 0.69 1.91 3.11
    Payoff Ratio 1.18 1.10 1.26 INF
    Sharpe Ratio 2.27 1.19 1.36 2.30
    Ulcer Index 8.55 9.96 12.16 11.48
    Wealth-Lab Error Term 4.82 4.76 5.77 8.76
    Wealth-Lab Reward Ratio 22.32 6.56 12.99 53.95
    Luck Coefficient 10.43 4.50 10.01 1.00
    Pessimistic Rate of Return 1.09 1.00 1.07 0.00
    Equity Drop Ratio 0.03 0.12 0.06 0.01


    仅供参考,投机风险极大。
     
  2. 厉害 菜鸟观摩学习
     
  3. 抱歉,我在wld3下似乎无法复制你的回测结果,能不能提供一下你的数据?

    我的数据是:
    2009年7月23日~2009年9月28日的1月橡胶5分钟数据。
    滑点1点,无手续费,初始资金20w,每次交易10手

    但是绩效是:

    Long + Short
    Starting Capital ¥200,000.00
    Net Profit ¥-12,250.00
    Net Profit % -6.12%
    Annualized Gain % -29.13%
    Number of Trades 135
    Avg Profit/Loss ¥-90.74
    Avg Bars Held 4.02
    Winning Trades 64
    Winning % 47.41%
    Gross Profit ¥189,250.00
    Largest Winning Trades ¥13,250.00
    Avg Profit ¥2,957.03
    Avg Bars Held 4.19
    Max Consecutive 7
    Losing Trades 71
    Losing % 52.59%
    Gross Loss ¥-201,500.00
    Largest Losing Trade ¥-11,250.00
    Avg Loss ¥-2,838.03
    Avg Bars Held 3.87
    Max Consecutive 7
    Max Drawdown ¥-59,000.00
    Max Drawdown Date 2009-9-28
    Max Drawdown % -24.30%
    Max Drawdown % Date 2009-9-28

    似乎我们的差距比较大。
     
  4. 支持实务贴
     
  5. 差异的原因可能是我设置了滑点,而楼主没有设置滑点。
    其他条件不变,滑点设置为0,手续费调整为10元/手之后,结果如下:

    Long + Short
    Starting Capital ¥200,000.00
    Net Profit ¥11,100.00
    Net Profit % 5.55%
    Annualized Gain % 34.24%
    Number of Trades 137
    Avg Profit/Loss ¥81.02
    Avg Bars Held 3.79
    Winning Trades 72
    Winning % 52.55%
    Gross Profit ¥198,100.00
    Largest Winning Trades ¥13,300.00
    Avg Profit ¥2,751.39
    Avg Bars Held 4.19
    Max Consecutive 8
    Losing Trades 65
    Losing % 47.45%
    Gross Loss ¥-187,000.00
    Largest Losing Trade ¥-11,200.00
    Avg Loss ¥-2,876.92
    Avg Bars Held 3.34
    Max Consecutive 7
    Max Drawdown ¥-48,800.00
    Max Drawdown Date 2009-8-21
    Max Drawdown % -20.11%
    Max Drawdown % Date 2009-8-21

    跟楼主的基本持仓特征差不多。

    橡胶的一个滑点,是25元/手,如果增加一个滑点,绩效的变动就差异那么大,似乎楼主的系统对外部条件太敏感了。而除非楼主有自动交易的接口,不然似乎无法避免滑点的影响。兄台能不能说说实际中是如何交易的?

    多谢
     
  6. 有自动交易的接口一样会有滑点。不过楼主的策略是反趋势,这个可以减少很多滑点的发生。甚至如果用limit单实现,滑点可以没有。
     
  7. 是的,不过国内没有limit单的吧
     
  8. 倒,国内一般都是limit单
     
  9. 如果不是自动下单的方式,那就涉及到数据输入、script刷新,发现警报、手工下单这几个步骤,这么长一串步骤下来,即使是反趋势的系统,成交价与报警价之间也会有差异,所以我对lz如何实现的比较好奇;
    再有,原script中有的下单指令是 ...atMarket(bar,...),并且有...atLimit(bar,...), ...atClose(bar,...),而没有设置相应的滑点,这些都有引用未来数据的嫌疑。
    如果把以上的指令中的bar都改成bar+1,把滑点仍然设置成1点(将手续费包含在其中),还是在2009年7月23日到2009年9月28日的5分钟上进行回测,结果总的净回报就是亏2.75%左右了。

    PS:建议把回帖冻结时间延长到半个小时,不然太不方便了,一不留神就不能修改帖子了。
     
  10. 没仔细看策略。不过如果用了 atMarket(bar,...),...atLimit(bar,...), 这样的指令,结果不太可靠的。 上述这些都需要bar+1

    ...atClose(bar,...) 倒是可以成立。
     
  11. 回答以下大家的问题:
    1 “如果不是自动下单的方式,那就涉及到数据输入、script刷新,发现警报、手工下单这几个步骤,这么长一串步骤下来,即使是反趋势的系统,成交价与报警价之间也会有差异,所以我对lz如何实现的比较好奇;”

    使用的是文华的报价系统,这些交易条件可以很容易的在文华中实现实时预警,wealth-lab只是用于回测,并不是用于自动交易。

    2 “橡胶的一个滑点,是25元/手,如果增加一个滑点,绩效的变动就差异那么大,似乎楼主的系统对外部条件太敏感了。而除非楼主有自动交易的接口,不然似乎无法避免滑点的影响。兄台能不能说说实际中是如何交易的?”

    系统中大部分是limit单,加上一些小技巧,可以使滑点降低到平均每次交易0.2个点左右。我是手动交易的,很累。

    3 “没仔细看策略。不过如果用了 atMarket(bar,...),...atLimit(bar,...), 这样的指令,结果不太可靠的。 上述这些都需要bar+1

    ...atClose(bar,...) 倒是可以成立。”

    可能指这一段
    if ( GetHour( Bar ) = 14 ) and ( GetMinute( Bar ) = 35 ) then
    begin
    cb1 := true;
    end;
    if cb1 then
    begin
    SellAtMarket( Bar, p, '' );
    end;
    这段的意思是在14:35平仓,结束一天的交易。等效于
    if ( GetHour( Bar ) = 14 ) and ( GetMinute( Bar ) = 30 ) then
    begin
    cb1 := true;
    end;
    if cb1 then
    begin
    SellAtMarket( Bar + 1, p, '' );
    end;
    由于只是用于回测,编的有些不规范,见谅。
     
  12. 交易的滑点是必须考虑的。如果一个交易策略在增加了一个滑点后就变为亏损,则这个策略的可行性比较可疑。
     
  13. 一个滑点就可决定盈亏的系统请重新慎重评估,在下看来,这已经是一个必亏的系统了,呵呵
     
  14. 资金管理有些简单