wh9 k线策略模型:基于K线建立箱体交易系统策略公式 [复制链接]

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

    wh9 k线策略模型:基于K线建立箱体交易系统策略公式

    策略公式源码如下:
    Params
       Numeric ATRLength(10); //ATR的值
       Numeric CancelFlagN(5); //用于计算取消区域成功设置标志的上下轨的N值
       Numeric ProtectStopATRMulti(5); //保护性止损的ATR乘数
       Numeric BreakEvenStopATRMulti(3); //盈亏平衡止损的ATR乘数
       Numeric ProfitTargetATRMulti(5); //盈利止盈的ATR乘数
    Vars
       Numeric ExitLineL; //平仓价格线
       Numeric ExitLineS; //平仓价格线
       Numeric BreakEvenStopL; //基于ATR的盈亏平衡止损
       Numeric BreakEvenStopS; //基于ATR的盈亏平衡止损
       NumericSeries ATR; //ATR
       NumericSeries UpLine; //区域设置上轨
       NumericSeries DownLine; //区域设置下轨
       NumericSeries DownLineTemp;
       NumericSeries UpLineTemp;
       NumericSeries HighAfterEntry; //持仓后的高点记录
       NumericSeries LowAfterEntry; //持仓后的低点记录
       NumericSeries EntryPriceL; //开仓价格线
       NumericSeries EntryPriceS; //开仓价格线
       NumericSeries EntryFlagL; //多头入场标志
       NumericSeries EntryFlagS; //空头入场标志
       NumericSeries ProtectStopL; //基于ATR的保护性止损
       NumericSeries ProtectStopS; //基于ATR的保护性止损
       NumericSeries ProfitTargetStopL; //基于ATR的盈利止盈
       NumericSeries ProfitTargetStopS; //基于ATR的盈利止盈
       NumericSeries MP; //MarketPosition的状态记录
       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) //信号发出
       {
          //系统A设置
          ATR = AvgTrueRange(ATRLength);
          DownLineTemp = LV(Low,CancelFlagN);
          UpLineTemp = HV(High,CancelFlagN);
          //K线区域按时间顺序从左向右共由4根K线组成,最左边的K线标号为3,当前K线标号为0
          //如果1号K线收盘价高于3号K线最高点,开始设置做多交易区域,上轨为3号K线高点,下轨为从标号为1起CancelFlagN根K线的低点
          //如果标号为0的K线收盘价在上下轨之间,则做多区域设置成功,做多触发价为标号为0的K线高点,如果之后K线收盘价低于下轨则区域设置取消
          //如果1号K线收盘价低于3号K线最低点,开始设置做空交易区域,下轨为3号K线低点,上轨为从标号为1起CancelFlagN根K线的高点
          //如果标号为0的K线收盘价在上下轨之间,则做空区域设置成功,做空触发价为标号为0的K线低点,如果之后K线收盘价高于下轨则区域设置取消
          If(MarketPosition <> 1)
          {
             If(EntryFlagL[1] == 0)
             {
                If(Close[1] >= High[3])
                {
                   UpLine = High[3];
                   DownLine = DownLineTemp[1];
                   If(Close[0] <= UpLine && Close[0] >= DownLine)
                   {
                      EntryFlagL = 1;
                      EntryPriceL = High[0];
                   }
                }
             }
             //如果未开仓前,有K线收盘低于DownLine,则做多区域设置取消 
             Else If(EntryFlagL[1] == 1)
             {
                If(Close[0] < DownLine)
                {
                   EntryFlagL = 0;
                }
             }
          }
          If(MarketPosition <> -1)
          {
             If(EntryFlagS[1] == 0)
             {
                If(Close[1] <= Low[3])
                {
                   UpLine = UpLineTemp[1];
                   DownLine = Low[3];
                   If(Close[0] <= UpLine && Close[0] >= DownLine)
                   {
                      EntryFlagS = 1;
                      EntryPriceS = Low[0];
                   }
                }
             }
             //如果未开仓前,有K线收盘高于UpLine,则做空区域设置取消
             Else If(EntryFlagS[1] == 1)
             {
                If(Close[0] > UpLine)
                {
                   EntryFlagS = 0;
                }
             }
          }
          //多头系统入场
          //做多区域设置成功时,当前K线高于标号为0的K线高点时入场做多
          If(MarketPosition <> 1 && CurrentBar >= ATRLength)
          {
             If(EntryFlagL[1] == 1 && High >= EntryPriceL[1] && Vol > 0)
             {
                BK(DefaultVol,Max(Open,EntryPriceL[1]));
                EntryFlagL = 0; //基于ATR的保护性止损
                ProtectStopL = Low[1] - ProtectStopATRMulti / 10 * ATR[1]; //基于ATR的盈利止盈
                ProfitTargetStopL = High[1] + ProfitTargetATRMulti * ATR[1];
             }
          }
          //空头系统入场
          //做空区域设置成功时,当前K线低于标号为1的K线低点时入场做多
          If(MarketPosition <> -1 && CurrentBar >= ATRLength)
          {
             If(EntryFlagS[1] == 1 && Low <= EntryPriceS[1] && Vol > 0)
             {
                SK(DefaultVol,Min(Open,EntryPriceS[1]));
                EntryFlagS = 0; //基于ATR的保护性止损
                ProtectStopS = High[1] + ProtectStopATRMulti / 10 * ATR[1]; //基于ATR的盈利止盈
                ProfitTargetStopS = Low[1] - ProfitTargetATRMulti * ATR[1];
             }
          }
          //多头系统出场
          If(BarsSinceEntry == 0)
          {
             HighAfterEntry = High;
          }
          Else
          {
             HighAfterEntry = Max(HighAfterEntry[1],High);
          }
          //基于ATR的盈亏平衡止损
          BreakEvenStopL = LastEntryPrice;
          If(MarketPosition == 1 && mp[1] == 1 && Vol > 0)
          {
             //出场线选择
             If(HighAfterEntry[1] >= BreakEvenStopL + BreakEvenStopATRMulti * ATR[1])
             {
                ExitLineL = BreakEvenStopL;
             }
             Else
             {
                ExitLineL = ProtectStopL[1];
             }
             //出场
             //基于ATR的盈利止盈
             If(Open >= ProfitTargetStopL[1])
             {
                SP(DefaultVol,Open);
             }
             //基于ATR的保护性止损或盈亏平衡止损
             Else If(Low <= ExitLineL)
             {
                SP(DefaultVol,Min(Open,ExitLineL));
             }
          }
          //空头系统出场
          If(BarsSinceEntry == 0)
          {
             LowAfterEntry = Low;
          }
          Else
          {
             LowAfterEntry = Min(LowAfterEntry[1],Low);
          }
          //基于ATR的盈亏平衡止损
          BreakEvenStopS = LastEntryPrice;
          If(MarketPosition == -1 && MP[1] == -1 && Vol > 0)
          {
             //出场线选择
             If(LowAfterEntry[1] <= BreakEvenStopS - BreakEvenStopATRMulti * ATR[1])
             {
                ExitLineS = BreakEvenStopS;
             }
             Else
             {
                ExitLineS = ProtectStopS[1];
             }
             //出场
             //基于ATR的盈利止盈
             If(Open <= ProfitTargetStopS[1])
             {
                BP(DefaultVol,Open);
             }
             //基于ATR的保护性止损或盈亏平衡止损
             Else If(High >= ExitLineS)
             {
                BP(DefaultVol,Max(Open,ExitLineS));
             }
          }
          MP = MarketPosition;
       }
       //------------------------处理开启------------------------//
       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 条

    本版积分规则

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

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