求助!关于用到会员持仓数据的策略。
各位老师们好~我遇到了调用会员持仓数据时,策略报告中的头寸与打开K线图表后显示的头寸不符的情况。例如TA上的,4月25号空开的信号,K线图表中的显示31手时正确的,但打开策略报告中是15手(缩小的一半),发现很多错误的都是不需要缩小一半头寸的,结果在策略报告中是缩小一半的,但打开K线图是显示是正常的。麻烦帮我看一下,谢谢了。策略是简单的突破策略data0:5分钟K线data1:日线入场:盘中价格突破较长周期最高或最低价时入场.出场:盘中价格突破较短周期最高或最低价时离场。无止损头寸:单笔最大亏损2W,2倍ATR倒推计算得出。头寸调节:调用会员持仓数据,例如多单,合计<=0时缩小一半// 简称: temp20240528 // 名称: temp20240528 // 类别: 公式应用 // 类型: 用户应用 // 输出: Void // // 会员持仓调整头寸,图表上显示的信号仓位正确,打开参数报告里的交易记录仓位错误 // //------------------------------------------------------------------------ Params Numeric one_loss(20000); Vars //【data1_日线】 Series<Numeric> LongD_H; Series<Numeric> ShortD_H; Series<Numeric> LongD_L; Series<Numeric> ShortD_L; Series<Numeric> myatr; Numeric i; Series<Numeric> lots; //会员持仓部分 String T_Object; //主力合约 Dic<Array<String>>R_Data_ROLLOVER(\"TB_ROLLOVER_v2\"); Array<Array<String>> rvalue_B; Array<Array<String>> rvalue_S; Series<Numeric> HYB20; //会员持仓_多头持仓合计 Series<Numeric> HYS20; //会员持仓_空头持仓合计 Series<Numeric> MyTop20; //会员持仓合计后的多空差 Events //Bar更新事件函数,每根BAR都需要运行 onBar(ArrayRef<Integer> indexs) { Range[1:1] { T_Object=R_Data_ROLLOVER[0][0]; Commentary(\"合约:\"+T_Object); GetDicValue(\"TB_MEMBER_positions_long\",T_Object,date,rvalue_B); GetDicValue(\"TB_MEMBER_positions_short\",T_Object,date,rvalue_S); HYB20 = 0; HYS20 = 0; for i = 0 to 19 { HYB20 = HYB20 + Value(rvalue_B[i][1]); HYS20 = HYS20 + Value(rvalue_S[i][1]); } MyTop20 = HYB20 - HYS20; MyTop20 = MyTop20[1]; Commentary(\"TOP20: \"+text(MyTop20)); myatr = 0; ShortD_H = 0; ShortD_L = 999999999; LongD_H = 0; LongD_L = 999999999; for i = 1 to 19 { myatr = myatr + (Max(close[i+1],high[i]) - Min(close[i+1],low[i])); LongD_H = Max(LongD_H,High[i]); LongD_L = Min(LongD_L,Low[i]); if(i <= 9) { ShortD_H = Max(ShortD_H,High[i]); ShortD_L = Min(ShortD_L,Low[i]); } } myatr = myatr / 9; } Commentary(\"HYB20:\"+text(data1.HYB20)); Commentary(\"HYS20:\"+text(data1.HYS20)); Commentary(\"TOP20: \"+text(data1.MyTop20)); //建仓 If(MarketPosition != 1 and high > data1.LongD_H) { lots = Max(1,IntPart(one_loss/(data1.myatr*2*ContractUnit))); if(data1.MyTop20 <= 0) lots = lots*0.5; Commentary(\"lots:\"+text(lots)); Buy(lots,max(Open,data1.LongD_H)); } If(MarketPosition != -1 and low < data1.LongD_L) { lots = Max(1,IntPart(one_loss/(data1.myatr*2*ContractUnit))); if(data1.MyTop20 >= 0) lots = lots*0.5; Commentary(\"lots:\"+text(lots)); SellShort(lots,min(Open,data1.LongD_L)); } //平仓 If(MarketPosition == 1) { If(low <= data1.ShortD_L) Sell(Abs(CurrentContracts),Min(data1.ShortD_L,Open)); } If(MarketPosition == -1) { If(High >= data1.ShortD_H) BuyToCover(Abs(CurrentContracts),Max(data1.ShortD_H,Open)); } } //------------------------------------------------------------------------