手动交易+算法交易案例一:手动下单调用算法交易

前言

随着资金规模的增大,传统的手动委托方式,委托速度慢、误操作多、成交滑点大、止损不及时的劣势会越来越明显。

算法交易通过对期货账号交易信息的获取,实现了替代手动控制交易过程的功能。通过对持仓信息、挂单信息,成交回报,委托回报等信息的监控,实现了对交易过程的精细化控制,再配合算法交易委托速度快,对市场变化反应迅速等特点,可进一步减少成交滑点,降低交易风险。

算法交易也支持同时对多个交易账号进行委托控制,解决了手动交易无法同时管理多个账号批量委托的问题。

优势

  • 人机结合,提高成交效率,降低成交滑点。
  • 可实现智能分批,追价,自动锁仓等复杂策略。
  • 支持多账号下单,自动管理多个账号批量委托。

对于大资金客户,是否有下单单量大,唯恐惊扰行情趋势的困扰?是否有欲拉动行情却缕缕付出了大量成本的困扰?这里我们以此为例通过手动下单调用算法交易的方式介绍两个案例来解决你的困扰。

 

策略1:通过算法根据买卖量,自动拆分大单

 

交易思路解析:

1、取得手动下单的合约、手数、买卖方向、开平方向;自设委托价格。

2、如果为开仓:

(1)如果为买入开仓:

分批买入,取盘口卖一量*1/2与剩余下单手数比较,取数量较小值根据盘口卖一价买入,第一批成交后,再委托第二批,直至完全成交后退出算法。

(2)如果为卖出开仓:

分批卖出,取盘口买一量*1/2与剩余下单手数比较,取数量较小值根据盘口买一价卖出,第一批成交后,再委托第二批,直至完全成交后退出算法。

3、如果为平仓:

(1)如果为买入平仓:

同买入开仓。

如果合约为上海持仓,平仓时判断今仓,优先平今。

(2)如果为卖出平仓:

同卖出开仓。

如果合约为上海持仓,平仓时判断今仓,优先平今。

 

源码实现:

Vars 
    Global_String TAC; //账号 
    Global_String COD; //合约编码 
    Global_Numeric TBS;	//买卖方向 
    Global_Numeric TEE; //开平方向 
    Global_Numeric TVL; //交易手数 
    Global_Numeric P; //数值比例 
    Global_Numeric NEWP; //最新价 
    Global_Numeric RLP; //涨停价 
    Global_Numeric FLP; //跌停价 
    Global_Numeric BIDP; //买一价 
    Global_Numeric ASKP; //卖一价 
    Global_Numeric BIDV; //买一量 
    Global_Numeric ASKV; //卖一量 
    Global_Numeric SH; //上海合约标志 
    Global_Numeric MINP; //最小变动价位 
    Global_Numeric BRP; //多头可用持仓 
    Global_Numeric SRP; //空头可用持仓 
    Global_Numeric BRP0; //多头今仓可用持仓 
    Global_Numeric SRP0; //空头今仓可用持仓 
    Global_Numeric BRP1; //多头老仓可用持仓 
    Global_Numeric SRP1; //空头老仓可用持仓 
    Global_Numeric BKID; //买开委托 
    Global_Numeric SKID; //卖开委托 
    Global_Numeric BPID0; //买平今仓委托 
    Global_Numeric BPID1; //买平老仓委托 
    Global_Numeric BPID; //买平委托 
    Global_Numeric SPID0; //卖平今仓委托 
    Global_Numeric SPID1; //卖平老仓委托 
    Global_Numeric SPID; //卖平委托 
    Global_Numeric BKFLG; //买开标志 
    Global_Numeric SKFLG; //卖开标志 
    Global_Numeric BPFLG0; //买平今仓标志 
    Global_Numeric BPFLG1; //买平老仓标志 
    Global_Numeric BPFLG; //买平标志 
    Global_Numeric SPFLG0; //卖平今仓标志 
    Global_Numeric SPFLG1; //卖平老仓标志 
    Global_Numeric SPFLG; //卖平标志 
    Global_Numeric BKM; //买开委托手数 
    Global_Numeric SKM; //卖开委托手数 
    Global_Numeric BPM0; //买平今仓委托手数 
    Global_Numeric BPM1; //买平老仓委托手数 
    Global_Numeric BPM; //买平委托手数 
    Global_Numeric SPM0; //卖平今仓委托手数 
    Global_Numeric SPM1; //卖平老仓委托手数 
    Global_Numeric SPM; //卖平委托手数 
    Global_Numeric BPR; //买方向委托价格 
    Global_Numeric SPR; //卖方向委托价格 
    Global_Numeric KPFLG; //委托处理标志 
