先做一个测试代码:开一手多仓,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这个平仓枚举
代码看过了,现在收盘了没办法测试
我觉得这个问题其实只要输出一下fill结构体的comboffset这个属性,然后把所有对应的enum枚举值都输出一下,看看到底你收到的fill是什么状态就清楚了
看一下代码。
顺便说一下,你这个代码习惯不太好,可阅读性很差。
能精炼一下表达的意思吗,这么多东西看不懂你要说明什么问题
平仓通过不了什么东西?通过怎样的demo代码能复现这个问题?