wh9 k线策略模型:基于MACD 判断的交易系统策略公式 [复制链接]

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

    wh9 k线策略模型:基于MACD 判断的交易系统策略公式

    策略公式源码:
    Params
       Numeric FastMA(4); //MACD短周期值
       Numeric SlowMA(10); //MACD长周期值
       Numeric AvgMA(16); //MACD慢线周期值
       Numeric ATRLen(10); //ATR周期值
       Numeric EATRPcnt(1); //入场通道波动率过滤数值
       Numeric XATRPcnt(1); //出场通道波动率过滤数值
    Vars
       Numeric Con1; //上穿条件
       Numeric Con2; //下穿条件
       NumericSeries MACDLine; //MACD快线
       NumericSeries SignalLine; //MACD慢线
       NumericSeries ZeroLine; //0轴
       NumericSeries AATR; //ATR波动率
       NumericSeries UpTrend; //多头趋势变量
       NumericSeries DnTrend; //空头趋势变量
       NumericSeries BuySetup; //买入控制条件
       NumericSeries SellSetup; //卖出控制条件
       NumericSeries CTrendLow; //普通数值型序列变量
       NumericSeries CTrendHigh; //普通数值型序列变量
       NumericSeries SignalFlag; //普通数值型序列变量
       NumericSeries UpperBand; //买入触发价
       NumericSeries LowerBand; //卖出触发价
       NumericSeries ExitBand; //出场触发价
       Numeric N; //下单手数
       Numeric X; //循环变量
       Numeric FN; //分批批数
       Numeric SH; //平仓参数
       Numeric RLP,FLP; //涨跌停价
       Numeric BIDP,ASKP; //买卖一价
       Numeric BRP,SRP; //多空头可用持仓
       Numeric OPFLG; //模型处理标志
       Numeric BKDFLG; //买开处理标志
       Numeric SKDFLG; //卖开处理标志
       Numeric BPDFLG; //买平处理标志
       Numeric SPDFLG; //卖平处理标志
       Global_Numeric BPID,SPID; //平仓委托
       Global_Numeric BPFLG,SPFLG; //平仓标志
       Global_Numeric BPM,SPM; //平仓委托手数
       Global_Numeric BPP,SPP; //平仓委托价格
       Global_NumericArray BKID,SKID; //开仓委托
       Global_NumericArray BKFLG,SKFLG; //开仓标志
       Global_NumericArray BKM,SKM; //开仓委托手数
       Global_NumericArray BKP,SKP; //开仓委托价格
    Begin
       //------------------------信号发出------------------------//
       If(1) //信号发出
       {
          MACDLine = Ema(Close,FastMA)- Ema(Close,SlowMA); //计算MACD快线
          SignalLine = Ema(MACDLine,AvgMA); //计算MACD慢线
          AATR = AvgTrueRange(ATRLen); //计算ATR波动率
          ZeroLine = 0; //零轴
          Con1 = CrossUp(SignalLine,ZeroLine); //慢线上穿零轴
          If(Con1 == 1) //当慢线上穿零轴时候,定义为多头趋势
          {
             UpTrend = 1;
             SignalFlag = 0;
             DnTrend = 0;
             SellSetup = 0;
          }
          Con2 = CrossDown(SignalLine,ZeroLine); //慢线下穿零轴
          If(Con2 == 1) //当慢线下穿零轴时候,定义为空头趋势
          {
             UpTrend = 0;
             BuySetup = 0;
             SignalFlag = 0;
             DnTrend = 1;
          }
          If(UpTrend == 1) //多头趋势时记录当前最低价以及设置入场条件
          {
             If(SignalFlag == 0)
             {
                BuySetup = 1;
                CTrendLow = Low;
             }
             If(MACDLine < SignalLine && Low < CTrendLow[1]) //MACD均线空头排列时候,且当前价格更低时更新最低价
             {
                CTrendLow = Low;
             }
          }
          If(DnTrend ==1)
          {
             If(SignalFlag == 0) //空头趋势时记录当前最低价以及设置入场条件
             {
                SellSetup = 1;
                CTrendHigh = High;
             }
             If(MACDLine > SignalLine && High > CTrendHigh[1]) //当MACD均线多头排列时候,且当前价格更高时更新最高价
             {
                CTrendHigh = High;
             }
          }
          If(BuySetup[1] == 1 && BuySetup[2] == 0) //多头满足入场条件设定入场价格以及出场价格
          {
             UpperBand = Close[1] + (EATRPcnt * AATR[1]);
             ExitBand = Close[1] - (XATRPcnt * AATR[1]);
          }
          If(SellSetup[1] == 1 && SellSetup[2] == 0) //空头满足入场条件设定入场价格以及出场价格
          {
             LowerBand = Close[1] - (EATRPcnt * AATR[1]);
             ExitBand = Close[1] + (XATRPcnt * AATR[1]);
          }
          //多头系统入场
          If(BuySetup[1] == 1 && MarketPosition == 0) //做多
          {
             If(High >= UpperBand)
             {
                BK(DefaultVol,Max(Open,Upperband));
                BuySetup = 0; //持有多单时不再满足入场条件
                SignalFlag = 1;
             }
          }
          PlotNumeric("LowerBand",AATR);
          //空头系统入场
          If(SellSetup[1] == 1 && MarketPosition == 0) //做空
          {
             If(Low <= LowerBand)
             {
                SK(DefaultVol,Min(Open,LowerBand));
                SellSetup = 0; //持有空单时不再满足入场条件
                SignalFlag = 1;
             }
          }
          //多头系统出场
          If(MarketPosition == 1 && BarsSinceEntry > 0)
          {
             If(DnTrend[1] == 1) //多头趋势不在时,多头出场
             {
                SP(DefaultVol,Open);
             }
             Else If(Low <= CTrendLow[1] - MinPrice && CTrendLow[1] - MinPrice >= ExitBand) //持有多单后低于入场最低价格出场
             {
                SP(DefaultVol,Min(Open,CTrendLow[1] - MinPrice));
             }
             Else If(Low <= Exitband) //持有多单后低于出场价格出场
             {
                SP(DefaultVol,Min(Open,Exitband));
             }
          }
          //空头系统出场
          If(MarketPosition == -1 && BarsSinceEntry > 0)
          {
             If(UpTrend[1] == 1) //空头趋势不在时,空头出场
             {
                BP(DefaultVol,Open);
             }
             Else If(High >= CTrendHigh[1] + MinPrice && CTrendHigh[1] + MinPrice <= ExitBand) //持有空单后高于出场价格出场
             {
                BP(DefaultVol,Max(Open,CTrendHigh[1] + MinPrice));
             }
             Else If(High >= ExitBand) //持有多单后低于入场最低价格出场
             {
                BP(DefaultVol,Max(Open,ExitBand));
             }
          }
       }
       //------------------------处理开启------------------------//
       If(A_IsExchangeOpen() == 1) //如果是开盘状态
       {
          If(BarStatus() == 2) //如果不带入历史值
          {
             If(RunStart() == 1) //如果已初始化成功
             {
                OPFLG = 1; //开启模型处理
             }
          }
       }
       //------------------------变量赋值------------------------//
       If(OPFLG == 1) //变量赋值
       {
          N = 2; //下单手数
          FN = 3; //分批批数
          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) //成交判断
       {
          For X = 0 To FN - 1 //遍历分批批数
          {
             If(BKFLG[X] == 1) //如果有买开委托
             {
                If(F_OrderStatus(BKID[X]) == Enum_Filled) //如果买开委托成交
                {
                   Commentary("【BK信号:买开委托" + Text(X + 1) + "成交!】");
                   BKFLG[X] = 0; //买开标志归0
                }
             }
          }
          If(SPFLG == 1) //如果有卖平委托
          {
             If(F_OrderStatus(SPID) == Enum_Filled) //如果卖平委托成交
             {
                Commentary("【SP信号:卖平委托成交!】");
                SPFLG = 0; //卖平标志归0
             }
          }
          For X = 0 To FN - 1 //遍历分批批数
          {
             If(SKFLG[X] == 1) //如果有卖开委托
             {
                If(F_OrderStatus(SKID[X]) == Enum_Filled) //如果卖开委托成交
                {
                   Commentary("【SK信号:卖开委托" + Text(X + 1) + "成交!】");
                   SKFLG[X] = 0; //卖开标志归0
                }
             }
          }
          If(BPFLG == 1) //如果有买平委托
          {
             If(F_OrderStatus(BPID) == Enum_Filled) //如果买平委托成交
             {
                Commentary("【BP信号:买平委托成交!】");
                BPFLG = 0; //买平标志归0
             }
          }
       }
       //------------------------委托处理------------------------//
       If(OPFLG == 1) //委托处理
       {
          If(BKDFLG == 1) //如果已开启买开处理
          {
             For X = 0 To FN - 1 //遍历分批批数
             {
                If(BKFLG[X] == 0) //如果没有买开委托
                {
                   BKM[X] = N; //买开委托手数
                   BKP[X] = ASKP; //买开委托价格
                   Commentary("【BK信号:买开委托" + Text(X + 1) + "发出!】");
                   BKID[X] = A_SendOrder(Enum_Buy,Enum_Entry,BKM[X],BKP[X]); //发出买开委托
                   BKFLG[X] = 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) //如果已开启卖开处理
          {
             For X = 0 To FN - 1 //遍历分批批数
             {
                If(SKFLG[X] == 0) //如果没有卖开委托
                {
                   SKM[X] = N; //卖开委托手数
                   SKP[X] = BIDP; //卖开委托价格
                   Commentary("【SK信号:卖开委托" + Text(X + 1) + "发出!】");
                   SKID[X] = A_SendOrder(Enum_Sell,Enum_Entry,SKM[X],SKP[X]); //发出卖开委托
                   SKFLG[X] = 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 条

    本版积分规则

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

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