账户成交更新事件void OnFill(FillRef ordFill)中,结构体调用开平标志combOffset,只有开仓能通过,平仓为什么通过不了
2023-10-23 10:13

先做一个测试代码:开一手多仓,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;}

}

结果


data-href=


源代码中去掉 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;}


}

   data-href=

结果如下

data-href=

说明 ordFill.combOffset==Enum_Exit

开平标志combOffset,只有开仓能通过 平仓根本通过不了


问题是:10tick 内,分别做开,平仓操作。通过“账户成交更新事件void OnFill(FillRef ordFill)” 得到“开平仓价格”。由ordFill.combOffset进行判断哪个是开仓,哪个是平仓,结果输出到本地数据库。

第一段代码是完整代码。第二段去掉ordFill.combOffset==Enum_Exit这个平仓枚举判断。

两段代码输出结果证明,对象ordFill.combOffset根本不识Enum_Exit这个平仓枚举










评论区
blackduke

\"\"

2023-10-25 14:50
顶部