Begin 
    //------------------------------------委托获取------------------------------------// 
    If(KPFLG == 0) //如果未开启委托处理 
    { 
       TAC = M_GetTradeAccount(0); //账号 
       COD = M_GetTradeContract(); //合约编码 
       TBS = M_GetTradeBuySell(); //买卖方向 
       TEE = M_GetTradeEntryExit(); //开平方向 
       TVL = M_GetTradeVol(); //交易手数 
       If(TVL > 0 && COD.A_IsExchangeOpen() == 1) //如果交易手数大于0,且当前状态是开盘 
       { 
          If(TBS == Enum_Buy && TEE == Enum_Entry) //如果是买开方向 
          { 
             Commentary("【" + COD + "做多:手动买开" + Text(TVL) + "手!】"); 
             KPFLG = 1; //开启买开委托处理 
          } 
          Else If(TBS == Enum_Sell && TEE == Enum_Entry) //如果是卖开方向 
          { 
             Commentary("【" + COD + "做空:手动卖开" + Text(TVL) + "手!】"); 
             KPFLG = 2; //开启卖开委托处理 
          } 
          Else If(TBS == Enum_Buy && TEE == Enum_Exit) //如果是买平方向 
          { 
             Commentary("【" + COD + "平空:手动买平" + Text(TVL) + "手!】"); 
             KPFLG = 3; //开启买平委托处理 
          } 
          Else If(TBS == Enum_Buy && TEE == Enum_ExitToday) //如果是买平今方向 
          { 
             Commentary("【" + COD + "平今空:手动买平" + Text(TVL) + "手!】"); 
             KPFLG = 4; //开启买平今仓委托处理 
          } 
          Else If(TBS == Enum_Sell && TEE == Enum_Exit) //如果是卖平方向 
          { 
             Commentary("【" + COD + "平多:手动卖平" + Text(TVL) + "手!】"); 
             KPFLG = 5; //开启卖平委托处理 
          } 
          Else If(TBS == Enum_Sell && TEE == Enum_ExitToday) //如果是卖平今方向 
          { 
             Commentary("【" + COD + "平今多:手动卖平" + Text(TVL) + "手!】"); 
             KPFLG = 6; //开启卖平今仓委托处理 
          } 
          P = 0.5; //数值比例 
          SH = COD.A_IsSHCode(); //上海合约标志 
          MINP = COD.Price("MinPrice"); //最小变动价位 
          
       } 
    } 
    //------------------------------------委托处理------------------------------------//

   If(KPFLG > 0 && COD.A_IsExchangeOpen() == 1) //如果已开启委托处理,且当前状态是开盘 
    { 
       BIDP = COD.Price("Bid1"); //买一价 
       ASKP = COD.Price("Ask1"); //卖一价 
       BIDV = COD.Price("BidVol1"); //买一量 
       ASKV = COD.Price("AskVol1"); //卖一量 
       BPR= ASKP; //买方向委托价格设为卖一价 
       SPR = BIDP; //卖方向委托价格设为买一价 
       BRP = COD.A_BuyRemainPosition(); //多头可用持仓 
       SRP = COD.A_SellRemainPosition(); //空头可用持仓 
       If(SH == 1) //如果当前合约是上海市场合约 
       { 
          BRP0 = COD.A_TodayBuyRemainPosition(); //多头今仓可用持仓 
          SRP0 = COD.A_TodaySellRemainPosition(); //空头今仓可用持仓 
          BRP1 = BRP - BRP0; //多头老仓可用持仓 
          SRP1 = SRP - SRP0; //空头老仓可用持仓 
       } 
       //------------------------------------成交判断------------------------------------// 
       If(BKFLG == 1) //如果有买开委托 
       { 
          If(F_OrderStatus(BKID) == Enum_Filled) //如果买开委托成交 
          { 
             Commentary("【" + COD + "做多:买开委托成交!】"); 
             TVL = TVL - BKM; //交易手数自减买开委托手数 
             BKFLG = 0; //买开标志归0 
          } 
       } 
       If(SKFLG == 1) //如果有卖开委托 
       { 
          If(F_OrderStatus(SKID) == Enum_Filled) //如果卖开委托成交 
          { 
             Commentary("【" + COD + "做空:卖开委托成交!】"); 
             TVL = TVL - SKM; //交易手数自减卖开委托手数 
             SKFLG = 0; //卖开标志归0 
          } 
       } 
       If(BPFLG0 == 1) //如果有买平今仓委托 
       { 
          If(F_OrderStatus(BPID0) == Enum_Filled) //如果买平今仓委托成交 
          { 
             Commentary("【" + COD + "平空:买平今仓委托成交!】"); 
             TVL = TVL - BPM0; //交易手数自减买平今仓委托手数 
             BPFLG0 = 0; //买平今仓标志归0 
          } 
       } 
       If(BPFLG1 == 1) //如果有买平老仓委托 
       { 
          If(F_OrderStatus(BPID1) == Enum_Filled) //如果买平老仓委托成交 
          { 
             Commentary("【" + COD + "平空:买平老仓委托成交!】"); 
             TVL = TVL - BPM1; //交易手数自减买平老仓委托手数 
             BPFLG1 = 0; //买平老仓标志归0 
          } 
       } 
       If(BPFLG == 1) //如果有买平委托 
       { 
          If(F_OrderStatus(BPID) == Enum_Filled) //如果买平委托成交 
          { 
             Commentary("【" + COD + "平空:买平委托成交!】"); 
             TVL = TVL - BPM; //交易手数自减买平委托手数 
             BPFLG = 0; //买平标志归0 
          } 
       } 
       If(SPFLG0 == 1) //如果有卖平今仓委托 
       { 
          If(F_OrderStatus(SPID0) == Enum_Filled) //如果卖平今仓委托成交 
          { 
             Commentary("【" + COD + "平多:卖平今仓委托成交!】"); 
             TVL = TVL - SPM0; //交易手数自减卖平今仓委托手数 
             SPFLG0 = 0; //卖平今仓标志归0 
          } 
       } 
       If(SPFLG1 == 1) //如果有卖平老仓委托 
       { 
          If(F_OrderStatus(SPID1) == Enum_Filled) //如果卖平老仓委托成交 
          { 
             Commentary("【" + COD + "平多:卖平老仓委托成交!】"); 
             TVL = TVL - SPM1; //交易手数自减卖平老仓委托手数 
             SPFLG1 = 0; //卖平老仓标志归0 
          } 
       } 
       If(SPFLG == 1) //如果有卖平委托 
       { 
          If(F_OrderStatus(SPID) == Enum_Filled) //如果卖平委托成交 
          { 
             Commentary("【" + COD + "平多:卖平委托成交!】"); 
             TVL = TVL - SPM; //交易手数自减卖平委托手数 
             SPFLG = 0; //卖平标志归0 
          } 
       } 
       //------------------------------------委托处理------------------------------------// 
       If(KPFLG == 1) //如果已开启买开委托处理 
       { 
          If(BKFLG == 0) //如果没有买开委托 
          { 
             BKM = Min(Ceiling(P * ASKV,1),TVL); //买开委托手数 
             If(BKM > 0) //如果买开委托手数大于0 
             { 
                Commentary("【" + COD + "做多:公式买开" + Text(BKM) + "手!】"); 
                Commentary("【" + COD + "做多:买开委托发出!】"); 
                BKID = COD.A_SendOrder(Enum_Buy,Enum_Entry,BKM,BPR,TAC); //以买开委托价格发出买开委托手数的买开委托 
                BKFLG = 1; //已发出买开委托 
             } 
             Else If(BKM == 0) //如果买开委托手数等于0 
             { 
                Commentary("【" + COD + "做多:买开委托完成!】"); 
                Exit(); //退出公式 
             } 
          } 
       } 
       Else If(KPFLG == 2) //如果已开启卖开委托处理 
       { 
          If(SKFLG == 0) //如果没有卖开委托 
          { 
             SKM = Min(Ceiling(P * BIDV,1),TVL); //卖开委托手数 
             If(SKM > 0) //如果卖开委托手数大于0 
             { 
                Commentary("【" + COD + "做空:公式卖开" + Text(SKM) + "手!】"); 
                Commentary("【" + COD + "做空:卖开委托发出!】"); 
                SKID = COD.A_SendOrder(Enum_Sell,Enum_Entry,SKM,SPR,TAC); //以卖开委托价格发出卖开委托手数的卖开委托 
                SKFLG = 1; //已发出卖开委托 
             } 
             Else If(SKM == 0) //如果卖开委托手数等于0 
             { 
                Commentary("【" + COD + "做空:卖开委托完成!】"); 
                Exit(); //退出公式 
             } 
          } 
       }

      Else If(KPFLG == 3 || KPFLG == 4) //如果已开启买平委托处理 
       { 
          If(BPFLG0 == 0 && BPFLG1 == 0 && BPFLG == 0) //如果没有买平委托 
          { 
             BPM = Min(Ceiling(P * ASKV,1),TVL); //买平委托手数 
             If(BPM > 0) //如果买平委托手数大于0 
             { 
                If(SRP > 0) //如果有空头可用持仓 
                { 
                   If(SH == 1) //如果当前合约是上海市场合约 
                   { 
                      If(SRP0 > 0) //如果有空头今仓可用持仓 
                      { 
                         BPM0 = Min(SRP0,BPM); //买平今仓委托手数 
                         BPM1 = Min(SRP1,BPM - BPM0); //买平老仓委托手数 
                         Commentary("【" + COD + "平空:公式买平今仓" + Text(BPM0) + "手!】"); 
                         Commentary("【" + COD + "平空:买平今仓委托发出!】"); 
                         BPID0 = COD.A_SendOrder(Enum_Buy,Enum_ExitToday,BPM0,BPR,TAC); //以买平委托价格发出买平今仓委托手数的买平今仓委托 
                         BPFLG0 = 1; //已发出买平今仓委托 
                      } 
                      Else If(SRP0 == 0) //如果没有空头今仓可用持仓 
                      { 
                         BPM1 = Min(SRP1,BPM); //买平老仓委托手数 
                      } 
                      If(KPFLG == 3 && SRP1 > 0 && BPM1 > 0) //如果未开启买平今仓委托处理,且有空头老仓可用持仓,且买平老仓委托手数大于0 
                      { 
                         Commentary("【" + COD + "平空:公式买平老仓" + Text(BPM1) + "手!】"); 
                         Commentary("【" + COD + "平空:买平老仓委托发出!】"); 
                         BPID1 = COD.A_SendOrder(Enum_Buy,Enum_Exit,BPM1,BPR,TAC); //以买平委托价格发出买平老仓委托手数的买平老仓委托 
                         BPFLG1 = 1; //已发出买平老仓委托 
                      } 
                   } 
                   Else //如果当前合约非上海市场合约 
                   { 
                      BPM = Min(SRP,BPM); //买平委托手数 
                      Commentary("【" + COD + "平空:公式买平" + Text(BPM) + "手!】"); 
                      Commentary("【" + COD + "平空:买平委托发出!】"); 
                      BPID = COD.A_SendOrder(Enum_Buy,Enum_Exit,BPM,BPR,TAC); //以买平委托价格发出买平委托手数的买平委托 
                      BPFLG = 1; //已发出买平委托 
                   } 
                } 
                Else If(SRP == 0) //如果没有空头可用持仓 
                { 
                   Commentary("【" + COD + "平空:买平委托完成!】"); 
                   Exit(); //退出公式 
                } 
             } 
             Else If(BPM == 0) //如果买平委托手数等于0 
             { 
                Commentary("【" + COD + "平空:买平委托完成!】"); 
                Exit(); //退出公式 
             } 
          } 
       }

      Else If(KPFLG == 5 || KPFLG == 6) //如果已开启卖平委托处理 
       { 
          If(SPFLG0 == 0 && SPFLG1 == 0 && SPFLG == 0) //如果没有卖平委托 
          { 
             SPM = Min(Ceiling(P * BIDV,1),TVL); //卖平委托手数 
             If(SPM > 0) //如果卖平委托手数大于0 
             { 
                If(BRP > 0) //如果有多头可用持仓 
                { 
                   If(SH == 1) //如果当前合约是上海市场合约 
                   { 
                      If(BRP0 > 0) //如果有多头今仓可用持仓 
                      { 
                         SPM0 = Min(BRP0,SPM); //卖平今仓委托手数 
                         SPM1 = Min(BRP1,SPM - SPM0); //卖平老仓委托手数 
                         Commentary("【" + COD + "平多:公式卖平今仓" + Text(SPM0) + "手!】"); 
                         Commentary("【" + COD + "平多:卖平今仓委托发出!】"); 
                         SPID0 = COD.A_SendOrder(Enum_Sell,Enum_ExitToday,SPM0,SPR,TAC); //以卖平委托价格发出卖平今仓委托手数的卖平今仓委托 
                         SPFLG0 = 1; //已发出卖平今仓委托 
                      } 
                      Else If(BRP0 == 0) //如果没有多头今仓可用持仓 
                      { 
                         SPM1 = Min(BRP1,SPM); //卖平老仓委托手数 
                      } 
                      If(KPFLG == 5 && BRP1 > 0 && SPM1 > 0) //如果未开启卖平今仓委托处理,且有多头老仓可用持仓,且卖平老仓委托手数大于0 
                      { 
                         Commentary("【" + COD + "平多:公式卖平老仓" + Text(SPM1) + "手!】"); 
                         Commentary("【" + COD + "平多:卖平老仓委托发出!】"); 
                         SPID1 = COD.A_SendOrder(Enum_Sell,Enum_Exit,SPM1,SPR,TAC); //以卖平委托价格发出卖平老仓委托手数的卖平老仓委托 
                         SPFLG1 = 1; //已发出卖平老仓委托 
                      } 
                   } 
                   Else //如果当前合约非上海市场合约 
                   { 
                      SPM = Min(BRP,SPM); //卖平委托手数 
                      Commentary("【" + COD + "平多:公式卖平" + Text(SPM) + "手!】"); 
                      Commentary("【" + COD + "平多:卖平委托发出!】"); 
                      SPID = COD.A_SendOrder(Enum_Sell,Enum_Exit,SPM,SPR,TAC); //以卖平委托价格发出卖平委托手数的卖平委托 
                      SPFLG = 1; //已发出卖平委托 
                   } 
                } 
                Else If(BRP == 0) //如果没有多头可用持仓 
                { 
                   Commentary("【" + COD + "平多:卖平委托完成!】"); 
                   Exit(); //退出公式 
                } 
             } 
             Else If(SPM == 0) //如果卖平委托手数等于0 
             { 
                Commentary("【" + COD + "平多:卖平委托完成!】"); 
                Exit(); //退出公式 
             } 
          } 
       } 
    } 
