wh9 k线策略模型:基于高低点与突破的系统策略公式 [复制链接]

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

    wh9 k线策略模型:基于高低点与突破的系统策略公式

    策略公式源码:
    Params
       Numeric AvgLen(20); //高低点均线计算周期
       Numeric AbsDisp(5); //高低点均线前移周期
       Numeric ExitBar(5); //止损周期参数,该周期以前中轨止损,以后外轨止损
    Vars
       NumericSeries UpperAvg; //通道上轨
       NumericSeries LowerAvg; //通道下轨
       NumericSeries ExitAvg; //通道中轨
       NumericSeries RangeLeadB;
       NumericSeries RangeLeadS;
       NumericSeries MedianPrice; //K线中点
       NumericSeries Range1; //K线振幅
       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) //信号发出
       {
          Range1 = High - Low; //K线振幅
          UpperAvg = Ma(High[AbsDisp],AvgLen); //计算AvgLen周期内,AbsDisp周期前高点的均值
          LowerAvg = Ma(Low[AbsDisp],AvgLen); //计算AvgLen周期内,AbsDisp周期前低点的均值
          MedianPrice = (High + Low) * 0.5; //计算K线中点
          ExitAvg = Ma(MedianPrice[AbsDisp],AvgLen); //计算AvgLen周期内,AbsDisp周期前K线中点的均值
          RangeLeadB = MedianPrice > High[1] && Range1 > Range1[1]; //当根K线满足中点大于前一根K线高点且振幅大于上一根振幅
          RangeLeadS = MedianPrice < Low[1] && Range1 > Range1[1]; //当根K线满足中点小于前一根K线低点且振幅大于上一根振幅
          PlotNumeric("Lineu",UpperAvg); //输出通道上轨
          PlotNumeric("LineM",ExitAvg); //输出通道中轨
          PlotNumeric("Lingd",LowerAvg); //输出通道下轨
          //系统入场
          If(MarketPosition == 0) //无持仓
          {
             If(RangeLeadB[1] == 1 && Close[1] > UpperAvg[1]) //上根K线满足RangeLeadB条件,且上一根收盘价大于上一根通道上轨
             {
                BK(DefaultVol,Open); //以开盘价开多仓
             }
             If(RangeLeadS[1] == 1 && Close[1] < LowerAvg[1]) //上根K线满足RangeLeadS条件,且上一根收盘价小于上一根通道下轨
             {
                SK(DefaultVol,Open); //以开盘价开空仓
             }
          }
          //系统出场
          If(MarketPosition == 1 && BarsSinceEntry > 0) //持有多仓且开仓后一根K线以后
          {
             If(BarsSinceEntry <= ExitBar) //开仓后ExitBar根K线内
             {
                If(Low <= ExitAvg) //最低价小于等于中轨
                {
                   SP(DefaultVol,Min(Open,ExitAvg)); //以开盘价和中轨的较小价平多仓
                }
             }
             Else If(BarsSinceEntry > ExitBar) //否则开仓后ExitBar根K线以后
             {
                If(Low <= UpperAvg - MinPrice) //最低价小于等于上轨减最小变动价位 
                {
                   SP(DefaultVol,Min(Open,UpperAvg - MinPrice)); //以开盘价与上轨减最小变动价位的较小价平多仓
                }
             }
          }
          If(MarketPosition == -1 && BarsSinceEntry > 0) //持有空仓且开仓后一根K线以后
          {
             If(BarsSinceEntry <= ExitBar) //开仓后ExitBar根K线内
             {
                If(High >= ExitAvg) //最高价大于等于中轨
                {
                   BP(DefaultVol,Max(Open,ExitAvg)); //以开盘价和中轨的较大价平空仓
                }
             }
             Else If(BarsSinceEntry > ExitBar) //否则开仓后ExitBar根K线以后
             {
                If(High >= LowerAvg + MinPrice) //最高价大于等于下轨加最小变动价位
                {
                   BP(DefaultVol,Max(Open,LowerAvg + 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 条

    本版积分规则

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

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