ktdev 发表于 2013-8-24 21:07:49

凯利公式和%Risk Model仓位管理公式转换成金魔方

这是坛友banker2882 提供的一个EL策略,这个策略综合了各种资金仓位管理模型,是值得参考的一个策略模版。
谢谢 banker2882 的提供,原帖在 http://hs633.com/forum.php?mod=viewthread&tid=10412
以下已经用公式转换器转成金魔方实现。
Input: Price(0), {???}
PtUp(4. ), PtDn(4. ), {Max correction to change trend}
MM_Model(2 ), {1 = % Risk Model; 2 = % Volatility Model;
3 = Drawdown Model; 4 = Kelly Model; 5 = Williams' Model;
6 = Fixed Ratio Model; 7= Market Money Model}
MM(1 ), {% Risk parameter}
MM_add(0 ), {% Risk for playing market money; 0 to disactivate}
MaxVolat(100 ), {% Risk for playing market money; 100 to disactivate}
MaxDD(20 ), {% Drawdown ?????}
InitCapital(100000 ); {Initial capital to trade ????}
Variable: LL(99999 ), HH(0 ), Trend(0 ), Volat(TrueRange );
Variable: MP(0 ), Risk(High - Low ), Num(1 ), add_num(0 ), red_num(0 ), FRDelta(0 ),
DD(0 ),
Equity1(InitCapital ), TotalEquity(InitCapital ), EqTop(InitCapital ),
AssuredProfit(0 ), HPositionProfit(0 ), Kelly(0 );

Price:=(H+L)*.5;
MP := MarketPosition ;
Volat := 0.5 * TrueRange + 0.5*Volat ;
if MP  <= 0  then begin
    if Price  < LL  then LL := Price ;
        if CrossOver(Price,LL*(1 + PtUp*.01 ))  then begin
                        Trend := 1 ;
                        HH := Price ;
                  end;
    end;
   
if MP  >= 0  then begin
    if Price  > HH  then HH := Price ;
        if CrossUnder(Price,HH*(1 - PtDn*.01 ))  then begin
                        Trend := -1 ;
                        LL := Price ;
                  end;
    end;
   
If trend  = 1  then
    Risk := PtDn * .01 * close  {+ Slippage};
If trend  = -1  then
    Risk := PtUp * .01 * close  {+ Slippage};
   
HPositionProfit := Max( PositionProfit , HPositionProfit ) ;
AssuredProfit := HPositionProfit - Risk ;
Equity1 := InitCapital + NetProfit ;
TotalEquity := Equity1 + PositionProfit ;
EqTop := Max(EqTop , TotalEquity ) ;

if MM_Model  = 1  then { % Risk Model }
Num := Floor(MM * Equity1 *.01/Risk ) ;
if MM_Model  = 2  then { % Volatility Model }
Num := Floor(MM * Equity1 *.01/ Volat / BigPointValue  ) ;
if MM_Model  = 3  then begin { Drawdown Model }
Num := Floor(MM * (Equity1 - (1 - MaxDD*.01 ) * EqTop ) * .01 / Volat /
BigPointValue ) ;
end;
if MM_Model  = 4  then begin { Kelly Model }
If TotalTrades  > 20  and GrossProfit  > 0  then
Kelly  = NumWinTrades/TotalTrades * (1 - GrossLoss/GrossProfit )  ;
else
Kelly := 0.1 ;
if Kelly  > .9  then Kelly := .9 ;
Num := Floor(MM * Kelly * Equity1 * .01 / Risk ) ;
{Print(Kelly);}
end;
if MM_Model  = 5  then begin { Larry Williams' Model }
value11 := Max(-LargestLosTrade / Max(CurrentContracts , 1 )  , Risk ) ;
Num := Floor(MM * Equity1 *.01 / value11 ) ;
end;
if MM_Model  = 6  then begin { Fixed Ratio Model }
{ DD = MaxList(DD, (EqTop - TotalEquity)/MaxList(CurrentContracts, 1)) ; {Max
Drawdown}
if TotalTrades  > 20  and DD  > 0  then FRDelta  = MM * DD *.01  ;
else  
FRDelta := MM * volat * BigPointValue * .01 ; {Delta}
value12 := Max(Equity1 - .5*close*(close + FRDelta )/FRDelta , 0.25 ) ;
Num := Floor(Sqrt(2*value12/FRDelta + .25 ) + .5 ) ;
end;
if MM_Model  = 7  then { Playing the market money }
num := Floor((MM * (InitCapital + Min(NetProfit , 0 ) ) + MM_add *
Max(NetProfit , 0 ) ) * .01 / Volat / BigPointValue ) ;
{ Entries}
if trend  = 1  and trend  <> 1  then Buy('', num , 0, 0, OT_Market, OB_NextBar,  'Trend.LE');
if trend  = -1  and trend  <> -1  then SellShort('', num , 0, 0, OT_Market, OB_NextBar,  'Trend.SE');
add_num := Floor( MM_add * AssuredProfit * .01/ Volat / BigPointValue ) ;
{ Assured Profit Pyramiding }
if add_num  > 0  and PositionProfit  > Volat * BigPointValue  then begin
if Trend  = 1  and MP  = 1  then Buy('', add_num , 0, 0, OT_Market, OB_NextBar,  'Add.LE');
if Trend  = -1  and MP  = -1  then SellShort('', add_num , 0, 0, OT_Market, OB_NextBar,  'Add.SE');
end;
red_num := Floor((CurrentContracts * Volat * BigPointValue - MaxVolat *
TotalEquity * .01 )/ close ) ;
if red_num  > 0  then begin
if Trend  = 1  and MP  = 1  then Sell('', red_num , 0, 0, OT_Market, OB_NextBar, 'Red.LX');
if Trend  = -1  and MP  = -1  then BuyToCover('', red_num , 0, 0, OT_Market, OB_NextBar, 'Red.SX');
end;
if Num  < 1  then Num := 1 ;运行结果

bluechina 发表于 2013-8-28 12:27:48

收藏,学习,研究

candc2002 发表于 2013-8-31 00:46:38

学习学习

大炼钢铁 发表于 2013-9-9 23:34:21

收藏,学习,研究

312gd 发表于 2013-9-11 12:41:52

收藏,学习,研究

gz12345678gz 发表于 2013-9-11 20:09:11

收藏,学习,研究
感觉很复杂啊

a13942040710 发表于 2013-9-27 20:46:49

学习,学习{:1_1:}

FoyQ8o 发表于 2013-11-3 15:05:51

顶也~~~











static/image/common/sigline.gif
宾馆、酒店、工厂、家庭中央热水系统与中央空调工程咨询电话:400-885-7765    手机:18927541760

xiuzong 发表于 2013-11-16 15:41:53

学习,顶一个。

9898good 发表于 2014-1-8 17:30:11

收藏,学习,研究
页: [1] 2
查看完整版本: 凯利公式和%Risk Model仓位管理公式转换成金魔方