wh9 k线策略模型:基于均线交叉的通道突破交易系统策略公式 [复制链接]

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

    wh9 k线策略模型:基于均线交叉的通道突破交易系统策略公式

    公式源码如下:
    Params
       Numeric FastLen(9); //快速均线周期数
       Numeric SlowLen(18); //慢速均线周期数
       Numeric ChLen(12); //通道突破的周期数
       Numeric ExtraPercentage(300); //通道突破的幅度(万分比),如:300 = 3%
       Numeric TrailBar(8); //多少根BAR的最低价作为跟踪止损价
       Numeric InitialLots(DefaultVol); //初始进场头寸
       Numeric ReBars(15); //再进场必须在出场后多少根BAR内
       Numeric ReEntryChLen(10); //再进场通道突破的周期数
       Numeric ReEntryLots(0); //再进场头寸
    Vars
       Numeric HH; //最近N根BAR的高点
       Numeric LL; //最近N根BAR的低点
       NumericSeries FastMA; //快速均线
       NumericSeries SlowMA; //慢速均线
       NumericSeries ConCrossOver; //是否金叉(快速均线上穿慢速均线)
       NumericSeries ConCrossUnder; //是否死叉(快速均线下穿慢速均线)
       NumericSeries LEntryPrice; //开多的突破价
       NumericSeries SEntryPrice; //开空的突破价
       NumericSeries LCount; //均线金叉后记录BAR序号
       NumericSeries SCount; //均线死叉后记录BAR序号
       NumericSeries TrailStopPriceL; //多头跟踪止损的止损价
       NumericSeries TrailStopPriceS; //空头跟踪止损的止损价
       NumericSeries ReEntryPriceL; //多头再进场突破开仓的价格
       NumericSeries ReEntryPriceS; //空头再进场突破开仓的价格
       NumericSeries ReEntryCountL; //跟踪止损后记录BAR序号
       NumericSeries ReEntryCountS; //跟踪止损后记录BAR序号
       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) //信号发出
       {
          //计算均线
          FastMA = Average(Close,FastLen);
          SlowMA = Average(Close,SlowLen);
          PlotNumeric("FastMA",FastMA);
          PlotNumeric("SlowMA",SlowMA);
          //判断均线是否金叉
          ConCrossOver = CrossUp(FastMA,SlowMA);
          //判断均线是否死叉
          ConCrossUnder = CrossDown(FastMA,SlowMA);
          //金叉发生时记录最近Chlen根Bar的高点加上ExtraPercentage%作为开多突破价
          HH = Highest(High,ChLen);
          If(ConCrossOver == 1 && CurrentBar >= ChLen - 1)
          {
             LEntryPrice = HH * (1 + ExtraPercentage * 0.0001);
             //记录BAR序号以控制只在金叉后Chlen根BAR内进场否则放弃本次交易
             LCount = CurrentBar;
          }
          //多头开仓
          If(MarketPosition == 0 && CurrentBar > LCount && CurrentBar <= LCount + Chlen && High >= LEntryPrice && Vol > 0)
          {
             BK(InitialLots,Max(Open,LEntryPrice));
             Commentary("初次多");
             //修改LCount值以保证每次金叉后只初始进场一次
             LCount = -999;
          }
          //死叉发生时记录最近Chlen根Bar的低点减去ExtraPercentage%作为开空突破价
          LL = LLV(Low,ChLen);
          If(ConCrossUnder == 1 && CurrentBar >= ChLen-1)
          {
             SEntryPrice = LL * (1 - ExtraPercentage * 0.0001);
             //记录BAR序号以控制只在死叉后Chlen根BAR内进场否则放弃本次交易
             SCount = CurrentBar;
          }
          //空头开仓
          If(MarketPosition == 0 && CurrentBar > SCount && CurrentBar <= SCount + Chlen && Low <= SEntryPrice && Vol > 0)
          {
             SK(InitialLots,Min(Open,SEntryPrice));
             //修改SCount值以保证每次死叉后只初始进场一次
             SCount = -999;
          }
          //多头判断趋势是否反转
          ConCrossUnder = CrossDown(FastMA,SlowMA);
          //死叉发生时记录最近Chlen根Bar的低点减去ExtraPercentage%%作为开空突破价
          //因多空策略分开,做多策略只考虑平仓,空头开仓由做空策略处理
          LL = Lowest(Low,ChLen);
          If(ConCrossUnder == 1 && CurrentBar >= ChLen-1)
          {
             SEntryPrice = LL * (1 - ExtraPercentage * 0.0001);
             //记录BAR序号以控制只在死叉后Chlen根BAR内突破有效
             SCount = CurrentBar;
          }
          //多头反向突破
          If(CurrentBar > SCount && CurrentBar <= SCount + Chlen && Low <= SEntryPrice && Vol > 0)
          {
             //有持仓则平仓
             If(MarketPosition == 1)
             {
                SP(DefaultVol,Min(Open,SEntryPrice));
                Commentary("多单反向出场");
             }
             //反向后原趋势结束
             LCount = -999;
             ReEntryCountL = -999;
          }
          //空头判断趋势是否反转
          ConCrossOver = CrossUp(FastMA,SlowMA);
          //金叉发生时记录最近Chlen根Bar的高点加上ExtraPercentage%%作为开多突破价
          //因多空策略分开,做空策略只考虑平仓,多头开仓由做多策略处理
          HH = HHV(High,ChLen);
          If(ConCrossOver == 1 && CurrentBar >= ChLen - 1)
          {
             LEntryPrice = HH * (1 + ExtraPercentage * 0.01);
             //记录BAR序号以控制只在金叉后Chlen根BAR内突破有效
             LCount = CurrentBar;
          }
          //空头反向突破
          If(CurrentBar > LCount && CurrentBar <= LCount + Chlen && High >= LEntryPrice && Vol > 0)
          {
             //有持仓则平仓
             If(MarketPosition == -1)
             {
                BP(DefaultVol,Max(Open,LEntryPrice));
             }
             //反向后原有趋势结束
             SCount = -999;
             ReEntryCountS = -999;
          }
          //多头跟踪止损出场
          //计算止损位
          TrailStopPriceL = Lowest(Low[1],TrailBar);
          //空头跟踪止损出场
          //计算止损位
          TrailStopPriceS = HHV(High[1],TrailBar);
          //计算最近ReEntryChLen根BAR的高点
          HH = Highest(High,ReEntryChLen);
          //计算最近ReEntryChLen根BAR的低点
          LL = Lowest(Low,ReEntryChLen);
          //多头触发止损
          If(MarketPosition == 1 && BarsSinceEntry > 0 && Vol > 0)
          {
             If(Low <= TrailStopPriceL)
             {
                SP(DefaultVol,Min(Open,TrailStopPriceL));
                Commentary("多单跟踪止损出场");
                //跟踪止损后记录BAR序号准备再进场
                ReEntryCountL = CurrentBar;
                //以ReEntryChLen周期高点作为再进场突破价
                ReEntryPriceL = HH;
             }
          }
          //多头出场后在ReBAR根BAR内,价格突破再进场突破价进场
          If(MarketPosition == 0 && BarsSinceExit > 0 && CurrentBar <= ReEntryCountL + ReBars && Vol > 0)
          {
             If(High >= ReEntryPriceL)
             {
                BK(ReEntryLots,Max(Open,ReEntryPriceL));
                Commentary("再次多");
             }
          }
          //空头触发止损
          If(MarketPosition == -1 && BarsSinceEntry > 0 && Vol > 0)
          {
             If(High >= TrailStopPriceS)
             {
                BP(DefaultVol,Max(Open,TrailStopPriceS));
                //跟踪止损后记录BAR序号准备再进场
                ReEntryCountS = CurrentBar;
                //以ReEntryChLen周期低点作为再进场突破价
                ReEntryPriceS = LL;
             }
          }
          //空头出场后在ReBAR根BAR内,价格突破再进场突破价进场
          If(MarketPosition == 0 && BarsSinceExit > 0 && CurrentBar <= ReEntryCountS + ReBars && Vol > 0)
          {
             If(Low <= ReEntryPriceS)
             {
                SK(ReEntryLots,Min(Open,ReEntryPriceS));
             }
          }
       }
       //------------------------处理开启------------------------//
       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 条

    本版积分规则

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

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