MQ算法交易问题 (文华财经wh9)

投资者咨询:MQ算法交易问题 (文华财经wh9)
来源:文华财经  日期:2018-8-20 12:10
 我写了个调用账户最近成交的记录之后加1个价位挂平仓单的算法模型,同时在两个合约执行的时候,总是运行第二个的时候第一个就停掉,想请教下大概是怎么回事。是不是调用账户成交的代码只能同时在一个算法里面运行。
技术人员回复
日期:2018-8-20 13:11
应该和您源码编写有关

您提供下模型,以及测试的步骤,我们对应帮您分析下
投资者咨询:MQ算法交易问题 (文华财经wh9)
来源:文华财经  日期:2018-8-20 12:10
 


//----------------------------------------------------------------------------------------------------------
Data 
    data1:"b1901";
Vars
    Global_Numeric X;                                   //状态值
    Global_Numeric V;                      //单笔委托数量
    Global_Numeric MINB;              //多单最低委托价
    Global_Numeric YBRP; //昨日多头持仓
    Global_Numeric TBRP; //今日多头持仓
    Global_Numeric BC;                               //买报单量
    Global_Numeric SC;                               //卖报单量、或持仓价位数量
    Global_Numeric DIFB;    //买单间距
    Global_Numeric DIFF;                        //买卖价差
     Global_Numeric YPR;                         //昨日最低持仓成本
     Global_String COD;                            //手动下单的合约

     Numeric BRP;         //可用持仓,剔除底仓
     Numeric BPR;           //买方向委托价格
     Numeric SPR;         //卖方向委托价格
     Numeric PR;        //成交价格
     Numeric VL;         //成交数量
     Numeric BO;                                 //成交为买单
     Numeric SO;                                //成交为卖单
     Numeric i;
     Numeric FixPsn;                     //底仓
     Numeric  YPsn;                 //昨日持委托单量
     Numeric  TPsn;                //今日持委托单量
     String    Contract;                      //成交合约
     
Begin

//------------------------------数据初始化------------------------------
       V = 3;                                                                            //单笔委托量
       BC = 5;                                                                         //多单挂单数量
       DIFB = data1.Price("MinPrice")*2;                   //买单间距为   个价位
       DIFF = data1.Price("MinPrice")*4;                    //买卖价差为   个价位
       FixPsn = 0;                                                                 //底仓为0
 

        If(data1.A_IsExchangeOpen()==1&&X == 0)
{
      Commentary("【程序初始化!---请按F12用算法下单!!】");
     // YPR = 3650;                                                           //手动改成昨日最低买单价

         if(M_GetTradeVol > 0 &&  M_GetTradeContract== "b1901")
     {    
       YPR = M_GetTradeOrderPrice+DIFB;                //昨日最低买单价
       X = 1;
       Commentary("【X= 1!手动挂首单完成-----进入开盘委托状态!!】");
    }
}

//------------------------------取委托状态------------------------------
  BO = T_GetFrontMatchBuyOrSell(A_AccountID) == Enum_Buy;
      SO = T_GetFrontMatchBuyOrSell(A_AccountID) == Enum_Sell;
      PR =  T_GetFrontMatchRspPrice(A_AccountID);
      VL = T_GetFrontMatchRspVol(A_AccountID);
      Contract = T_GetFrontMatchRspContract(A_AccountID);
//         Commentary("【"+Contract+ "成交】");   


