算法交易有持仓平仓委托失败 (文华财经WH8赢智V8.2)

投资者咨询:算法交易有持仓平仓委托失败 (文华财经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
 但在收盘前,模型按照收盘前清仓语句T_CloseAllOpi(0,1);将持仓平掉了,日志如下:


图片点击可在新窗口打开查看

技术人员回复
日期: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
 谢谢老师,我的交易思路是:
1、当1分钟趋势模型前K线收阴线时以前收盘价买入;
2、买单成交后比买价多一个点卖出平仓;
2、当买单未成交行情上涨了10个点,则取消挂单,等待下一次进场机会;
3、当持有多单时,行情比买价下跌了10个点,则取消卖出平仓单,并将现有持仓清仓;

请老师帮忙编制一下,谢谢!!!
技术人员回复
日期:2018-8-2 8:37

算法需求较多,编写需要排队,预计3-4周左右的时间

 

编写好后在这里给您回复

投资者咨询:算法交易有持仓平仓委托失败 (文华财经WH8赢智V8.2)
来源:文华财经  日期:2018-7-28 1:23
 谢谢
技术人员回复
日期:2018-8-15 17:22

 算法模型编写参考:

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看文件名:201808132018081309314405674.zip