投资者咨询:算法交易有持仓平仓委托失败 (文华财经WH8赢智V8.2)
来源:文华财经 日期:2018-7-28 1:23
我的算法模型在“菜籽油合约”运行很平稳,但改在“沪铝合约“运行时开仓阶段平稳,但在有持仓,没有平仓挂单时发出平仓委托却失败,模型日志提示失败原因是:可平仓数量不足,模型如下:
VAR Modname;
VAR CodeName;//定义合约名称
VAR Nprice,Oprice,Cprice,Vvol,Yln,Rfmtr,Rfmv,SPprice;//定义最新价
GLOBAL_VAR BuyOpi,Yxsj,MinPrice,Wtprice,BKID,SPID,SUMBK,SUMSP,gd,jyzt;
VOID MAIN()
{
Modname = "OIBGPN";//指定模组
CodeName = Modname.F_DealCode();//获取模组交易合约
Nprice = Price(CodeName,"New");//定义最新价为当前模型所加载合约的最新价
Oprice = #Get(Modname,"OO",0);//获取短周期开盘价
Cprice = #Get(Modname,"CC",0);//获取短周期前1K线收盘价
Vvol = #Get(Modname,"VV",0);//获取短周期当前K线成交量
Yln = #Get(Modname,"YLN",0);//获取短周期前1K线涨跌
Rfmtr = #Get(Modname,"RFMTR",0);//获取短周期前1K线3周期平均波幅
Rfmv = #Get(Modname,"RFMV",0);//获取短周期前1K线10周期平均成交量
Yxsj = #Get(Modname,"YXSJ",0);//获取短周期当前模型所加载合约有效交易时间区间1:开平仓时间,2:清仓时间
MinPrice = MinPrice(CodeName);//定义交易合约最小变动价位
jyzt = T_IsExchangeOpen(CodeName); //交易所是否开盘(0,闭市;1,开盘)
MessageOut("交易所状态(0,闭市;1,开盘)="+jyzt);
IF(jyzt == 1)
{
IF(Yxsj == 1)//交易时间区间
{
IF(AL_BuyPosition(CodeName) == 0 && T_IsNoOrder() == 1 && Yln >= 0 && Yln <= 3 && Nprice >= Cprice - MinPrice && Nprice <= Cprice + MinPrice && SUMBK == 0)//买入
{
BKID = T_Deal(CodeName,0,0,1,Cprice);
Wtprice = Cprice;
MessageOut("买成交价="+ Wtprice);
SUMBK = 1;
SUMSP = 0;
}
MessageOut("买开仓(0,无;1,有)="+ SUMBK);
MessageOut("卖平仓(0,无;1,有)="+ SUMSP);
BuyOpi = AL_BuyPosition(CodeName);
MessageOut("买持仓(0,无;1,有)="+ BuyOpi);
gd = T_IsNoOrder();
MessageOut("挂单(1,无挂单;0,有挂单)="+ gd);
MessageOut("Rfmtr)="+ Rfmtr);
IF( Nprice >= Wtprice + Rfmtr*3 && SUMBK != 0 && BuyOpi == 0 && SUMSP == 0 && gd == 0)//有未成交买单,价格比买价上涨三倍3周期波幅,撤单
{
SUMBK = T_DeleteOrderByCode( CodeName , 1 );//撤该模型所有挂单
}
IF(BuyOpi >= 1 && gd == 1 && SUMSP == 0)//平多仓
{
SPprice = T_BuyAvgPrice(CodeName)+MinPrice;
MessageOut("卖平仓价="+SPprice);
SPID= T_Deal(CodeName,1,1,BuyOpi,SPprice);
SUMBK = 0;
SUMSP = 1;
}
IF( Nprice <= T_BuyAvgPrice(CodeName) - Rfmtr*4 && SUMBK == 0 && SUMSP == 1 && BuyOpi >= 1 && gd == 0)//持多仓,平仓挂单未成交,价格比持仓价下跌超过三倍3周期波幅,撤单并对价斩仓
{
T_DeleteOrderAll() ;//撤该模型所有挂单
SPID= T_Deal1(CodeName,1,1,BuyOpi,LIMIT_ORDER);
gd = 1;
}
IF(T_OrderState(SPID) == 1 && BuyOpi == 0 ) //完成一次交易初始化
{
SUMSP = 0;
}
}
IF(Yxsj == 2)//清盘时间区间
{
IF(BuyOpi >= 1)//有持仓就清仓
{
IF( gd == 0 )//有挂单,撤单清仓
{
T_DeleteOrderAll();//撤该模型所有挂单
T_Deal1(CodeName,1,1,BuyOpi,LIMIT_ORDER);//清仓
gd = 1;
}
IF( BuyOpi >= 1 && gd == 1 )
{
T_CloseAllOpi(0,1);//清仓
BuyOpi = 0;
}
}
IF(BuyOpi == 0 && gd == 0)//无持仓有挂单就撤单
{
T_DeleteOrderAll();//撤该模型所有挂单
gd = 1;
}
}
}
投资者咨询:算法交易有持仓平仓委托失败 (文华财经WH8赢智V8.2)
来源:文华财经 日期:2018-7-28 1:23
技术人员回复
日期:2018-7-30 16:17
分析了一下,这里与您的编写有关
首先 BuyOpi = AL_BuyRemainPosition(CodeName);应该取多头可用持仓
此外,可平仓数量不足说明当前有卖平挂单
因为gd = T_IsNoOrder();判断是否有挂单需要特殊处理,否则存在在卖平委托的委托回报未返回时,gd先判断了没有挂单返回1
导致截图中卖平 SUMSP 实际返回1已经执行,但是gd返回1的情况
这里需要整体修改编写框架来优化,改写起来是比较复杂的
如果您想要范例,请您把完整思路说下,我们找专门的开发工程师,给您直接编制一下
投资者咨询:算法交易有持仓平仓委托失败 (文华财经WH8赢智V8.2)
来源:文华财经 日期:2018-7-28 1:23
谢谢老师,我的交易思路是:
请老师帮忙编制一下,谢谢!!!
技术人员回复
日期:2018-8-2 8:37
算法需求较多,编写需要排队,预计3-4周左右的时间
编写好后在这里给您回复
投资者咨询:算法交易有持仓平仓委托失败 (文华财经WH8赢智V8.2)
来源:文华财经 日期:2018-7-28 1:23
谢谢
技术人员回复
日期:2018-8-15 17:22