wh9 k线策略模型:基于置换均线的二次穿越突破系统策略公式 [复制链接]

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

    wh9 k线策略模型:基于置换均线的二次穿越突破系统策略公式

    策略公式源码:
    Params
       Numeric AvgLength(5); //均线周期
       Numeric AvgDisplace(5); //置换均线向后平移Bar数
       Numeric ValidBars1(5); //开仓先决条件之一(收盘价上穿DMA均线)条件值保持有效的BAR数
       Numeric ValidBars2(5); //开仓先决条件之二(上穿后再下穿)条件值保持有效的BAR数
       Numeric ValidBars3(5); //开仓先决条件(上穿再下穿再上穿)条件值保持有效的BAR数
       Numeric TrailStopBars(5); //多少根BAR的最低价作为跟踪止损价
    Vars
       Numeric ConCrossOver; //当前BAR是否上穿DMA
       Numeric ConCrossUnder; //当前BAR是否下穿DMA
       Numeric BarsLastCrsUndL; //多头最近一次下穿离现在的BAR数
       Numeric BarsFstCrsOvrL; //多头最近倒数第二次上穿离现在的BAR数
       Numeric BarsSecCrsOvrL; //多头最近的一次上穿离现在的BAR数
       Numeric BarsLastCrsOvrS; //空头最近一次上穿离现在的BAR数
       Numeric BarsFstCrsUndS; //空头最近倒数第二次下穿离现在的BAR数
       Numeric BarsSecCrsUndS; //空头最近的一次下穿离现在的BAR数
       Numeric ReversalPriceL; //多头趋势反向的平仓价格
       Numeric TrailStopPriceL; //多头跟踪止损的平仓价格
       Numeric ReversalPriceS; //空头趋势反向的平仓价格
       Numeric TrailStopPriceS; //开工跟踪止损的平仓价格
       NumericSeries MA1; //均线
       NumericSeries DMA1; //置换均线
       NumericSeries EntryFlagL; //多头开仓标志
       NumericSeries EntryPointL; //多头突破开仓的价格
       NumericSeries EntryCountL; //多头满足开仓先决条件的BAR计数
       NumericSeries EntryFlagS; //空头开仓标志
       NumericSeries EntryPointS; //空头突破开仓的价格
       NumericSeries EntryCountS; //空头满足开仓先决条件的BAR计数
       Numeric N; //下单手数
       Numeric SH; //上海合约标志
       Numeric RLP,FLP; //涨跌停价
       Numeric BIDP,ASKP; //买卖一价
       Numeric BRP0,BRP1,BRP; //多头可用持仓
       Numeric SRP0,SRP1,SRP; //空头可用持仓
       Numeric OPFLG; //模型处理标志
       Numeric JLFLG; //平今平老标志
       Numeric BKDFLG; //买开处理标志
       Numeric SKDFLG; //卖开处理标志
       Numeric BPDFLG; //买平处理标志
       Numeric SPDFLG; //卖平处理标志
       Global_Numeric BKID,SKID; //开仓委托
       Global_Numeric BKFLG,SKFLG; //开仓标志
       Global_Numeric BKM,SKM; //开仓委托手数
       Global_Numeric BKP,SKP; //开仓委托价格
       Global_Numeric BPID0,BPID1,BPID; //买平委托
       Global_Numeric SPID0,SPID1,SPID; //卖平委托
       Global_Numeric BPFLG0,BPFLG1,BPFLG; //买平标志
       Global_Numeric SPFLG0,SPFLG1,SPFLG; //卖平标志
       Global_Numeric BPM0,BPM1,BPM; //买平委托手数
       Global_Numeric SPM0,SPM1,SPM; //卖平委托手数
       Global_Numeric BPP0,BPP1,BPP; //买平委托价格
       Global_Numeric SPP0,SPP1,SPP; //卖平委托价格
    Begin
       //------------------------信号发出------------------------//
       If(1) //信号发出
       {
          //计算置换均线
          MA1 = Ma(Close,AvgLength);
          DMA1 = MA1[AvgDisplace];
          PlotNumeric("DMA",DMA1);
          //判断收盘价是否穿越置换均线
          ConCrossOver = CrossUp(Close,DMA1);
          ConCrossUnder = CrossDown(Close,DMA1);
          //多头计算最近的一次下穿发生的BAR离当前BAR的根数
          BarsLastCrsUndL = BarsLast(ConCrossUnder == 1);
          //空头计算最近的一次上穿发生的BAR离当前BAR的根数
          BarsLastCrsOvrS = BarsLast(ConCrossOver == 1);
          //多头 计算最近的两次上穿发生的BAR离当前BAR的根数
          BarsFstCrsOvrL = SumBars(ConCrossOver == 1,2) - 1;
          BarsSecCrsOvrL = BarsLast(ConCrossOver == 1);
          //空头计算最近的两次下穿发生的BAR离当前BAR的根数
          BarsFstCrsUndS = SumBars(ConCrossUnder == 1,2) - 1;
          BarsSecCrsUndS = BarsLast(ConCrossUnder == 1);
          //设置多头开仓标志
          If(ConCrossOver == 1 && BarsLastCrsUndL - BarsSecCrsOvrL <= ValidBars2 && BarsFstCrsOvrL - BarsLastCrsUndL <= ValidBars1)
          {
             EntryFlagL = 1;
             EntryPointL = High + MinMove * PriceScale;
             EntryCountL = 0;
          }
          //设置空头开仓标志
          If(ConCrossUnder == 1 && BarsLastCrsOvrS - BarsSecCrsUndS <= ValidBars2 && BarsFstCrsUndS - BarsLastCrsOvrS <= ValidBars1)
          {
             EntryFlagS = 1;
             EntryPointS = Low - MinMove * PriceScale;
             EntryCountS = 0;
          }
          //多头开仓
          If(MarketPosition == 0 && EntryCountL <= ValidBars3)
          {
             If(EntryFlagL == 1 && High >= EntryPointL && Vol > 0)
             {
                BK(DefaultVol,Max(Open,EntryPointL));
             }
             Else
             {
                EntryCountL = EntryCountL + 1;
             }
          }
          //空头开仓
          If(MarketPosition == 0 && EntryCountS <= ValidBars3)
          {
             If(EntryFlagS == 1 && Low <= EntryPointS && Vol > 0)
             {
                SK(DefaultVol,Min(Open,EntryPointS));
             }
             Else
             {
                EntryCountS = EntryCountS + 1;
             }
          }
          //多头开仓或者开仓先决条件已过有效BAR数,修改开仓标志
          If(MarketPosition == 1 || EntryCountL > ValidBars3)
          {
             EntryFlagL = 0;
          }
          //多头止损价格计算
          ReversalPriceL = DMA1[1] - MinMove * PriceScale;
          TrailStopPriceL = LLV(Low[1],TrailStopBars);
          //空头开仓或者开仓先决条件已过有效BAR数,修改开仓标志
          If(MarketPosition == -1 || EntryCountS > ValidBars3)
          {
             EntryFlagS = 0;
          }
          //空头止损价格计算
          ReversalPriceS = DMA1[1] + MinMove * PriceScale;
          TrailStopPriceS = HHV(High[1],TrailStopBars);
          //多头平仓
          If(MarketPosition == 1 && BarsSinceEntry > 0 && Vol > 0)
          {
             If(Low <= Max(ReversalPriceL,TrailStopPriceL))
             {
                SP(DefaultVol,Min(Open,Max(ReversalPriceL,TrailStopPriceL)));
             }
          }
          //空头平仓
          If(MarketPosition == -1 && BarsSinceEntry > 0 && Vol > 0)
          {
             If(High >= Min(ReversalPriceS,TrailStopPriceS))
             {
                BP(DefaultVol,Max(Open,Min(ReversalPriceS,TrailStopPriceS)));
             }
          }
       }
       //------------------------处理开启------------------------//
       If(A_IsExchangeOpen() == 1) //如果是开盘状态
       {
          If(BarStatus() == 2) //如果不带入历史值
          {
             If(RunStart() == 1) //如果已初始化成功
             {
                OPFLG = 1; //开启模型处理
             }
          }
       }
       //------------------------变量赋值------------------------//
       If(OPFLG == 1) //变量赋值
       {
          N = 1; //下单手数
          JLFLG = 1; //平今平老标志(1-优先平今/0-优先平老)
          BIDP = Price("Bid1"); //买一价
          ASKP = Price("Ask1"); //卖一价
          RLP = Price("RiseLimit"); //涨停价
          FLP = Price("FallLimit"); //跌停价
          SH = A_IsSHCode(); //上海合约标志
          BRP = F_BuyRemainPosition(); //多头可用持仓
          SRP = F_SellRemainPosition(); //空头可用持仓
          BRP = Min(BRP,A_BuyRemainPosition()); //多头可用持仓
          SRP = Min(SRP,A_SellRemainPosition()); //空头可用持仓
          If(SH == 1) //如果是上期所合约
          {
             BRP0 = A_TodayBuyRemainPosition(); //多头今仓可用持仓
             SRP0 = A_TodaySellRemainPosition(); //空头今仓可用持仓
             BRP1 = BRP - BRP0; //多头老仓可用持仓
             SRP1 = SRP - SRP0; //空头老仓可用持仓
          }
       }
       //------------------------信号处理------------------------//
       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
             }
          }
          If(SH == 1) //如果是上期所合约
          {
             If(SPFLG0 == 1) //如果有卖平今仓委托
             {
                If(F_OrderStatus(SPID0) == Enum_Filled) //如果卖平今仓委托成交
                {
                   Commentary("【SP信号:卖平今仓委托成交!】");
                   SPFLG0 = 0; //卖平今仓标志归0
                }
             }
             If(SPFLG1 == 1) //如果有卖平老仓委托
             {
                If(F_OrderStatus(SPID1) == Enum_Filled) //如果卖平老仓委托成交
                {
                   Commentary("【SP信号:卖平老仓委托成交!】");
                   SPFLG1 = 0; //卖平老仓标志归0
                }
             }
          }
          Else //如果非上期所合约
          {
             If(SPFLG == 1) //如果有卖平委托
             {
                If(F_OrderStatus(SPID) == Enum_Filled) //如果卖平委托成交
                {
                   Commentary("【SP信号:卖平委托成交!】");
                   SPFLG = 0; //卖平标志归0
                }
             }
          }
          If(SKFLG == 1) //如果有卖开委托
          {
             If(F_OrderStatus(SKID) == Enum_Filled) //如果卖开委托成交
             {
                Commentary("【SK信号:卖开委托成交!】");
                SKFLG = 0; //卖开标志归0
             }
          }
          If(SH == 1) //如果是上期所合约
          {
             If(BPFLG0 == 1) //如果有买平今仓委托
             {
                If(F_OrderStatus(BPID0) == Enum_Filled) //如果买平今仓委托成交
                {
                   Commentary("【BP信号:买平今仓委托成交!】");
                   BPFLG0 = 0; //买平今仓标志归0
                }
             }
             If(BPFLG1 == 1) //如果有买平老仓委托
             {
                If(F_OrderStatus(BPID1) == Enum_Filled) //如果买平老仓委托成交
                {
                   Commentary("【BP信号:买平老仓委托成交!】");
                   BPFLG1 = 0; //买平老仓标志归0
                }
             }
          }
          Else //如果非上期所合约
          {
             If(BPFLG == 1) //如果有买平委托
             {
                If(F_OrderStatus(BPID) == Enum_Filled) //如果买平委托成交
                {
                   Commentary("【BP信号:买平委托成交!】");
                   BPFLG = 0; //买平标志归0
                }
             }
          }
       }
       //------------------------委托处理------------------------//
       If(OPFLG == 1) //委托处理
       {
          If(BKDFLG == 1) //如果已开启买开处理
          {
             If(BKFLG == 0) //如果没有买开委托
             {
                BKM = N; //买开委托手数
                BKP = ASKP; //买开委托价格
                Commentary("【BK信号:买开委托发出!】");
                BKID = A_SendOrder(Enum_Buy,Enum_Entry,BKM,BKP); //发出买开委托
                BKFLG = 1; //已发出买开委托
             }
          }
          If(SPDFLG == 1) //如果已开启卖平处理
          {
             If(SPFLG0 == 0 && SPFLG1 == 0 && SPFLG == 0) //如果没有卖平委托
             {
                If(BRP > 0) //如果有多头可用持仓
                {
                   If(SH == 1) //如果是上期所合约
                   {
                      If(JLFLG == 1) //如果是优先平今
                      {
                         If(BRP0 > 0) //如果有多头今仓可用持仓
                         {
                            SPM0 = Min(BRP0,BRP); //卖平今仓委托手数
                            SPM1 = Min(BRP1,BRP - SPM0); //卖平老仓委托手数
                            SPP0 = FLP; //卖平今仓委托价格
                            Commentary("【SP信号:卖平今仓委托发出!】");
                            SPID0 = A_SendOrder(Enum_Sell,Enum_ExitToday,SPM0,SPP0); //发出卖平今仓委托
                            SPFLG0 = 1; //已发出卖平今仓委托
                         }
                         Else If(BRP0 == 0) //如果没有多头今仓可用持仓
                         {
                            SPM1 = Min(BRP1,BRP); //卖平老仓委托手数
                         }
                         If(BRP1 > 0 && SPM1 > 0) //如果有多头老仓可用持仓,且卖平老仓委托手数大于0
                         {
                            SPP1 = FLP; //卖平老仓委托价格
                            Commentary("【SP信号:卖平老仓委托发出!】");
                            SPID1 = A_SendOrder(Enum_Sell,Enum_Exit,SPM1,SPP1); //发出卖平老仓委托
                            SPFLG1 = 1; //已发出卖平老仓委托
                         }
                      }
                      Else If(JLFLG == 0) //如果是优先平老
                      {
                         If(BRP1 > 0) //如果有多头老仓可用持仓
                         {
                            SPM1 = Min(BRP1,BRP); //卖平老仓委托手数
                            SPM0 = Min(BRP0,BRP - SPM1); //卖平今仓委托手数
                            SPP1 = FLP; //卖平老仓委托价格
                            Commentary("【SP信号:卖平老仓委托发出!】");
                            SPID1 = A_SendOrder(Enum_Sell,Enum_Exit,SPM1,SPP1); //发出卖平老仓委托
                            SPFLG1 = 1; //已发出卖平老仓委托
                         }
                         Else If(BRP1 == 0) //如果没有多头老仓可用持仓
                         {
                            SPM0 = Min(BRP0,BRP); //卖平今仓委托手数
                         }
                         If(BRP0 > 0 && SPM0 > 0) //如果有多头今仓可用持仓,且卖平今仓委托手数大于0
                         {
                            SPP0 = FLP; //卖平今仓委托价格
                            Commentary("【SP信号:卖平今仓委托发出!】");
                            SPID0 = A_SendOrder(Enum_Sell,Enum_ExitToday,SPM0,SPP0); //发出卖平今仓委托
                            SPFLG0 = 1; //已发出卖平今仓委托
                         }
                      }
                   }
                   Else //如果非上期所合约
                   {
                      SPM = BRP; //卖平委托手数
                      SPP = FLP; //卖平委托价格
                      Commentary("【SP信号:卖平委托发出!】");
                      SPID = A_SendOrder(Enum_Sell,Enum_Exit,SPM,SPP); //发出卖平委托
                      SPFLG = 1; //已发出卖平委托
                   }
                }
             }
          }
          If(SKDFLG == 1) //如果已开启卖开处理
          {
             If(SKFLG == 0) //如果没有卖开委托
             {
                SKM = N; //卖开委托手数
                SKP = BIDP; //卖开委托价格
                Commentary("【SK信号:卖开委托发出!】");
                SKID = A_SendOrder(Enum_Sell,Enum_Entry,SKM,SKP); //发出卖开委托
                SKFLG = 1; //已发出卖开委托
             }
          }
          If(BPDFLG == 1) //如果已开启买平处理
          {
             If(BPFLG0 == 0 && BPFLG1 == 0 && BPFLG == 0) //如果没有买平委托
             {
                If(SRP > 0) //如果有空头可用持仓
                {
                   If(SH == 1) //如果是上期所合约
                   {
                      If(JLFLG == 1) //如果是优先平今
                      {
                         If(SRP0 > 0) //如果有空头今仓可用持仓
                         {
                            BPM0 = Min(SRP0,SRP); //买平今仓委托手数
                            BPM1 = Min(SRP1,SRP - BPM0); //买平老仓委托手数
                            BPP0 = RLP; //买平今仓委托价格
                            Commentary("【BP信号:买平今仓委托发出!】");
                            BPID0 = A_SendOrder(Enum_Buy,Enum_ExitToday,BPM0,BPP0); //发出买平今仓委托
                            BPFLG0 = 1; //已发出买平今仓委托
                         }
                         Else If(SRP0 == 0) //如果没有空头今仓可用持仓
                         {
                            BPM1 = Min(SRP1,SRP); //买平老仓委托手数
                         }
                         If(SRP1 > 0 && BPM1 > 0) //如果有空头老仓可用持仓,且买平老仓委托手数大于0
                         {
                            BPP1 = RLP; //买平老仓委托价格
                            Commentary("【BP信号:买平老仓委托发出!】");
                            BPID1 = A_SendOrder(Enum_Buy,Enum_Exit,BPM1,BPP1); //发出买平老仓委托
                            BPFLG1 = 1; //已发出买平老仓委托
                         }
                      }
                      Else If(JLFLG == 0) //如果是优先平老
                      {
                         If(SRP1 > 0) //如果有空头老仓可用持仓
                         {
                            BPM1 = Min(SRP1,SRP); //买平老仓委托手数
                            BPM0 = Min(SRP0,SRP - BPM1); //买平今仓委托手数
                            BPP1 = RLP; //买平老仓委托价格
                            Commentary("【BP信号:买平老仓委托发出!】");
                            BPID1 = A_SendOrder(Enum_Buy,Enum_Exit,BPM1,BPP1); //发出买平老仓委托
                            BPFLG1 = 1; //已发出买平老仓委托
                         }
                         Else If(SRP1 == 0) //如果没有空头老仓可用持仓
                         {
                            BPM0 = Min(SRP0,SRP); //买平今仓委托手数
                         }
                         If(SRP0 > 0 && BPM0 > 0) //如果有空头今仓可用持仓,且买平今仓委托手数大于0
                         {
                            BPP0 = RLP; //买平今仓委托价格
                            Commentary("【BP信号:买平今仓委托发出!】");
                            BPID0 = A_SendOrder(Enum_Buy,Enum_ExitToday,BPM0,BPP0); //发出买平今仓委托
                            BPFLG0 = 1; //已发出买平今仓委托
                         }
                      }
                   }
                   Else //如果非上期所合约
                   {
                      BPM = SRP; //买平委托手数
                      BPP = RLP; //买平委托价格
                      Commentary("【BP信号:买平委托发出!】");
                      BPID = A_SendOrder(Enum_Buy,Enum_Exit,BPM,BPP); //发出买平委托
                      BPFLG = 1; //已发出买平委托
                   }
                }
             }
          }
       }
    End
    热帖

    全部评论/0 条

    本版积分规则

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

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