//----------------------      ---------------开盘初次委托单--------------------------------------
    If(data1.A_IsExchangeOpen()==1&&X == 1)
{
        YBRP = data1.A_BuyRemainPosition();
        BRP=YBRP  - FixPsn;              //多头可用持仓减去底仓    
        MINB = YPR-BC*DIFB;
        For i = 1 to BC
          {
                  BPR = YPR-i*DIFB;
                 data1.A_SendOrder(Enum_Buy,Enum_Entry,V,BPR);
           }
           if(BRP > 0)
        {
              Commentary("【 b1901可用多单为"+text(BRP)+"手】");   
                if(BRP/V > IntPart(BRP/V))
             {
                   SC = IntPart(BRP/V)+1;
                   Commentary("【委托卖平" + Text(SC) + "个卖单!】");
                      SPR = YPR + DIFF;
                  data1.A_SendOrder(Enum_buy,Enum_Entry,SC*V-BRP,YPR);
                  data1.A_SendOrder(Enum_Sell,Enum_Exit,BRP-(SC-1)*V,SPR);
                       For i = 2 to SC
                 {
                      SPR = YPR+(i-1)*DIFB+DIFF;
                      data1.A_SendOrder(Enum_Sell,Enum_Exit,V,SPR);
                  }
             }
               else
             {
                    SC = IntPart(BRP/V);
                  Commentary("【委托卖平" + Text(SC) + "个!】");
                       For i = 1 to SC
                 {
                      SPR = YPR+(i-1)*DIFB+DIFF;
                      data1.A_SendOrder(Enum_Sell,Enum_Exit,V,SPR);
                  }
             }
         }
     X=2;
     Commentary("【X = 2!开盘挂单完成------进入持续报价状态!!】");
}
//---------------------------------- -- --------持续报价--------------------------------------------

     if(data1.A_IsExchangeOpen()==1&&X ==2&&Contract == "b1901")
 {         
//买单成交后挂新单
    if( BO== 1)
     {
//       Commentary("【" + Text(PR) + "买开" + Text(VL) + "手!】");
        SPR=PR+DIFF;
        Commentary("【委托------" + Text(SPR) + "卖平" + Text(VL) + "手!】");
        data1.A_SendOrder(Enum_Sell,Enum_Exit,VL,SPR);
                   if(PR <=MINB+DIFB)                       //挂卖单
            {
               Commentary("【委托单不足------补挂委托单!!!】");
                    X = 3;
             }
                T_PopMatchRsp(A_AccountID);
      }
//卖单成交后挂新单
     else if( SO== 1)
    {                  
//            Commentary("【" + Text(PR) + "卖平" + Text(VL) + "手!】");
            BPR=PR-DIFF;
            Commentary("【委托------"+ Text(BPR) + "买开" + Text(VL) + "手!】");
            data1.A_SendOrder(Enum_Buy,Enum_Entry,VL,BPR);
            T_PopMatchRsp(A_AccountID);
     }
 }
//----------------------------------------补挂单--------------------------------------------
    If(data1.A_IsExchangeOpen()==1&&X==3)
{
        Commentary("【增挂委托单!!!】");
        For i = 1 to BC
          {
                  BPR = MINB-i*DIFB;
                 data1.A_SendOrder(Enum_Buy,Enum_Entry,V,BPR);
           }
         X = 2;
      Commentary("【X = 2!补挂完成-----回到持续报价状态!!】");
           MINB =MINB-BC*DIFB;
}
//----------------------------------收盘记录最低买价、持仓------------------------------
    If(data1.A_IsExchangeOpen()==0&& X > 1 &&CurrentTime> 0.150000&&CurrentTime<0.210000)
{
     TBRP = data1.A_BuyPosition();               
           IF(YBRP/V > IntPart(YBRP/V))
           {
                  YPsn = IntPart(YBRP/V)+1;
           }
           else 
{
                YPsn = IntPart(YBRP/V);
}
           IF(TBRP/V > IntPart(TBRP/V))
           {
                  TPsn = IntPart(TBRP/V)+1;
           }
           else 
{
                 TPsn = IntPart(TBRP/V);
}
      YPR = YPR - (TPsn - YPsn) *DIFB;        //收盘后计算新的多单最低成本
      X = 1;
      Commentary("【X = 1!收盘------纪录多单最低成本完成!!】");
}
End
  


技术人员回复
日期:2018-8-20 15:28
 核实一下您的操作步骤,之后我们根据您的步骤加载测试下,之后在根据现象修改源码:


同时在两个合约执行的时候

 ――指的是有b1901的持仓,您楼上的模型加载两次吗?

――还是模型设置两个不同的合约,同时运行的时候,前一个合约停止运行呢?

――您本地合约持仓有多少手呢?是模型全部调用平仓吗?
 
投资者咨询:MQ算法交易问题 (文华财经wh9)
来源:文华财经  日期:2018-8-20 12:10
是第二种情况,我把模型中的b1901改成了其他合约,然后同时运行出现了这种情况。我本地没有持仓。
技术人员回复
日期:2018-8-20 15:50
 目前已经收盘,我们明日测试后在给您回复

如果出现楼上的现象,我们在根据现象给您修改模型

后续有进一步进展会跟帖给您回复的,请耐心等待下
投资者咨询:MQ算法交易问题 (文华财经wh9)
来源:文华财经  日期:2018-8-20 12:10
不用测算了,是因为成交历史对两个算法都是独立排序的,就会导致相互堵塞成交回复卡在合约那里。