请教一下老师,模拟测试当中出现交易量大于当前资金可开仓数量,应该如何解决呢?
系统当中引入了教学案例海龟交易法则当中的资金管理方式,出现交易量大于可开仓数量后,资金引入了一个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); }
Lots = IntPart(Portfolio_CurrentCapital/(MarginRatio * Close * ContractUnit * BigPointValue)); //计算当前账户可开仓数量,以close作为价格看样子用这个管理可以借鉴一下
学会自己验算 , 你的代码100W要用98W资金,而且还是9%保证金的情况,钱怎么会够Vars Series<Numeric> AvgTR;EventsOnBar(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));}
手数有问题,就是代码有问题, 手数验算一下就知道对不对了上面的是海龟,我看Lots = IntPart(Portfolio_CurrentCapital/(MarginRatio * Open * ContractUnit * BigPointValue));
回复:感谢王老师回复,您复制的这段代码,和我发出来的我进行了详细的对比,代码确实没有错误的地方,除了后面加进去lots部分;但是通过TB进行模拟验证的时候,出现了发帖请教的问题。上午又出现了一笔花生的开仓情况:策略设置的为12%的保证金,每个品种10万的本金,花生的保证金为10300*5**12%=6180元/手,系统提示交易量28大于当前资金可开仓数量24,如果24手的话需要的资金为148320元,也是大于我设置的单品种总的保证金的;自己确实没有从代码当中找出问题的所在,希望王老师可以帮忙再看看
回复:在进行历史回撤的时候,策略运行也出现了类似的情况,也是用的同样的海龟资金管理代码
回复:在策略当中,如果不用资金管理,在开仓的时候直接用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); //对建仓头寸取整