wh9 k线策略模型:基于价格区间突破的交易系统策略公式 [复制链接]

    autojiaoyi.com 发表于 ・553 次阅读 库安 wh9 查看全部 使用道具 举报 回复

    wh9 k线策略模型:基于价格区间突破的交易系统策略公式

    公式源码如下:
    Params
       Numeric Length1(50); //长周期区间参数
       Numeric Length2(30); //短周期区间参数
       Numeric IPS(4); //保护止损波动率参数
       Numeric ATRVal(10); //波动率参数
    Vars
       Numeric L2; //较大的区间参数
       Numeric L1; //较小的区间参数    
       NumericSeries ATR; //真实波幅
       NumericSeries Upperband; //上轨
       NumericSeries Lowerband; //下轨
       NumericSeries Exitlong; //区间最低价
       NumericSeries Exitshort; //区间最高价
       NumericSeries ProtectStopL; //定义简单数值型序列变量
       NumericSeries ProtectStopS; //定义简单数值型序列变量
       Numeric N; //下单手数
       Numeric T; //时间间隔
       Numeric SH; //平仓参数
       Numeric NOW; //当前时间
       Numeric RLP,FLP; //涨跌停价
       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) //信号发出
       {
          ATR = AvgTrueRange(ATRVal); //定义ATR
          L1 = Max(Length1,Length2); //出场周期选择较大的区间参数
          L2 = Min(Length1,Length2); //出场周期选择较小的区间参数
          Upperband = HHV(High,L1); //长周期最高价区间
          Lowerband = Lowest(Low,L1); //长周期最低价区间
          Exitlong = LLV(Low,L2); //短周期最低价区间
          Exitshort = HHV(high,L2); //短周期最高价区间
          //多头系统入场
          If(Marketposition == 0 && High >= Upperband[1] + MinPrice && Vol > 0) //价格大于长周期最高价区间入场做多
          {
             BK(DefaultVol,Max(Open,Upperband[1] + MinPrice));
             ProtectStopL = Entryprice - IPS * ATR[1];
          }
          //空头系统入场   
          If(Marketposition == 0 && Low <= Lowerband[1] - MinPrice && Vol > 0) //价格低于长周期最低价区间入场做空
          {
             SK(DefaultVol,Min(Open ,Lowerband[1] - MinPrice));
             ProtectStopS = Entryprice + IPS * ATR[1];
          }
          //多头系统出场
          If(MarketPosition == 1 && BarsSinceEntry > 0 && Vol > 0)
          {
             If(Low <= ProtectStopL[1] && ProtectStopL[1] >= Exitlong[1]) //价格低于入场价以下一定ATR幅度止损
             {
                SP(DefaultVol,Min(Open,ProtectStopL[1]));
             }
             Else If(Low <= Exitlong[1] - MinPrice) //价格低于短周期最低价区间出场
             {
                SP(DefaultVol,Min(Open,Exitlong[1] - MinPrice));
             }
          }
          //空头系统出场
          If(MarketPosition == -1 && BarsSinceEntry> 0 && Vol > 0)
          {
             If(High >= ProtectStopS[1] && ProtectStopS[1] <= Exitshort[1]) //价格高于入场价以上一定ATR幅度止损
             {
                BP(DefaultVol,Max(Open ,ProtectStopS[1]));
             }
             Else If(High >= Exitshort[1] + MinPrice)
             {
                BP(DefaultVol,Max(Open ,Exitshort[1] + MinPrice)); //价格高于短周期最高价区间出场
             }
          }
       }
       //------------------------处理开启------------------------//
       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
    热帖

    全部评论/0 条

    本版积分规则

    发布新内容
    加入收藏 我要分享
    分享到论坛或者博客

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