End

通过右上方菜单【运行】->【算法交易运行池】->【算法交易下单】,调出算法交易下单界面,按下图所示方法实现手动下单调用算法交易:

手动交易+算法交易案例一:手动下单调用算法交易

注:①如果再次下单,会再次加载该模型,不会直接在前一个算法交易模型中继续执行。

②如果模型中含有函数Exit(),则模型执行完毕后会自动退出。

 

策略2:拉动行情,每次自动把买盘吃光,将行情往上拉,反之亦然。

 

交易思路解析:

1、取值手动下单的合约、手数、买卖方向、开平方向;自设委托价格。

2、如果为开仓:

(1)如果为买入开仓:

分批买入,取盘口卖一量与剩余下单手数比较,取数量较小值根据盘口卖一价买入。

如果盘口卖一价变化,撤单并重新委托,取盘口卖一量与该批剩余下单手数比较,取数量较小值根据盘口卖一价买入,直至完全成交完全成交后退出算法。

(2)如果为卖出开仓:

分批卖出,取盘口买一量与剩余下单手数比较,取数量较小值根据盘口买一价卖出。

如果盘口买一价变化,撤单并重新委托,取盘口买一量与该批剩余下单手数比较,取数量较小值根据盘口买一价卖出,直至完全成交完全成交后退出算法。

