wh9 k线策略模型:基于ADX及EMA的交易系统策略公式 [复制链接]

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

    wh9 k线模型:基于ADX及EMA的交易系统策略公式

    策略公式源码如下:
    Params
       Numeric DMI_N(14); //DMI的N值
       Numeric DMI_M(30); //DMI的M值(ADX均线周期)
       Numeric AvgLen(30); //最高最低价的EMA周期数
       Numeric EntryBar(2); //保持BuySetup触发BAR数
    Vars
       Numeric X;
       Numeric PlusDM;
       Numeric MinusDM;
       Numeric UpperMove;
       Numeric LowerMove;
       Numeric SumPlusDM;
       Numeric SumMinusDM;
       Numeric SumTR;
       Numeric SF; //Smoothing Factor
       Numeric Divisor;
       Numeric BuySetup; //买入条件
       Numeric SellSetup; //卖出条件
       NumericSeries ODMIPlus;
       NumericSeries ODMIMinus;
       NumericSeries ODMI;
       NumericSeries OADX;
       NumericSeries OADXR;
       NumericSeries OVolty;
       NumericSeries SDMI;
       NumericSeries SADX;
       NumericSeries Cumm;
       NumericSeries SVolty;
       NumericSeries AvgPlusDM;
       NumericSeries AvgMinusDM;
       NumericSeries TRValue; //真实高点和真实低点的差值
       NumericSeries UpperMA; //计算30根K线最高价的EMA
       NumericSeries LowerMA; //计算30根K线最低价的EMA
       NumericSeries ADXValue; //计算ADX均线 
       NumericSeries ChanSpread; //通过EMA计算出通道宽度
       NumericSeries BuyTarget; //多头触发价
       NumericSeries SellTarget; //空头触发价
       NumericSeries MROBS; //上一次买入条件到现在的周期数
       NumericSeries MROSS; //上一次卖出条件到现在的周期数
       Numeric N; //下单手数
       Numeric SH; //平仓参数
       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 BKM,SKM; //开仓委托手数
       Global_Numeric BPM,SPM; //平仓委托手数
       Global_Numeric BKP,SKP; //开仓委托价格
       Global_Numeric BPP,SPP; //平仓委托价格
    Begin
       //------------------------信号发出------------------------//
       If(1) //信号发出
       {
          //DMI计算开始
          SF = 1 / DMI_N;
          TRValue = TrueRange; //真实高点和真实低点的差值
          If(CurrentBar == DMI_N) //当根K线是第DMI_N根
          {
             For X = 0 To DMI_N - 1
             {
                PlusDM = 0;
                MinusDM = 0;
                UpperMove = High[X] - High[X + 1]; //高点差值
                LowerMove = Low[X + 1] - Low[X]; //低点差值
                If(UpperMove > LowerMove && UpperMove > 0) //高点差值大于低点差值且大于0
                {
                   PlusDM = UpperMove; //取高点差值
                }
                Else If(LowerMove > UpperMove && LowerMove > 0) //低点差值大于高点差值且大于0
                {
                   MinusDM = LowerMove; //取低点差值
                }
                SumPlusDM = SumPlusDM + PlusDM; //高点差值的和
                SumMinusDM = SumMinusDM + MinusDM; //低点差值的和
                SumTR = SumTR + TRValue[X]; //真实高点和低点差值的和
             }
             AvgPlusDM = SumPlusDM / DMI_N;
             AvgMinusDM = SumMinusDM / DMI_N;
             SVolty = SumTR / DMI_N;
          }
          Else If(CurrentBar > DMI_N) //当根K线大于DMI_N根
          {
             PlusDM = 0;
             MinusDM = 0;
             UpperMove = High - High[1]; //高点差值
             LowerMove = Low[1] - Low; //低点差值
             If(UpperMove > LowerMove && UpperMove > 0) //高点差值大于低点差值且大于0
             {
                PlusDM = UpperMove; //取高点差值
             }
             Else If(LowerMove > UpperMove && LowerMove > 0) //低点差值大于高点差值且大于0
             {
                MinusDM = LowerMove; //取低点差值
             }
             AvgPlusDM = AvgPlusDM[1] + SF * (PlusDM - AvgPlusDM[1]);
             AvgMinusDM = AvgMinusDM[1] + SF * (MinusDM - AvgMinusDM[1]);
             SVolty = SVolty[1] + SF * (TRValue - SVolty[1]);
          }
          Else
          {
             ODMIPlus = InvalidNumeric;
             ODMIMinus = InvalidNumeric;
             ODMI = InvalidNumeric;
             OADX = InvalidNumeric;
             OADXR = InvalidNumeric;
             OVolty = InvalidNumeric;
          }
          If(SVolty > 0)
          {
             ODMIPlus = 100 * AvgPlusDM / SVolty;
             ODMIMinus = 100 * AvgMinusDM / SVolty;
          }
          Else
          {
             ODMIPlus = 0;
             ODMIMinus = 0;
          }
          Divisor = ODMIPlus + ODMIMinus;
          If(Divisor > 0)
          {
             SDMI = 100 * Abs(ODMIPlus - ODMIMinus) / Divisor;
          }
          Else
          {
             SDMI = 0;
          }
          Cumm = Cum(SDMI);
          If(CurrentBar > 0)
          {
             If(CurrentBar <= DMI_N)
             {
                SADX = Cumm / CurrentBar;
                OADXR = (SADX + SADX[CurrentBar - 1]) * 0.5;
             }
             Else
             {
                SADX = SADX[1] + SF * (SDMI - SADX[1]);
                OADXR = (SADX + SADX[DMI_M - 1]) * 0.5;
             }
          }
          OVolty = SVolty;
          ODMI = SDMI;
          OADX = SADX;
          //DMI计算结束
          ADXValue = OADX; //计算ADX均线
          UpperMA = Ema(High,AvgLen); //计算30根K线最高价的EMA
          LowerMA = Ema(Low,AvgLen); //计算30根K线最低价的EMA
          ChanSpread = (UpperMA - LowerMA) / 2; //通过EMA计算出噪音通道宽度
          BuySetup = Close > UpperMA && ADXValue > ADXValue[1]; //买入条件
          SellSetup = Close < LowerMA && ADXValue > ADXValue[1]; //卖出条件
          If(BuySetup == 1)
          {
             BuyTarget = Close + ChanSpread; //多头触发价
          }
          MROBS = BarsLast(BuySetup); //上次满足买入条件距离当前BAR的数目 
          If(MROBS > EntryBar) //如果距离上次买入条件超过EntryBar
          {
             MROBS = 0;
          }
          //多头系统入场
          //满足买入条件后EntryBar内,且大于等于买入多头触发价,多单入场
          If(MROBS[1] <> 0 && MarketPosition == 0 && CurrentBar > 100)
          {
             If(High >= BuyTarget[1] && Vol > 0)
             {
                BK(DefaultVol,Max(Open,BuyTarget[1]));
             }
          }
          //多头系统出场
          //当持有多单且当前价格下破30根K线最高价的EMA,多单出场
          If(MarketPosition == 1 && BarsSinceEntry > 0 && Vol > 0)
          {
             If(Low <= UpperMA[1] - MinPrice)
             {
                SP(DefaultVol,Min(Open,UpperMA[1] - MinPrice));
             }
          }
          If(SellSetup == 1) //如果满足卖出条件
          {
             SellTarget = Close - ChanSpread; //空头触发价
          }
          MROSS = BarsLast(SellSetup); //上次满足卖出条件距离当前BAR的数目
          If(MROSS > EntryBar) //距离上次卖出条件超过EntryBar
          {
             MROSS = 0;
          }
          //空头系统入场
          //满足卖出条件后EntryBar内,且小于等于空头触发价,空单入场 
          If(MROSS[1] <> 0 && MarketPosition == 0 && CurrentBar > 100)
          {
             If(Low <= SellTarget[1] && Vol > 0)
             {
                SK(DefaultVol,Min(Open,SellTarget[1]));
             }
          }
          //空头系统出场
          //当持有空单且当前价格上破30根K线最低价的EMA,多单出场
          If(MarketPosition == -1 && BarsSinceEntry > 0 && Vol > 0)
          {
             If(High >= LowerMA[1] + MinPrice)
             {
                BP(DefaultVol,Max(Open,LowerMA[1] + MinPrice));
             }
          }
       }
       //------------------------处理开启------------------------//
       If(A_IsExchangeOpen() == 1) //如果是开盘状态
       {
          If(BarStatus() == 2) //如果不带入历史值
          {
             If(RunStart() == 1) //如果已初始化成功
             {
                OPFLG = 1; //开启模型处理
             }
          }
       }
       //------------------------变量赋值------------------------//
       If(OPFLG == 1) //变量赋值
       {
          N = 1; //下单手数
          BIDP = Price("Bid1"); //买一价
          ASKP = Price("Ask1"); //卖一价
          RLP = Price("RiseLimit"); //涨停价
          FLP = Price("FallLimit"); //跌停价
          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
             }
          }
          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(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(SPFLG == 0) //如果没有卖平委托
             {
                If(BRP > 0) //如果有多头可用持仓
                {
                   SPM = BRP; //卖平委托手数
                   SPP = FLP; //卖平委托价格
                   Commentary("【SP信号:卖平委托发出!】");
                   SPID = A_SendOrder(Enum_Sell,SH,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(BPFLG == 0) //如果没有买平委托
             {
                If(SRP > 0) //如果有空头可用持仓
                {
                   BPM = SRP; //买平委托手数
                   BPP = RLP; //买平委托价格
                   Commentary("【BP信号:买平委托发出!】");
                   BPID = A_SendOrder(Enum_Buy,SH,BPM,BPP); //发出买平委托
                   BPFLG = 1; //已发出买平委托
                }
             }
          }
       }
    End
    热帖

    全部评论/0 条

    本版积分规则

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

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