我写了一个程序,通过A_GetPreFills获取当天的成交单列表,进行分析,统计出盈亏和手续费列表。一共14个商品,同时操作2个模拟资金账户。当天在2个账户都有成交下单。
当我只指定一个账户,执行结果是14条记录,都是正常的。但是当绑定2个账户。出来28记录。只有一个账户结果是正常,而另外一个账户的盈亏结果出现异常。通过对成交列表分析出的盈亏值明显不对。好像少算,把当前持仓的价格也算到盈亏里去了。但是如果单独绑定任何一个账户,结果都是正常的。想不出问题在哪,请老师帮我看一下,是否有语法问题。
如果看代码没语法问题,也查不出原因,老师能否提供利用A_GetPreFills分析当日实时盈亏的范例。就是账户透视页面右下角的商品列表的当日盈亏的实时更新,在量化看盘里如何实现?找了帮助文档,没有这方面的例子,自己写的又出问题,不知道怎么查
//------------------------------------------------------------------------
// 简称: GPJY_W8
// 名称: GPJY_W8
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
//此处添加参数
Vars
//此处添加变量
Defs
//此处添加公式函数
bool get_loss(IntegerRef fill_c,NumericRef loss_1,NumericRef loss_2,Integer acco_i=0)
{
Array<Fill> fills;
Array<CodeProperty> props;
GetProperty(Symbol, props);
Integer i;
Numeric loss1(0);
Numeric loss2(0);
if(CurrentTime >= 0.090000 and CurrentTime <= 0.133000)
{
A_GetPreFills(Symbol, fills, CurrentDate+0 + 0.090000 , 0, \"\", acco_i);
}else if(CurrentTime >= 0.133000 and CurrentTime <= 0.210000)
{
A_GetPreFills(Symbol, fills, CurrentDate+0 + 0.133000 , 0, \"\", acco_i);
}else if(CurrentTime >= 0.210000 and CurrentTime <= 0.235959)
{
A_GetPreFills(Symbol, fills, CurrentDate+0 + 0.210000 , 0, \"\", acco_i);
}else if(CurrentTime >= 0.000000 and CurrentTime <= 0.090000)
{
A_GetPreFills(Symbol, fills, CurrentDate-1 + 0.210000 , 0, \"\", acco_i);
}
for i = 0 to GetArraySize(fills) -1
{
if(fills[i].side == Enum_Buy and fills[i].combOffset == Enum_Entry)
loss1 = loss1 - fills[i].fillPrice*props[0].contractUnit;
if(fills[i].side == Enum_Sell and fills[i].combOffset == Enum_Entry)
loss1 = loss1 + fills[i].fillPrice*props[0].contractUnit;
if(fills[i].side == Enum_Buy and fills[i].combOffset != Enum_Entry)
loss1 = loss1 - fills[i].fillPrice*props[0].contractUnit;
if(fills[i].side == Enum_Sell and fills[i].combOffset != Enum_Entry)
loss1 = loss1 + fills[i].fillPrice*props[0].contractUnit;
loss2 = loss2 + fills[i].commission ;
}
if(A_BuyPosition>0)
loss1 = loss1 + A_BuyPosition*C*props[0].contractUnit;
if(A_SellPosition>0)
loss1 = loss1 - A_SellPosition*C*props[0].contractUnit;
fill_c = GetArraySize(fills);
loss_1 = loss1;
loss_2 = loss2;
return true;
}
bool check_loss()
{
Integer k;
Array<Numeric> loss1;
Array<Numeric> loss2;
Array<Integer> fill_count;
For k = 0 To A_AccountCount - 1
{
get_loss(fill_count[k],loss1[k],loss2[k],k);
Print2Quote(\"商品名称\",Symbol,Symbol+\"@\"+A_AccountID(k));
Print2Quote(\"次数\",fill_count[k] ,Symbol+\"@\"+A_AccountID(k));
Print2Quote(\"毛盈亏\",loss1[k] ,Symbol+\"@\"+A_AccountID(k));
Print2Quote(\"手续费\",loss2[k] ,Symbol+\"@\"+A_AccountID(k));
Print2Quote(\"净盈亏\",loss1[k]-loss2[k] ,Symbol+\"@\"+A_AccountID(k));
Print2Quote(\"盈亏比\",loss1[k]/loss2[k] ,Symbol+\"@\"+A_AccountID(k));
}
return true;
}
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
OnInit()
{
}
//在所有的数据源准备完成后调用,应用在数据源的设置等操作
OnReady()
{
check_loss();
}
根据你现在给的代码很难调试诊断出哪里有问题
而且这个代码复制上来格式不对
建议直接把工作区导出后压缩包上传