wh9 k线策略模型:基于平移通道的交易系统策略公式

    autojiaoyi.com 发表于 2019-12-25 12:36 ・1462次浏览 0条跟帖 库安 wh9 回复

    wh9 k线策略模型:基于平移通道的交易系统策略公式

    策略公式源码如下:
    Params
       Numeric AvgLen(3); //boll均线周期参数
       Numeric Disp(16); //boll平移参数
       Numeric SDLen(12); //boll标准差周期参数
       Numeric SDev(2); //boll通道倍数参数
    Vars
       Numeric TPrice; //关键价格
       NumericSeries AvgVal; //中轨
       NumericSeries SDmult; //通道距离
       NumericSeries DispTop; //通道高点
       NumericSeries DispBottom; //通道低点
       Numeric N; //下单手数
       Numeric T; //时间间隔
       Numeric SH; //平仓参数
       Numeric NOW; //当前时间
       Numeric BIDP,ASKP; //买卖一价
       Numeric BRP,SRP; //多空头可用持仓
       Numeric OPFLG; //模型处理标志
       Numeric BKDFLG; //买开处理标志
       Numeric SKDFLG; //卖开处理标志
       Numeric BPDFLG; //买平处理标志
       Numeric SPDFLG; //卖平处理标志
       Global_Numeric BKID,SKID; //开仓委托
       Global_Numeric BPID,SPID; //平仓委托
       Global_Numeric BKFLG,SKFLG; //开仓标志
       Global_Numeric BPFLG,SPFLG; //平仓标志
       Global_Numeric BKDEL,SKDEL; //开仓撤单标志
       Global_Numeric BPDEL,SPDEL; //平仓撤单标志
       Global_Numeric BKM,SKM; //开仓委托手数
       Global_Numeric BPM,SPM; //平仓委托手数
       Global_Numeric BKP,SKP; //开仓委托价格
       Global_Numeric BPP,SPP; //平仓委托价格
       Global_Numeric BKT,SKT; //开仓委托时间
       Global_Numeric BPT,SPT; //平仓委托时间
    Begin
       //------------------------信号发出------------------------//
       If(1) //信号发出
       {
          //平移boll通道计算
          TPrice = Close; //关键价格
          AvgVal = Ma(TPrice,AvgLen);
          SDmult = Std(TPrice,SDLen) * SDev;
          DispTop = AvgVal[Disp] + SDmult;
          DispBottom = AvgVal[Disp] - SDmult;
          //系统入场
          If(MarketPosition == 0)
          {
             If(High >= DispTop[1])
             {
                BK(DefaultVol,Max(Open,DispTop[1]));
             }
             Else If(Low <= DispBottom[1])
             {
                SK(DefaultVol,Min(Open,DispBottom[1]));
             }
          }
          //系统出场
          If(MarketPosition == 1 && BarsSinceEntry > 0)
          {
             If(Low <= DispBottom[1])
             {
                SP(DefaultVol,Min(Open,DispBottom[1]));
             }
          }
          If(MarketPosition == -1 && BarsSinceEntry > 0)
          {
             If(High >= DispTop[1])
             {
                BP(DefaultVol,Max(Open,DispTop[1]));
             }
          }
       }
       //------------------------处理开启------------------------//
       If(A_IsExchangeOpen() == 1) //如果是开盘状态
       {
          If(BarStatus() == 2) //如果不带入历史值
          {
             If(RunStart() == 1) //如果已初始化成功
             {
                OPFLG = 1; //开启模型处理
             }
          }
       }
       //------------------------变量赋值------------------------//
       If(OPFLG == 1) //变量赋值
       {
          N = 2; //下单手数
          T = 3; //时间间隔
          NOW = CurrentTime(); //当前时间
          BIDP = Price("Bid1"); //买一价
          ASKP = Price("Ask1"); //卖一价
          BRP = F_BuyRemainPosition(); //多头可用持仓
          SRP = F_SellRemainPosition(); //空头可用持仓
          BRP = Min(BRP,A_BuyRemainPosition()); //多头可用持仓
          SRP = Min(SRP,A_SellRemainPosition()); //空头可用持仓
          If(A_IsSHCode() == 1) //如果是上期所合约
          {
             SH = Enum_ExitToday; //平仓参数
          }
          Else //如果非上期所合约
          {
             SH = Enum_Exit; //平仓参数
          }
       }
       //------------------------信号处理------------------------//
       If(OPFLG == 1) //信号处理
       {
          If(F_FreshSig() == 1) //如果当前信号是未处理过的信号
          {
             If(F_SigValid() == 1) //如果当前信号未消失
             {
                If(F_Sig() == Sig_BK) //如果信号类型为BK
                {
                   Commentary("【BK信号!】");
                   BKDFLG = 1; //开启买开处理
                }
                Else If(F_Sig() == Sig_SP) //如果信号类型为SP
                {
                   Commentary("【SP信号!】");
                   SPDFLG = 1; //开启卖平处理
                }
                Else If(F_Sig() == Sig_SK) //如果信号类型为SK
                {
                   Commentary("【SK信号!】");
                   SKDFLG = 1; //开启卖开处理
                }
                Else If(F_Sig() == Sig_BP) //如果信号类型为BP
                {
                   Commentary("【BP信号!】");
                   BPDFLG = 1; //开启买平处理
                }
             }
          }
       }
       //------------------------成交判断------------------------//
       If(OPFLG == 1) //成交判断
       {
          If(BKFLG == 1) //如果有买开委托
          {
             If(F_OrderStatus(BKID) == Enum_Filled) //如果买开委托成交
             {
                Commentary("【BK信号:买开委托成交!】");
                BKFLG = 0; //买开标志归0
                BKDEL = 0; //买开撤单标志归0
             }
             Else If(F_OrderStatus(BKID) == Enum_Canceled) //如果买开委托已撤
             {
                Commentary("【BK信号:买开委托已撤!】");
                If(F_OrderFilledLot(BKID) > 0) //如果买开委托部分成交
                {
                   BKM = BKM - F_OrderFilledLot(BKID); //买开委托手数
                }
                If(BKM > 0) //如果买开委托手数大于0
                {
                   BKP = ASKP; //买开委托价格
                   Commentary("【BK信号:买开委托追价!】");
                   BKID = A_SendOrder(Enum_Buy,Enum_Entry,BKM,BKP); //发出买开委托
                   BKT = NOW; //买开委托时间
                }
                BKDEL = 0; //买开撤单标志归0
             }
             Else If(F_OrderStatus(BKID) == Enum_Declared || F_OrderStatus(BKID) == Enum_FillPart) //如果买开委托挂单
             {
                If(BKDEL == 0) //如果未撤单
                {
                   If(TimeDiff(BKT,NOW) >= T) //如果时间间隔T秒
                   {
                      Commentary("【BK信号:买开委托撤单!】");
                      F_DeleteOrder(F_OrderContractNo(BKID)); //撤掉买开委托挂单
                      BKDEL = 1; //已发出撤掉买开委托挂单
                   }
                }
             }
          }
          If(SPFLG == 1) //如果有卖平委托
          {
             If(F_OrderStatus(SPID) == Enum_Filled) //如果卖平委托成交
             {
                Commentary("【SP信号:卖平委托成交!】");
                SPFLG = 0; //卖平标志归0
                SPDEL = 0; //卖平撤单标志归0
             }
             Else If(F_OrderStatus(SPID) == Enum_Canceled) //如果卖平委托已撤
             {
                Commentary("【SP信号:卖平委托已撤!】");
                If(F_OrderFilledLot(SPID) > 0) //如果卖平委托部分成交
                {
                   SPM = SPM - F_OrderFilledLot(SPID); //卖平委托手数
                }
                If(BRP > 0 && SPM > 0 && SPM <= BRP) //如果卖平委托手数不超过多头可用持仓
                {
                   SPP = BIDP; //卖平委托价格
                   Commentary("【SP信号:卖平委托追价!】");
                   SPID = A_SendOrder(Enum_Sell,SH,SPM,SPP); //发出卖平委托
                   SPT = NOW; //卖平委托时间
                }
                SPDEL = 0; //卖平撤单标志归0
             }
             Else If(F_OrderStatus(SPID) == Enum_Declared || F_OrderStatus(SPID) == Enum_FillPart) //如果卖平委托挂单
             {
                If(SPDEL == 0) //如果未撤单
                {
                   If(TimeDiff(SPT,NOW) >= T) //如果时间间隔T秒
                   {
                      Commentary("【SP信号:卖平委托撤单!】");
                      F_DeleteOrder(F_OrderContractNo(SPID)); //撤掉卖平委托挂单
                      SPDEL = 1; //已发出撤掉卖平委托挂单
                   }
                }
             }
          }
          If(SKFLG == 1) //如果有卖开委托
          {
             If(F_OrderStatus(SKID) == Enum_Filled) //如果卖开委托成交
             {
                Commentary("【SK信号:卖开委托成交!】");
                SKFLG = 0; //卖开标志归0
                SKDEL = 0; //卖开撤单标志归0
             }
             Else If(F_OrderStatus(SKID) == Enum_Canceled) //如果卖开委托已撤
             {
                Commentary("【SK信号:卖开委托已撤!】");
                If(F_OrderFilledLot(SKID) > 0) //如果卖开委托部分成交
                {
                   SKM = SKM - F_OrderFilledLot(SKID); //卖开委托手数
                }
                If(SKM > 0) //如果卖开委托手数大于0
                {
                   SKP = BIDP; //卖开委托价格
                   Commentary("【SK信号:卖开委托追价!】");
                   SKID = A_SendOrder(Enum_Sell,Enum_Entry,SKM,SKP); //发出卖开委托
                   SKT = NOW; //卖开委托时间
                }
                SKDEL = 0; //卖开撤单标志归0
             }
             Else If(F_OrderStatus(SKID) == Enum_Declared || F_OrderStatus(SKID) == Enum_FillPart) //如果卖开委托挂单
             {
                If(SKDEL == 0) //如果未撤单
                {
                   If(TimeDiff(SKT,NOW) >= T) //如果时间间隔T秒
                   {
                      Commentary("【SK信号:卖开委托撤单!】");
                      F_DeleteOrder(F_OrderContractNo(SKID)); //撤掉卖开委托挂单
                      SKDEL = 1; //已发出撤掉卖开委托挂单
                   }
                }
             }
          }
          If(BPFLG == 1) //如果有买平委托
          {
             If(F_OrderStatus(BPID) == Enum_Filled) //如果买平委托成交
             {
                Commentary("【BP信号:买平委托成交!】");
                BPFLG = 0; //买平标志归0
                BPDEL = 0; //买平撤单标志归0
             }
             Else If(F_OrderStatus(BPID) == Enum_Canceled) //如果买平委托已撤
             {
                Commentary("【BP信号:买平委托已撤!】");
                If(F_OrderFilledLot(BPID) > 0) //如果买平委托部分成交
                {
                   BPM = BPM - F_OrderFilledLot(BPID); //买平委托手数
                }
                If(SRP > 0 && BPM > 0 && BPM <= SRP) //如果买平委托手数不超过空头可用持仓
                {
                   BPP = ASKP; //买平委托价格
                   Commentary("【BP信号:买平委托追价!】");
                   BPID = A_SendOrder(Enum_Buy,SH,BPM,BPP); //发出买平委托
                   BPT = NOW; //买平委托时间
                }
                BPDEL = 0; //买平撤单标志归0
             }
             Else If(F_OrderStatus(BPID) == Enum_Declared || F_OrderStatus(BPID) == Enum_FillPart) //如果买平委托挂单
             {
                If(BPDEL == 0) //如果未撤单
                {
                   If(TimeDiff(BPT,NOW) >= T) //如果时间间隔T秒
                   {
                      Commentary("【BP信号:买平委托撤单!】");
                      F_DeleteOrder(F_OrderContractNo(BPID)); //撤掉买平委托挂单
                      BPDEL = 1; //已发出撤掉买平委托挂单
                   }
                }
             }
          }
       }
       //------------------------委托处理------------------------//
       If(OPFLG == 1) //委托处理
       {
          If(BKDFLG == 1) //如果已开启买开处理
          {
             If(BKFLG == 0) //如果没有买开委托
             {
                BKM = N; //买开委托手数
                BKP = ASKP; //买开委托价格
                Commentary("【BK信号:买开委托发出!】");
                BKID = A_SendOrder(Enum_Buy,Enum_Entry,BKM,BKP); //发出买开委托
                BKT = NOW; //买开委托时间
                BKFLG = 1; //已发出买开委托
             }
          }
          If(SPDFLG == 1) //如果已开启卖平处理
          {
             If(SPFLG == 0) //如果没有卖平委托
             {
                If(BRP > 0) //如果有多头可用持仓
                {
                   SPM = BRP; //卖平委托手数
                   SPP = BIDP; //卖平委托价格
                   Commentary("【SP信号:卖平委托发出!】");
                   SPID = A_SendOrder(Enum_Sell,SH,SPM,SPP); //发出卖平委托
                   SPT = NOW; //卖平委托时间
                   SPFLG = 1; //已发出卖平委托
                }
             }
          }
          If(SKDFLG == 1) //如果已开启卖开处理
          {
             If(SKFLG == 0) //如果没有卖开委托
             {
                SKM = N; //卖开委托手数
                SKP = BIDP; //卖开委托价格
                Commentary("【SK信号:卖开委托发出!】");
                SKID = A_SendOrder(Enum_Sell,Enum_Entry,SKM,SKP); //发出卖开委托
                SKT = NOW; //卖开委托时间
                SKFLG = 1; //已发出卖开委托
             }
          }
          If(BPDFLG == 1) //如果已开启买平处理
          {
             If(BPFLG == 0) //如果没有买平委托
             {
                If(SRP > 0) //如果有空头可用持仓
                {
                   BPM = SRP; //买平委托手数
                   BPP = ASKP; //买平委托价格
                   Commentary("【BP信号:买平委托发出!】");
                   BPID = A_SendOrder(Enum_Buy,SH,BPM,BPP); //发出买平委托
                   BPT = NOW; //买平委托时间
                   BPFLG = 1; //已发出买平委托
                }
             }
          }
       }
    End

    本版积分规则

    发布新内容
    请关注微信公众号,获取最新指标公式
    加入收藏 我要分享
    分享到论坛或者博客

    复制
    热门指标策略
    快速回复 返回顶部 返回列表