以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  策略编写求助区  (http://222.73.7.161/bbs/list.asp?boardid=11)
----  仓位计算  (http://222.73.7.161/bbs/dispbbs.asp?boardid=11&id=8792)

--  作者:tonybig
--  发布时间:2011/11/3 22:12:07
--  仓位计算

小弟求一个组合仓位资金管理计算方式,

 

固定资产为50万, 按照40%仓位平均划分给不同品种(例如:1手铜需要5万,那么对应的必须开两手胶,5手pta),

 

当总资产盈利达到足够再次平均加仓的时候的仓位计算公式(总体仓位仍然保持40%);

 

下面我想了个思路,但不知道可行否,希望老师能够指点修正一,或者还有什么其它好的算法。

 

 

总资产*40% /  (A品种价格*合约手数*保证金+b品种价格*合约手数*保证金)=平均开仓手数(取整数);

 

当上面平均开仓手数大于1小于二的时候,再使用下列具体公式计算不同品种的开仓数,小于3大于2,再进行下一次的仓位计算

总资产*40% / 品种数量 / A品种价格*合约手数*保证金 =实际品种开仓数量();


--  作者:tonybig
--  发布时间:2011/11/4 8:52:44
--  

我自己编了出来,但是那位大哥能把它做个循环,  当资金足够分配=1时,开始进行lots计算,  当资金足够分配=2,再进行lots分配, 以此循环到资金等于10,lots也跟着计算10次;

 

资金足够分配:intpart(asset*0.4/(dynainfo2(7,\'cu00\')*multiplier*0.18+dynainfo2(7,\'ru00\')*multiplier*0.18+dynainfo2(7,\'ta00\')*multiplier*0.18));

 

lots:intpart(asset*0.4/3/dynainfo2(7,\'ru00\')*multiplier*0.18);

 

问题2:另外我想加入对目前加载的品种做出判断,红字部分显示为当前合约价格?

 intpart(asset*0.4/3/dynainfo2(7,\'ru00\')*multiplier*0.18);


--  作者:fly
--  发布时间:2011/11/4 10:32:22
--  

资金足够分配:intpart(asset*0.4/(dynainfo2(7,\'cu00\')*multiplier*0.18+dynainfo2(7,\'ru00\')*multiplier*0.18+dynainfo2(7,\'ta00\')*multiplier*0.18));

 

lots:intpart(asset*0.4/3/dynainfo2(7,\'ru00\')*multiplier*0.18);

 

在资金同等的情况下,这两个值没啥可比性----不同合约的最新价是不一样的,除个3求平均,没啥意思.

 

 

楼主这等于是按照资金情况,决定是否加仓,及加仓多少.

先判断当前有多少持仓,图表上,HOLDING就直接是持仓,再

判断你的资金的40%够开多少手,

如果大于持仓,就加仓1手好了.

 

弄个循环,不是增加运算量吗?


--  作者:tonybig
--  发布时间:2011/11/4 13:26:06
--  

谢谢fly大哥回答,我的意思是当账户资金盈利足够平均再开一手的情况下才加仓, 但我写不出这么复杂的意思, 还请 fly大哥把你说的这个做成 代码 吧 , 我用来参考学习一下 谢谢

[此贴子已经被作者于2011-11-4 13:30:20编辑过]

--  作者:fly
--  发布时间:2011/11/4 15:31:20
--  

//图表程序化.

 

num:=intpart(tasset*0.4/(dynainfo2(7,\'cu00\')*multiplier*0.18+dynainfo2(7,\'ru00\')*multiplier*0.18+dynainfo2(7,\'ta00\')*multiplier*0.18));

//判断是否加仓

if holding>0 and num>holding then buy(1,1,mkt);

if holding<0 and num>ABS(holding) then buyshort(1,1,mkt);