金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 341|回复: 7

资金仓位管理

[复制链接]

2

主题

20

帖子

30

积分

Rank: 6Rank: 6

等级: 机构版

注册:
2023-2-16
曾用名:
发表于 2026-3-25 14:33 | 显示全部楼层 |阅读模式
图表回测里如何设置账户初始资金1000万,最大资金使用率20%,然后获取该合约保证金,计算最大开仓总手数,然后开始开仓,第一次开仓开总手数的二分之一,第二次加仓是剩余手数的二分之一,以此类推,每次加仓都是逐步递减,直到加仓到最后的持仓不超过最大开仓总手数,请问代码如何编写?谢谢啦
回复

使用道具 举报

2

主题

6366

帖子

6366

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-3-25 15:27 | 显示全部楼层
这个思路在回测里有个问题。你初始计算手数的位置是 如果是较早的历史K位置,那么你这个手数 是按照当时行情计算的。

比如黄金,可能你策略加载的起始位置时候黄金才五百多,你的资金够开10手。实际后面行情涨上来,你预设的手数开下来最终资金是超过初始的20%的。
回复

使用道具 举报

2

主题

20

帖子

30

积分

Rank: 6Rank: 6

等级: 机构版

注册:
2023-2-16
曾用名:
 楼主| 发表于 2026-3-25 15:30 | 显示全部楼层
资深技术05 发表于 2026-3-25 15:27
这个思路在回测里有个问题。你初始计算手数的位置是 如果是较早的历史K位置,那么你这个手数 是按照当时行 ...

用ASSET函数去做每天的结算,就可以实时去看手数了,只需要确保手数在加仓的时候越加越少就可以了,账户资金的增加只需要实时去计算就可以了
回复

使用道具 举报

2

主题

6366

帖子

6366

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-3-25 15:32 | 显示全部楼层
本帖最后由 资深技术05 于 2026-3-25 15:34 编辑

你的意思是每天重新获取asset?然后重新计算一个按照百分比的折算出来的手数 供下个交易日参考使用?

相当于你这一套是一个日内加仓的思路?
回复

使用道具 举报

2

主题

6366

帖子

6366

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-3-25 15:40 | 显示全部楼层
或者 也可以在每次清仓时候 重新计算下这个初始的手数。这样可能更合理。
回复

使用道具 举报

2

主题

20

帖子

30

积分

Rank: 6Rank: 6

等级: 机构版

注册:
2023-2-16
曾用名:
 楼主| 发表于 2026-3-26 13:23 | 显示全部楼层
资深技术05 发表于 2026-3-25 15:32
你的意思是每天重新获取asset?然后重新计算一个按照百分比的折算出来的手数 供下个交易日参考使用?

相 ...

是的,是的,麻烦您这边能帮写一个完整的代码模块嘛,谢谢啦
回复

使用道具 举报

2

主题

6366

帖子

6366

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-3-26 13:39 | 显示全部楼层
我按照平仓时候重置来处理的。  你可以参考下这个思路。


[PEL] 复制代码
variable:s1:=0,初始投入资金:=0;



if  barpos=1  then 
begin 
初始投入资金:=asset*0.2;//初始资金的20%	
marginratio:=taccount(41);//多头保证金比率. 这个要把合约信息设置里面的费率设置正确,否则函数取到的值可能是不对的。
bzj:=close*multiplier*marginratio;//一手保证金占用
s1:=intpart(初始投入资金/(bzj));//根据资金计算的开仓手数, 根据实际情况可能为0 需要额外判断。
 	   
end 



初始手数:S1;//仅输出使用


ma5:ma(c,10);
ma10:ma(c,20);
ma30:ma(c,30);


kd:cross(ma5,ma10) or cross(ma10,ma30) or cross(ma5,ma30);
pd:cross(ma10,ma5) and cross(ma30,ma5);


if kd and abs(holding)<s1 then
begin
reals:=max(1,intpart(s1-abs(holding))/2);
buy(1,reals,market); 
end 


if pd and holding<>0 then 
begin
sell(1,0,market); 
//平仓时候重置
初始投入资金:=asset*0.2;//初始资金的20%	
marginratio:=taccount(41);//多头保证金比率. 这个要把合约信息设置里面的费率设置正确,否则函数取到的值可能是不对的。
bzj:=close*multiplier*marginratio;//一手保证金占用
s1:=intpart(初始投入资金/(bzj));//根据资金计算的开仓手数, 根据实际情况可能为0 需要额外判断。
end 






回复

使用道具 举报

2

主题

6366

帖子

6366

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-3-26 13:39 | 显示全部楼层
截图202603261339345129.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2026-4-3 01:46 , Processed in 0.147123 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表