3、如果为平仓:

(1)如果为买入平仓:

同买入开仓。

如果合约为上海持仓,平仓时判断今仓,优先平今。

(2)如果为卖出开仓:

同卖出开仓。

如果合约为上海持仓,平仓时判断今仓,优先平今。

 

源码实现:

Vars 
    Global_String TAC; //账号 
    Global_String COD; //合约编码 
    Global_Numeric TBS; //买卖方向 
    Global_Numeric TEE; //开平方向 
    Global_Numeric TVL; //交易手数 
    Global_Numeric BIDP; //买一价 
    Global_Numeric ASKP;	//卖一价 
    Global_Numeric BIDV; //买一量 
    Global_Numeric ASKV; //卖一量 
    Global_Numeric SH; //上海合约标志 
    Global_Numeric MINP; //最小变动价位 
    Global_Numeric BRP; //多头可用持仓 
    Global_Numeric SRP; //空头可用持仓 
    Global_Numeric BRP0; //多头今仓可用持仓 
    Global_Numeric SRP0; //空头今仓可用持仓 
    Global_Numeric BRP1; //多头老仓可用持仓 
    Global_Numeric SRP1; //空头老仓可用持仓 
    Global_Numeric BKID; //买开委托 
    Global_Numeric SKID; //卖开委托 
    Global_Numeric BPID0; //买平今仓委托 
    Global_Numeric BPID1; //买平老仓委托 
    Global_Numeric BPID; //买平委托 
    Global_Numeric SPID0; //卖平今仓委托 
    Global_Numeric SPID1; //卖平老仓委托 
    Global_Numeric SPID; //卖平委托 
    Global_Numeric BKFLG; //买开标志 
    Global_Numeric SKFLG; //卖开标志 
    Global_Numeric BPFLG0; //买平今仓标志 
    Global_Numeric BPFLG1; //买平老仓标志 
    Global_Numeric BPFLG; //买平标志 
    Global_Numeric SPFLG0; //卖平今仓标志 
    Global_Numeric SPFLG1; //卖平老仓标志 
    Global_Numeric SPFLG; //卖平标志 
    Global_Numeric BKDEL; //买开撤单标志 
    Global_Numeric SKDEL; //卖开撤单标志 
    Global_Numeric BPDEL0; //买平今仓撤单标志 
    Global_Numeric BPDEL1; //买平老仓撤单标志 
    Global_Numeric BPDEL; //买平撤单标志 
    Global_Numeric SPDEL0; //卖平今仓撤单标志 
    Global_Numeric SPDEL1; //卖平老仓撤单标志 
    Global_Numeric SPDEL; //卖平撤单标志 
    Global_Numeric BKM; //买开委托手数 
    Global_Numeric SKM; //卖开委托手数 
    Global_Numeric BPM0; //买平今仓委托手数 
    Global_Numeric BPM1; //买平老仓委托手数 
    Global_Numeric BPM; //买平委托手数 
    Global_Numeric SPM0; //卖平今仓委托手数 
    Global_Numeric SPM1; //卖平老仓委托手数 
    Global_Numeric SPM; //卖平委托手数 
    Global_Numeric BKP; //买开委托价格 
    Global_Numeric SKP; //卖开委托价格 
    Global_Numeric BPP0; //买平今仓委托价格 
    Global_Numeric BPP1; //买平老仓委托价格 
    Global_Numeric BPP; //买平委托价格 
    Global_Numeric SPP0; //卖平今仓委托价格 
    Global_Numeric SPP1; //卖平老仓委托价格 
    Global_Numeric SPP; //卖平委托价格 
    Global_Numeric KPFLG; //委托处理标志 
