账户成交更新事件void OnFill(FillRef ordFill)中,结构体调用开平标志combOffset,只有开仓能通过,平仓为什么通过不了
先做一个测试代码:开一手多仓,10个tick后平仓。记录开仓价格与平仓价格Params Vars Global Numeric myportfolio(10000);//初始资金设置 Global Integer aa; Global Integer bb; Bool ret; Global String str0; Global Numeric longRate; Global Numeric shortRate; Events OnReady() { Bool ret(False); MarginRate mRate; While(!ret) {ret=A_GetMarginRate(Symbol,mRate);} longRate=mRate.longMarginRatio; shortRate=mRate.shortMarginRatio; aa=0; } onBar(ArrayRef<Integer> indexs) { If(BarStatus==2) { If(aa==0) {ret=False; While(!ret) {ret=A_SendOrder(Enum_Buy,Enum_Entry,1,Q_AskPrice);} bb=Q_AskPrice;} aa=aa+1; If(aa==10) {ret=False; While(!ret) {ret=A_SendOrder(Enum_Sell,Enum_Exit,1,Q_LowerLimit);}} } } OnFill(FillRef ordFill) { If((ordFill.combOffset==Enum_Entry)&&(ordFill.side==Enum_Buy)) {SetTBProfileString(SymbolName+_数据,buy=,Text(ordFill.fillPrice));} If((ordFill.combOffset==Enum_Entry)&&(ordFill.side==Enum_Sell)) {SetTBProfileString(SymbolName+_数据,sell=,Text(ordFill.fillPrice));} If((ordFill.combOffset==Enum_Exit)&&(ordFill.side==Enum_Sell)) {myportfolio=(ordFill.fillPrice-bb)*ordFilL.fillVolume/longRate*0.99+myportfolio; SetTBProfileString(SymbolName+_数据,cc=,Text(1)); SetTBProfileString(SymbolName+_数据,longRate=,Text(longRate)); SetTBProfileString(SymbolName+_数据,coverbuyprice=,Text(ordFill.fillPrice)); SetTBProfileString(SymbolName+_数据,coverbuyvolume=,Text(ordFilL.fillVolume)); SetTBProfileString(SymbolName+_数据,myportfolio=,Text(myportfolio));} If((ordFill.combOffset==Enum_exit)&&(ordFill.side==Enum_Buy)) {myportfolio=(aa-ordFill.fillPrice)*ordFilL.fillVolume/shortRate*0.99+myportfolio;} }结果源代码中去掉 ordFill.combOffset==Enum_Exit 平仓标志判断Params Vars Global Numeric myportfolio(10000);//初始资金设置 Global Integer aa; Global Integer bb; Bool ret; Global String str0; Global Numeric longRate; Global Numeric shortRate; Events OnReady() { Bool ret(False); MarginRate mRate; While(!ret) {ret=A_GetMarginRate(Symbol,mRate);} longRate=mRate.longMarginRatio; shortRate=mRate.shortMarginRatio; aa=0; } onBar(ArrayRef<Integer> indexs) { If(BarStatus==2) { If(aa==0) {ret=False; While(!ret) {ret=A_SendOrder(Enum_Buy,Enum_Entry,1,Q_AskPrice);} bb=Q_AskPrice;} aa=aa+1; If(aa==10) {ret=False; While(!ret) {ret=A_SendOrder(Enum_Sell,Enum_Exit,1,Q_LowerLimit);}} } } OnFill(FillRef ordFill) { If((ordFill.combOffset==Enum_Entry)&&(ordFill.side==Enum_Buy)) {SetTBProfileString(SymbolName+_数据,buy=,Text(ordFill.fillPrice));} If((ordFill.combOffset==Enum_Entry)&&(ordFill.side==Enum_Sell)) {SetTBProfileString(SymbolName+_数据,sell=,Text(ordFill.fillPrice));} If((ordFill.side==Enum_Sell)) {myportfolio=(ordFill.fillPrice-bb)*ordFilL.fillVolume/longRate*0.99+myportfolio; SetTBProfileString(SymbolName+_数据,cc=,Text(1)); SetTBProfileString(SymbolName+_数据,longRate=,Text(longRate)); SetTBProfileString(SymbolName+_数据,coverbuyprice=,Text(ordFill.fillPrice)); SetTBProfileString(SymbolName+_数据,coverbuyvolume=,Text(ordFilL.fillVolume)); SetTBProfileString(SymbolName+_数据,myportfolio=,Text(myportfolio));} If((ordFill.combOffset==Enum_exit)&&(ordFill.side==Enum_Buy)) {myportfolio=(aa-ordFill.fillPrice)*ordFilL.fillVolume/shortRate*0.99+myportfolio;} } 结果如下说明 ordFill.combOffset==Enum_Exit 开平标志combOffset,只有开仓能通过 平仓根本通过不了问题是:在10tick 内,分别做开,平仓操作。通过“账户成交更新事件void OnFill(FillRef ordFill)” 得到“开平仓价格”。由ordFill.combOffset进行判断哪个是开仓,哪个是平仓,结果输出到本地数据库。第一段代码是完整代码。第二段去掉ordFill.combOffset==Enum_Exit这个平仓枚举判断。两段代码输出结果证明,对象ordFill.combOffset根本不识Enum_Exit这个平仓枚举