手动交易+算法交易案例四:实现自己的止盈止损策略

软件中会提供几种默认止盈止损策略,但有时还是无法完全满足用户的多样性需要,算法交易模型的函数可取到盘口价格和持仓合约的信息(持仓价格、数量、和盈亏等),通过编写算法交易模型可定制属于您自己的止盈止损策略。

跟踪止盈是软件默认提供的策略,但如果希望在盈利达到一定值时再启动跟踪止盈策略,就无法实现了。那么在开仓后,算法交易模型就会开始取盘口价格和持仓价格实时监测,满足了条件会自动发平仓委托。源码如下:

//止盈止损 
Data 
    data0:"m1709"; 
Vars 
    Global_Numeric N;//下单手数 
    Global_Numeric M1; //价位倍数1 
    Global_Numeric M2; //价位倍数2 
    Global_Numeric M3; //价位倍数3 
    Global_Numeric BID; //买一价 
    Global_Numeric ASK; //卖一价 
    Global_Numeric NEWP; //最新价 
    Global_Numeric MINP; //最小变动价位 
    Global_Numeric BKC; //做多条件 
    Global_Numeric BKID; //买开委托 
    Global_Numeric BKFLG; //买开标志 
    Global_Numeric BKAP; //买开委托成交均价 
    Global_Numeric BHP; //多头最高价 
    Global_Numeric SPID; //卖平委托 
    Global_Numeric SPFLG; //卖平标志 
    Global_Numeric BRP; //多头可用持仓 
    Global_Numeric BZYFLG; //多头止盈标志 
Begin 
    N = 2; //下单手数 
    M1 = 3; //价位倍数1 
    M2 = 1; //价位倍数2 
    M3 = 3; //价位倍数3 
    BKC = 1; //做多条件 
    BID = Price("Bid1"); //买一价 
    ASK = Price("Ask1"); //卖一价 
    NEWP = Price("New"); //最新价 
    MINP = Price("MinPrice");//最小变动价位 
    BRP = F_BuyRemainPosition(); //多头可用持仓

   if(A_IsExchangeOpen() == 1) //如果当前状态是开盘 
    { 
       //----------------------成交判断--------------------// 
      if(BKFLG == 1) //如果有买开委托 
       { 
          if(F_OrderStatus(BKID) == Enum_Filled) //如果买开委托成交 
          { 
             Commentary("【多头开仓:买开委托成交!】"); 
             BKAP = F_OrderFilledPrice(BKID); //买开委托成交均价 
             BKFLG = 2; //买开委托已成交 
          } 
       }

      if(SPFLG > 0) //如果有卖平委托 
       { 
          if(F_OrderStatus(SPID) == Enum_Filled) //如果卖平委托成交 
          { 
             if(SPFLG == 1) //如果是多头止盈卖平委托 
             { 
                Commentary("【多头止盈:卖平委托成交!】"); 
             } 
             else if(SPFLG == 2) //如果是多头止损卖平委托 
             { 
                Commentary("【多头止损:卖平委托成交!】"); 
             } 
             BKFLG = 0; //买开标志归0 
             SPFLG = 0; //卖平标志归0 
             BZYFLG = 0; //多头止盈标志归0 
          } 
       }

      //----------------------委托处理--------------------//

      if(BKFLG == 0) //如果没有买开委托 
       { 
          if(BKC == 1) //如果满足做多条件 
          { 
             Commentary("【多头开仓:买开委托发出!】"); 
             BKID = A_SendOrder(Enum_Buy,Enum_Entry,N,ASK); //以对价发出N手的买开委托 
             BKFLG = 1; //已发出买开委托 
          } 
       }

      if(BKFLG == 2 && SPFLG == 0) //如果买开委托已成交,且没有卖平委托 
       { 
          if(BZYFLG == 0) //如果多头止盈未开启 
          { 
             if(NEWP >= BKAP + M1 * MINP) //如果最新价大于等于买开委托成交均价加M1个价位 
             { 
                Commentary("【多头止盈:多头止盈开启!】"); 
                BHP = NEWP; //多头最高价设为最新价 
                BZYFLG = 1; //多头止盈开启 
             } 
          } 
          else if(BZYFLG == 1) //如果多头止盈已开启 
          { 
             BHP = max(NEWP,BHP); //多头最高价 
             if(NEWP <= BHP - M2 * MINP) //如果最新价小于等于多头最高价减M2个价位 
             { 
                if(BRP > 0) //如果有多头可用持仓 
                { 
                   Commentary("【多头止盈:卖平委托发出!】"); 
                   SPID = A_SendOrder(Enum_Sell,Enum_Exit,BRP,BID); //以对价发出多头可用持仓手数的卖平委托 
                   SPFLG = 1; //已发出多头止盈卖平委托 
                   BZYFLG = 2; //多头止盈已卖平 
                } 
             } 
          } 
          if(BZYFLG != 2) //如果多头止盈未卖平 
          { 
             if(NEWP <= BKAP - M3 * MINP) //如果最新价小于等于买开委托成交均价减M3个价位 
             { 
                Commentary("【多头止损:卖平委托发出!】"); 
                SPID = A_SendOrder(Enum_Sell,Enum_Exit,BRP,BID); //以对价发出多头可用持仓手数的卖平委托 
                SPFLG = 2; //已发出多头止损卖平委托 
             } 
          } 
       } 
    } 
End

算法交易模型执行效果如下图所示,开仓之后满足止损平仓条件,会自动发出平仓委托:

手动交易+算法交易案例四:实现自己的止盈止损策略
超长k线数据案例一:超长k线数据测试 量化交易

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

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