Begin 
    //------------------------------------委托获取------------------------------------// 
    If(KPFLG == 0) //如果未开启委托处理 
    { 
       TAC = M_GetTradeAccount(0); //账号 
       COD = M_GetTradeContract(); //合约编码 
       TBS = M_GetTradeBuySell(); //买卖方向 
       TEE = M_GetTradeEntryExit(); //开平方向 
       TVL = M_GetTradeVol(); //交易手数 
       If(TVL > 0 && COD.A_IsExchangeOpen() == 1) //如果交易手数大于0,且当前状态是开盘 
       { 
          If(TBS == Enum_Buy && TEE == Enum_Entry) //如果是买开方向 
          { 
             Commentary("【" + COD + "做多:手动买开" + Text(TVL) + "手!】"); 
             KPFLG = 1; //开启买开委托处理 
          } 
          Else If(TBS == Enum_Sell && TEE == Enum_Entry) //如果是卖开方向 
          { 
             Commentary("【" + COD + "做空:手动卖开" + Text(TVL) + "手!】"); 
             KPFLG = 2; //开启卖开委托处理 
          } 
          Else If(TBS == Enum_Buy && TEE == Enum_Exit) //如果是买平方向 
          { 
             Commentary("【" + COD + "平空:手动买平" + Text(TVL) + "手!】"); 
             KPFLG = 3; //开启买平委托处理 
          } 
          Else If(TBS == Enum_Buy && TEE == Enum_ExitToday) //如果是买平今方向 
          { 
             Commentary("【" + COD + "平今空:手动买平" + Text(TVL) + "手!】"); 
             KPFLG = 4; //开启买平今仓委托处理 
          } 
          Else If(TBS == Enum_Sell && TEE == Enum_Exit) //如果是卖平方向 
          { 
             Commentary("【" + COD + "平多:手动卖平" + Text(TVL) + "手!】"); 
             KPFLG = 5; //开启卖平委托处理 
          } 
          Else If(TBS == Enum_Sell && TEE == Enum_ExitToday) //如果是卖平今方向 
          { 
             Commentary("【" + COD + "平今多:手动卖平" + Text(TVL) + "手!】"); 
             KPFLG = 6; //开启卖平今仓委托处理 
          } 
          SH = COD.A_IsSHCode(); //上海合约标志 
          MINP = COD.Price("MinPrice"); //最小变动价位 
       } 
    }

   //------------------------------------委托处理------------------------------------// 
    If(KPFLG > 0 && COD.A_IsExchangeOpen() == 1) //如果已开启委托处理,且当前状态是开盘 
    { 
       BIDP = COD.Price("Bid1"); //买一价 
       ASKP = COD.Price("Ask1"); //卖一价 
       BIDV = COD.Price("BidVol1"); //买一量 
       ASKV = COD.Price("AskVol1"); //卖一量 
       BRP = COD.A_BuyRemainPosition(); //多头可用持仓 
       SRP = COD.A_SellRemainPosition(); //空头可用持仓 
       If(SH == 1) //如果当前合约是上海市场合约 
       { 
          BRP0 = COD.A_TodayBuyRemainPosition(); //多头今仓可用持仓 
          SRP0 = COD.A_TodaySellRemainPosition(); //空头今仓可用持仓 
          BRP1 = BRP - BRP0; //多头老仓可用持仓 
          SRP1 = SRP - SRP0; //空头老仓可用持仓 
       } 
       //------------------------------------成交判断------------------------------------// 
       If(BKFLG == 1) //如果有买开委托 
       { 
          If(F_OrderStatus(BKID) == Enum_Filled) //如果买开委托成交 
          { 
             Commentary("【" + COD + "做多:买开委托成交!】"); 
             TVL = TVL - BKM; //交易手数自减买开委托手数 
             BKFLG = 0; //买开标志归0 
             BKDEL = 0; //买开撤单标志归0 
          } 
          Else If(F_OrderStatus(BKID) == Enum_Canceled) //如果买开委托被撤单 
          { 
             If(F_OrderFilledLot(BKID) > 0) //如果买开委托部分成交 
             { 
                BKM = BKM - F_OrderFilledLot(BKID); //买开委托手数自减成交手数 
                TVL = TVL - F_OrderFilledLot(BKID); //交易手数自减成交手数 
             } 
             BKM = Min(ASKV,BKM); //买开委托手数 
             If(BKM > 0) //如果买开委托手数大于0 
             { 
                Commentary("【" + COD + "做多:公式买开" + Text(BKM) + "手!】"); 
                Commentary("【" + COD + "做多:买开委托追价!】"); 
                BKP = ASKP; //买开委托价格设为卖一价 
                BKID = COD.A_SendOrder(Enum_Buy,Enum_Entry,BKM,BKP,TAC); //以买开委托价格发出买开委托手数的买开委托 
             } 
             BKDEL = 0; //买开撤单标志归0 
          } 
          Else If(F_OrderStatus(BKID) == Enum_Declared || F_OrderStatus(BKID) == Enum_FillPart) //如果买开委托全部挂单或部分成交 
          { 
             If(ASKP != BKP && BKDEL == 0) //如果卖一价不等于买开委托价格,且未撤单 
             { 
                Commentary("【" + COD + "做多:买开委托撤单!】"); 
                F_DeleteOrder(F_OrderContractNo(BKID)); //撤掉买开委托挂单 
                BKDEL = 1; //已发出撤掉买开委托挂单 
             } 
          } 
       } 
       If(SKFLG == 1) //如果有卖开委托 
       { 
          If(F_OrderStatus(SKID) == Enum_Filled) //如果卖开委托成交 
          { 
             Commentary("【" + COD + "做空:卖开委托成交!】"); 
             TVL = TVL - SKM; //交易手数自减卖开委托手数 
             SKFLG = 0; //卖开标志归0 
             SKDEL = 0; //卖开撤单标志归0 
          } 
          Else If(F_OrderStatus(SKID) == Enum_Canceled) //如果卖开委托被撤单 
          { 
             If(F_OrderFilledLot(SKID) > 0) //如果卖开委托部分成交 
             { 
                SKM = SKM - F_OrderFilledLot(SKID); //卖开委托手数自减成交手数 
                TVL = TVL - F_OrderFilledLot(SKID); //交易手数自减成交手数 
             } 
             SKM = Min(BIDV,SKM); //卖开委托手数 
             If(SKM > 0) //如果卖开委托手数大于0 
             { 
                Commentary("【" + COD + "做空:公式卖开" + Text(SKM) + "手!】"); 
                Commentary("【" + COD + "做空:卖开委托追价!】"); 
                SKP = BIDP; //卖开委托价格设为买一价 
                SKID = COD.A_SendOrder(Enum_Sell,Enum_Entry,SKM,SKP,TAC); //以卖开委托价格发出卖开委托手数的卖开委托 
             } 
             SKDEL = 0; //卖开撤单标志归0 
          }

         Else If(F_OrderStatus(SKID) == Enum_Declared || F_OrderStatus(SKID) == Enum_FillPart) //如果卖开委托全部挂单或部分成交 
          { 
             If(BIDP != SKP && SKDEL == 0) //如果买一价不等于卖开委托价格,且未撤单 
             { 
                Commentary("【" + COD + "做空:卖开委托撤单!】"); 
                F_DeleteOrder(F_OrderContractNo(SKID)); //撤掉卖开委托挂单 
                SKDEL = 1; //已发出撤掉卖开委托挂单 
             } 
          } 
       } 
       If(BPFLG0 == 1) //如果有买平今仓委托 
       { 
          If(F_OrderStatus(BPID0) == Enum_Filled) //如果买平今仓委托成交 
          { 
             Commentary("【" + COD + "平空:买平今仓委托成交!】"); 
             TVL = TVL - BPM0; //交易手数自减买平今仓委托手数 
             BPFLG0 = 0; //买平今仓标志归0 
             BPDEL0 = 0; //买平今仓撤单标志归0 
          } 
          Else If(F_OrderStatus(BPID0) == Enum_Canceled) //如果买平今仓委托被撤单 
          { 
             If(F_OrderFilledLot(BPID0) > 0) //如果买平今仓委托部分成交 
             { 
                BPM0 = BPM0 - F_OrderFilledLot(BPID0); //买平今仓委托手数自减成交手数 
                TVL = TVL - F_OrderFilledLot(BPID0); //交易手数自减成交手数 
             } 
             BPM0 = Min1(SRP0,ASKV,BPM0); //买平今仓委托手数 
             If(SRP0 > 0 && BPM0 > 0) //如果有空头今仓可用持仓,且买平今仓委托手数大于0 
             { 
                Commentary("【" + COD + "平空:公式买平今仓" + Text(BPM0) + "手!】"); 
                Commentary("【" + COD + "平空:买平今仓委托追价!】"); 
                BPP0 = ASKP; //买平今仓委托价格设为卖一价 
                BPID0 = COD.A_SendOrder(Enum_Buy,Enum_ExitToday,BPM0,BPP0,TAC); //以买平今仓委托价格发出买平今仓委托手数的买平今仓委托 
             } 
             BPDEL0 = 0; //买平今仓撤单标志归0 
          } 
          Else If(F_OrderStatus(BPID0) == Enum_Declared || F_OrderStatus(BPID0) == Enum_FillPart) //如果买平今仓委托全部挂单或部分成交 
          { 
             If(ASKP != BPP0 && BPDEL0 == 0) //如果卖一价不等于买平今仓委托价格,且未撤单 
             { 
                Commentary("【" + COD + "平空:买平今仓委托撤单!】"); 
                F_DeleteOrder(F_OrderContractNo(BPID0)); //撤掉买平今仓委托挂单 
                BPDEL0 = 1; //已发出撤掉买平今仓委托挂单 
             } 
          } 
       } 
       If(BPFLG1 == 1) //如果有买平老仓委托 
       { 
          If(F_OrderStatus(BPID1) == Enum_Filled) //如果买平老仓委托成交 
          { 
             Commentary("【" + COD + "平空:买平老仓委托成交!】"); 
             TVL = TVL - BPM1; //交易手数自减买平老仓委托手数 
             BPFLG1 = 0; //买平老仓标志归0 
             BPDEL1 = 0; //买平老仓撤单标志归0 
          } 
          Else If(F_OrderStatus(BPID1) == Enum_Canceled) //如果买平老仓委托被撤单 
          { 
             If(F_OrderFilledLot(BPID1) > 0) //如果买平老仓委托部分成交 
             { 
                BPM1 = BPM1 - F_OrderFilledLot(BPID1); //买平老仓委托手数自减成交手数 
                TVL = TVL - F_OrderFilledLot(BPID1); //交易手数自减成交手数 
             } 
             BPM1 = Min1(SRP1,ASKV,BPM1); //买平老仓委托手数 
             If(SRP1 > 0 && BPM1 > 0) //如果有空头老仓可用持仓,且买平老仓委托手数大于0 
             { 
                Commentary("【" + COD + "平空:公式买平老仓" + Text(BPM1) + "手!】"); 
                Commentary("【" + COD + "平空:买平老仓委托追价!】"); 
                BPP1 = ASKP; //买平老仓委托价格设为卖一价 
                BPID1 = COD.A_SendOrder(Enum_Buy,Enum_Exit,BPM1,BPP1,TAC); //以买平老仓委托价格发出买平老仓委托手数的买平老仓委托 
             } 
             BPDEL1 = 0; //买平老仓撤单标志归0 
          }

         Else If(F_OrderStatus(BPID1) == Enum_Declared || F_OrderStatus(BPID1) == Enum_FillPart) //如果买平老仓委托全部挂单或部分成交 
          { 
             If(ASKP != BPP1 && BPDEL1 == 0) //如果卖一价不等于买平老仓委托价格,且未撤单 
             { 
                Commentary("【" + COD + "平空:买平老仓委托撤单!】"); 
                F_DeleteOrder(F_OrderContractNo(BPID1)); //撤掉买平老仓委托挂单 
                BPDEL1 = 1; //已发出撤掉买平老仓委托挂单 
             } 
          } 
       } 
       If(BPFLG == 1) //如果有买平委托 
       { 
          If(F_OrderStatus(BPID) == Enum_Filled) //如果买平委托成交 
          { 
             Commentary("【" + COD + "平空:买平委托成交!】"); 
             TVL = TVL - BPM; //交易手数自减买平委托手数 
             BPFLG = 0; //买平标志归0 
             BPDEL = 0; //买平撤单标志归0 
          } 
          Else If(F_OrderStatus(BPID) == Enum_Canceled) //如果买平委托被撤单 
          { 
             If(F_OrderFilledLot(BPID) > 0) //如果买平委托部分成交 
             { 
                BPM = BPM - F_OrderFilledLot(BPID); //买平委托手数自减成交手数 
                TVL = TVL - F_OrderFilledLot(BPID); //交易手数自减成交手数 
             } 
             BPM = Min1(SRP,ASKV,BPM); //买平委托手数 
             If(SRP > 0 && BPM > 0) //如果有空头可用持仓,且买平委托手数大于0 
             { 
                Commentary("【" + COD + "平空:公式买平" + Text(BPM) + "手!】"); 
                Commentary("【" + COD + "平空:买平委托追价!】"); 
                BPP = ASKP; //买平委托价格设为卖一价 
                BPID = COD.A_SendOrder(Enum_Buy,Enum_Exit,BPM,BPP,TAC); //以买平委托价格发出买平委托手数的买平委托 
             } 
             BPDEL = 0; //买平撤单标志归0 
          } 
          Else If(F_OrderStatus(BPID) == Enum_Declared || F_OrderStatus(BPID) == Enum_FillPart) //如果买平委托全部挂单或部分成交 
          { 
             If(ASKP != BPP && BPDEL == 0) //如果卖一价不等于买平委托价格,且未撤单 
             { 
                Commentary("【" + COD + "平空:买平委托撤单!】"); 
                F_DeleteOrder(F_OrderContractNo(BPID)); //撤掉买平委托挂单 
                BPDEL = 1; //已发出撤掉买平委托挂单 
             } 
          } 
       } 
       If(SPFLG0 == 1) //如果有卖平今仓委托 
       { 
          If(F_OrderStatus(SPID0) == Enum_Filled) //如果卖平今仓委托成交 
          { 
             Commentary("【" + COD + "平多:卖平今仓委托成交!】"); 
             TVL = TVL - SPM0; //交易手数自减卖平今仓委托手数 
             SPFLG0 = 0; //卖平今仓标志归0 
             SPDEL0 = 0; //卖平今仓撤单标志归0 
          } 
          Else If(F_OrderStatus(SPID0) == Enum_Canceled) //如果卖平今仓委托被撤单 
          { 
             If(F_OrderFilledLot(SPID0) > 0) //如果卖平今仓委托部分成交 
             { 
                SPM0 = SPM0 - F_OrderFilledLot(SPID0); //卖平今仓委托手数自减成交手数 
                TVL = TVL - F_OrderFilledLot(SPID0); //交易手数自减成交手数 
             } 
             SPM0 = Min1(BRP0,BIDV,SPM0); //卖平今仓委托手数 
             If(BRP0 > 0 && SPM0 > 0) //如果有多头今仓可用持仓,且卖平今仓委托手数大于0 
             { 
                Commentary("【" + COD + "平多:公式卖平今仓" + Text(SPM0) + "手!】"); 
                Commentary("【" + COD + "平多:卖平今仓委托追价!】"); 
                SPP0 = BIDP; //卖平今仓委托价格设为买一价 
                SPID0 = COD.A_SendOrder(Enum_Sell,Enum_ExitToday,SPM0,SPP0,TAC); //以卖平今仓委托价格发出卖平今仓委托手数的卖平今仓委托 
             } 
             SPDEL0 = 0; //卖平今仓撤单标志归0 
          } 
          Else If(F_OrderStatus(SPID0) == Enum_Declared || F_OrderStatus(SPID0) == Enum_FillPart) //如果卖平今仓委托全部挂单或部分成交 
          { 
             If(BIDP != SPP0 && SPDEL0 == 0) //如果买一价不等于卖平今仓委托价格,且未撤单 
             { 
                Commentary("【" + COD + "平多:卖平今仓委托撤单!】"); 
                F_DeleteOrder(F_OrderContractNo(SPID0)); //撤掉卖平今仓委托挂单 
                SPDEL0 = 1; //已发出撤掉卖平今仓委托挂单 
             } 
          } 
       }

      If(SPFLG1 == 1) //如果有卖平老仓委托 
       { 
          If(F_OrderStatus(SPID1) == Enum_Filled) //如果卖平老仓委托成交 
          { 
             Commentary("【" + COD + "平多:卖平老仓委托成交!】"); 
             TVL = TVL - SPM1; //交易手数自减卖平老仓委托手数 
             SPFLG1 = 0; //卖平老仓标志归0 
             SPDEL1 = 0; //卖平老仓撤单标志归0 
          } 
          Else If(F_OrderStatus(SPID1) == Enum_Canceled) //如果卖平老仓委托被撤单 
          { 
             If(F_OrderFilledLot(SPID1) > 0) //如果卖平老仓委托部分成交 
             { 
                SPM1 = SPM1 - F_OrderFilledLot(SPID1); //卖平老仓委托手数自减成交手数 
                TVL = TVL - F_OrderFilledLot(SPID1); //交易手数自减成交手数 
             } 
             SPM1 = Min1(BRP1,BIDV,SPM1); //卖平老仓委托手数 
             If(BRP1 > 0 && SPM1 > 0) //如果有多头老仓可用持仓,且卖平老仓委托手数大于0 
             { 
                Commentary("【" + COD + "平多:公式卖平老仓" + Text(SPM1) + "手!】"); 
                Commentary("【" + COD + "平多:卖平老仓委托追价!】"); 
                SPP1 = BIDP; //卖平老仓委托价格设为买一价 
                SPID1 = COD.A_SendOrder(Enum_Sell,Enum_Exit,SPM1,SPP1,TAC); //以卖平老仓委托价格发出卖平老仓委托手数的卖平老仓委托 
             } 
             SPDEL1 = 0; //卖平老仓撤单标志归0 
          } 
          Else If(F_OrderStatus(SPID1) == Enum_Declared || F_OrderStatus(SPID1) == Enum_FillPart) //如果卖平老仓委托全部挂单或部分成交 
          { 
             If(BIDP != SPP1 && SPDEL1 == 0) //如果买一价不等于卖平老仓委托价格,且未撤单 
             { 
                Commentary("【" + COD + "平多:卖平老仓委托撤单!】"); 
                F_DeleteOrder(F_OrderContractNo(SPID1)); //撤掉卖平老仓委托挂单 
                SPDEL1 = 1; //已发出撤掉卖平老仓委托挂单 
             } 
          } 
       } 
       If(SPFLG == 1) //如果有卖平委托 
       { 
          If(F_OrderStatus(SPID) == Enum_Filled) //如果卖平委托成交 
          { 
             Commentary("【" + COD + "平多:卖平委托成交!】"); 
             TVL = TVL - SPM; //交易手数自减卖平委托手数 
             SPFLG = 0; //卖平标志归0 
             SPDEL = 0; //卖平撤单标志归0 
          } 
          Else If(F_OrderStatus(SPID) == Enum_Canceled) //如果卖平委托被撤单 
          { 
             If(F_OrderFilledLot(SPID) > 0) //如果卖平委托部分成交 
             { 
                SPM = SPM - F_OrderFilledLot(SPID); //卖平委托手数自减成交手数 
                TVL = TVL - F_OrderFilledLot(SPID); //交易手数自减成交手数 
             } 
             SPM = Min1(BRP,BIDV,SPM); //卖平委托手数 
             If(BRP > 0 && SPM > 0) //如果有多头可用持仓,且卖平委托手数大于0 
             { 
                Commentary("【" + COD + "平多:公式卖平" + Text(SPM) + "手!】"); 
                Commentary("【" + COD + "平多:卖平委托追价!】"); 
                SPP = BIDP; //卖平委托价格设为买一价 
                SPID = COD.A_SendOrder(Enum_Sell,Enum_Exit,SPM,SPP,TAC); //以卖平委托价格发出卖平委托手数的卖平委托 
             } 
             SPDEL = 0; //卖平撤单标志归0 
          } 
          Else If(F_OrderStatus(SPID) == Enum_Declared || F_OrderStatus(SPID) == Enum_FillPart) //如果卖平委托全部挂单或部分成交 
          { 
             If(BIDP != SPP && SPDEL == 0) //如果买一价不等于卖平委托价格,且未撤单 
             { 
                Commentary("【" + COD + "平多:卖平委托撤单!】"); 
                F_DeleteOrder(F_OrderContractNo(SPID)); //撤掉卖平委托挂单 
                SPDEL = 1; //已发出撤掉卖平委托挂单 
             } 
          } 
       } 
       //------------------------------------委托处理------------------------------------// 
       If(KPFLG == 1) //如果已开启买开委托处理 
       { 
          If(BKFLG == 0) //如果没有买开委托 
          { 
             BKM = Min(ASKV,TVL); //买开委托手数 
             If(BKM > 0) //如果买开委托手数大于0 
             { 
                Commentary("【" + COD + "做多:公式买开" + Text(BKM) + "手!】"); 
                Commentary("【" + COD + "做多:买开委托发出!】"); 
                BKP = ASKP; //买开委托价格设为卖一价 
                BKID = COD.A_SendOrder(Enum_Buy,Enum_Entry,BKM,BKP,TAC); //以买开委托价格发出买开委托手数的买开委托 
                BKFLG = 1; //已发出买开委托 
             } 
             Else If(BKM == 0) //如果买开委托手数等于0 
             { 
                Commentary("【" + COD + "做多:买开委托完成!】"); 
                Exit(); //退出公式 
             } 
          } 
       }

      Else If(KPFLG == 2) //如果已开启卖开委托处理 
       { 
          If(SKFLG == 0) //如果没有卖开委托 
          { 
             SKM = Min(BIDV,TVL); //卖开委托手数 
             If(SKM > 0) //如果卖开委托手数大于0 
             { 
                Commentary("【" + COD + "做空:公式卖开" + Text(SKM) + "手!】"); 
                Commentary("【" + COD + "做空:卖开委托发出!】"); 
                SKP = BIDP; //卖开委托价格设为买一价 
                SKID = COD.A_SendOrder(Enum_Sell,Enum_Entry,SKM,SKP,TAC); //以卖开委托价格发出卖开委托手数的卖开委托 
                SKFLG = 1; //已发出卖开委托 
             } 
             Else If(SKM == 0) //如果卖开委托手数等于0 
             { 
                Commentary("【" + COD + "做空:卖开委托完成!】"); 
                Exit(); //退出公式 
             } 
          } 
       } 
       Else If(KPFLG == 3 || KPFLG == 4) //如果已开启买平委托处理 
       { 
          If(BPFLG0 == 0 && BPFLG1 == 0 && BPFLG == 0) //如果没有买平委托 
          { 
             BPM = Min(ASKV,TVL); //买平委托手数 
             If(BPM > 0) //如果买平委托手数大于0 
             { 
                If(SRP > 0) //如果有空头可用持仓 
                { 
                   If(SH == 1) //如果当前合约是上海市场合约 
                   { 
                      If(SRP0 > 0) //如果有空头今仓可用持仓 
                      { 
                         BPM0 = Min(SRP0,BPM); //买平今仓委托手数 
                         BPM1 = Min(SRP1,BPM - BPM0); //买平老仓委托手数 
                         Commentary("【" + COD + "平空:公式买平今仓" + Text(BPM0) + "手!】"); 
                         Commentary("【" + COD + "平空:买平今仓委托发出!】"); 
                         BPP0 = ASKP; //买平今仓委托价格设为卖一价 
                         BPID0 = COD.A_SendOrder(Enum_Buy,Enum_ExitToday,BPM0,BPP0,TAC); //以买平今仓委托价格发出买平今仓委托手数的买平今仓委托 
                         BPFLG0 = 1; //已发出买平今仓委托 
                      } 
                      Else If(SRP0 == 0) //如果没有空头今仓可用持仓 
                      { 
                         BPM1 = Min(SRP1,BPM); //买平老仓委托手数 
                      } 
                      If(KPFLG == 3 && SRP1 > 0 && BPM1 > 0) //如果未开启买平今仓委托处理,且有空头老仓可用持仓,且买平老仓委托手数大于0 
                      { 
                         Commentary("【" + COD + "平空:公式买平老仓" + Text(BPM1) + "手!】"); 
                         Commentary("【" + COD + "平空:买平老仓委托发出!】"); 
                         BPP1 = ASKP; //买平老仓委托价格设为卖一价 
                         BPID1 = COD.A_SendOrder(Enum_Buy,Enum_Exit,BPM1,BPP1,TAC); //以买平老仓委托价格发出买平老仓委托手数的买平老仓委托 
                         BPFLG1 = 1; //已发出买平老仓委托 
                      } 
                   } 
                   Else //如果当前合约非上海市场合约 
                   { 
                      BPM = Min(SRP,BPM); //买平委托手数 
                      Commentary("【" + COD + "平空:公式买平" + Text(BPM) + "手!】"); 
                      Commentary("【" + COD + "平空:买平委托发出!】"); 
                      BPP = ASKP; //买平委托价格设为卖一价 
                      BPID = COD.A_SendOrder(Enum_Buy,Enum_Exit,BPM,BPP,TAC); //以买平委托价格发出买平委托手数的买平委托 
                      BPFLG = 1; //已发出买平委托 
                   } 
                } 
                Else If(SRP == 0) //如果没有空头可用持仓 
                { 
                   Commentary("【" + COD + "平空:买平委托完成!】"); 
                   Exit(); //退出公式 
                } 
             } 
             Else If(BPM == 0) //如果买平委托手数等于0 
             { 
                Commentary("【" + COD + "平空:买平委托完成!】"); 
                Exit(); //退出公式 
             } 
          } 
       } 
       Else If(KPFLG == 5 || KPFLG == 6) //如果已开启卖平委托处理 
       { 
          If(SPFLG0 == 0 && SPFLG1 == 0 && SPFLG == 0) //如果没有卖平委托 
          { 
             SPM = Min(BIDV,TVL); //卖平委托手数 
             If(SPM > 0) //如果卖平委托手数大于0 
             { 
                If(BRP > 0) //如果有多头可用持仓 
                { 
                   If(SH == 1) //如果当前合约是上海市场合约 
                   { 
                      If(BRP0 > 0) //如果有多头今仓可用持仓 
                      { 
                         SPM0 = Min(BRP0,SPM); //卖平今仓委托手数 
                         SPM1 = Min(BRP1,SPM - SPM0); //卖平老仓委托手数 
                         Commentary("【" + COD + "平多:公式卖平今仓" + Text(SPM0) + "手!】"); 
                         Commentary("【" + COD + "平多:卖平今仓委托发出!】"); 
                         SPP0 = BIDP; //卖平今仓委托价格设为买一价 
                         SPID0 = COD.A_SendOrder(Enum_Sell,Enum_ExitToday,SPM0,SPP0,TAC); //以卖平今仓委托价格发出卖平今仓委托手数的卖平今仓委托 
                         SPFLG0 = 1; //已发出卖平今仓委托 
                      } 
                      Else If(BRP0 == 0) //如果没有多头今仓可用持仓 
                      { 
                         SPM1 = Min(BRP1,SPM); //卖平老仓委托手数 
                      } 
                      If(KPFLG == 5 && BRP1 > 0 && SPM1 > 0) //如果未开启卖平今仓委托处理,且有多头老仓可用持仓,且卖平老仓委托手数大于0 
                      { 
                         Commentary("【" + COD + "平多:公式卖平老仓" + Text(SPM1) + "手!】"); 
                         Commentary("【" + COD + "平多:卖平老仓委托发出!】"); 
                         SPP1 = BIDP; //卖平老仓委托价格设为买一价 
                         SPID1 = COD.A_SendOrder(Enum_Sell,Enum_Exit,SPM1,SPP1,TAC); //以卖平老仓委托价格发出卖平老仓委托手数的卖平老仓委托 
                         SPFLG1 = 1; //已发出卖平老仓委托 
                      } 
                   } 
                   Else //如果当前合约非上海市场合约 
                   { 
                      SPM = Min(BRP,SPM); //卖平委托手数 
                      Commentary("【" + COD + "平多:公式卖平" + Text(SPM) + "手!】"); 
                      Commentary("【" + COD + "平多:卖平委托发出!】"); 
                      SPP = BIDP; //卖平委托价格设为买一价 
                      SPID = COD.A_SendOrder(Enum_Sell,Enum_Exit,SPM,SPP,TAC); //以卖平委托价格发出卖平委托手数的卖平委托 
                      SPFLG = 1; //已发出卖平委托 
                   } 
                } 
                Else If(BRP == 0) //如果没有多头可用持仓 
                { 
                   Commentary("【" + COD + "平多:卖平委托完成!】"); 
                   Exit(); //退出公式 
                } 
             } 
             Else If(SPM == 0) //如果卖平委托手数等于0 
             { 
                Commentary("【" + COD + "平多:卖平委托完成!】"); 
                Exit(); //退出公式 
             } 
          } 
       } 
    } 
End

通过右上方菜单【运行】->【算法交易运行池】->【算法交易下单】,调出算法交易下单界面,按下图所示方法实现手动下单调用算法交易:

手动交易+算法交易案例一:手动下单调用算法交易

注:①如果再次下单,会再次加载该模型,不会直接在前一个算法交易模型中继续执行。

②如果模型中含有函数Exit(),则模型执行完毕后会自动退出。

超长k线数据案例一:超长k线数据测试 量化交易

超长k线数据案例一:超长k线数据测试

前言 问题一:超长的K线数据有什么用? 以上期所的螺纹钢合约为例,螺纹钢2009年挂牌交易至今,已经有超过10年的历史数据。前8年的历史数据囊括了2009年的急涨急跌行情、2011年的震荡行情、201...