全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
请教一下老师,模拟测试当中出现交易量大于当前资金可开仓数量,应该如何解决呢?
ttp6319 分享到
2023-07-27 10:20

系统当中引入了教学案例海龟交易法则当中的资金管理方式,出现交易量大于可开仓数量后,资金引入了一个Lots,取两者之间的最小值作为建仓头寸,但是依旧出现以上的问题,以下为资金管理的代码,麻烦老师过目以下,谢谢

Params

Numeric RiskRatio(1);

Numeric Length(15);


Vars

Numeric Lots; //可建仓手数

Series<Numeric> AvgTR; // ATR

Numeric N; // N 值

Numeric TotalEquity; // 按最新收盘价计算出的总资产

Numeric TurtleUnits; // 交易单位

Defs

//此处添加公式函数

Events

//此处实现事件函数

//初始化事件函数,策略运行期间,首先运行且只有一次

OnInit()

{

AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权

AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格

AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓

AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算

}



//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组

OnBar(ArrayRef<Integer> indexs)

{

Commentary(\"CurrentBar==\"+Text(CurrentBar));

Lots = IntPart(Portfolio_CurrentCapital/(MarginRatio * Open * ContractUnit * BigPointValue)); //计算当前账户可开仓数量,以Open作为价格

Commentary(\"当前账户可开仓数量:\"+Text(Lots));

AvgTR = XAverage(TrueRange,Length); //ATR波幅

N = AvgTR[1]; //海龟N值

TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin(); //总资金量

TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue()); //建仓头寸

TurtleUnits = IntPart(TurtleUnits);

TurtleUnits = Min(TurtleUnits,Lots);

}



wangkaiming

data-href=

手数有问题,就是代码有问题, 手数验算一下就知道对不对了

上面的是海龟,我看Lots = IntPart(Portfolio_CurrentCapital/(MarginRatio * Open * ContractUnit * BigPointValue));

2023-07-27 12:55
ttp6319
@wangkaiming

感谢王老师回复,您复制的这段代码,和我发出来的我进行了详细的对比,代码确实没有错误的地方,除了后面加进去lots部分;

但是通过TB进行模拟验证的时候,出现了发帖请教的问题。

上午又出现了一笔花生的开仓情况:

策略设置的为12%的保证金,每个品种10万的本金,花生的保证金为10300*5**12%=6180元/手,系统提示交易量28大于当前资金可开仓数量24,如果24手的话需要的资金为148320元,也是大于我设置的单品种总的保证金的;

自己确实没有从代码当中找出问题的所在,希望王老师可以帮忙再看看

2023-07-27 13:33
ttp6319
@wangkaiming

\"\"

在进行历史回撤的时候,策略运行也出现了类似的情况,也是用的同样的海龟资金管理代码

2023-07-27 13:57
ttp6319
@wangkaiming

在策略当中,如果不用资金管理,在开仓的时候直接用1表示开仓手数,策略运行当中就不存在这个问题了。但是一旦加入资金管理,就又出现类似的问题。下面两种资金管理方式都出现了同样的问题:

计算账户可开仓手数

Lots = IntPart(Portfolio_CurrentCapital/(MarginRatio * Open * ContractUnit * BigPointValue)); //计算当前账户可开仓数量,以Open作为价格

海龟资金管理

AvgTR = XAverage(TrueRange,ATRLength); //ATR波幅

N = AvgTR[1]; //海龟N值

TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin(); //总资金量

TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue()); //建仓头寸

TurtleUnits = IntPart(TurtleUnits);   //对建仓头寸取整



2023-07-27 14:32
wangkaiming

学会自己验算 , 你的代码100W要用98W资金,而且还是9%保证金的情况,钱怎么会够

Vars

Series<Numeric> AvgTR;

Events


OnBar(ArrayRef<Integer> indexs)

{

Numeric TotalEquity;

Numeric TurtleUnits;

Numeric n;

AvgTR = XAverage(TrueRange,20);

N = AvgTR[1];

TotalEquity = 1000000;

//100w 0.5

TurtleUnits = (TotalEquity*0.5/100) /(2 * ContractUnit()*BigPointValue());

TurtleUnits = IntPart(TurtleUnits); // 对小数取整

Commentary(100W0.5风险开仓数量=+text(TurtleUnits));

Commentary(反推资金=+text(TurtleUnits*close*ContractUnit*MarginRatio));

Commentary(图表保证金率=+text(MarginRatio));

////Portfolio_CurrentCapital

numeric Lots = IntPart(TotalEquity/(MarginRatio * Open * ContractUnit * BigPointValue));

Commentary(反推lots资金=+text(Lots*close*ContractUnit*MarginRatio));

}

data-href=

2023-07-28 08:03
您未登录,请先 登录注册 后发表评论
顶部