wh9 k线策略模型:基本波动加权后的OBV交易系统策略公式 [复制链接]

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

    wh9 k线策略模型:基本波动加权后的OBV交易系统策略公式

    公式源码如下:
    Params
       Numeric AvgLength(25); //计算WOBV的ma周期值
    Vars
       Numeric Con; //中间变量
       Numeric Con2; //中间变量
       NumericSeries WOBV; //WOBV指标变量
       NumericSeries SSMA; //WOBV指标均值变量
       NumericSeries BuySetup; //开多标识
       NumericSeries SellSetup; //开空标识
       NumericSeries LEPrice; //多头触发线
       NumericSeries SEPrice; //空头触发线
       NumericSeries Con3; //中间变量
       NumericSeries Con4; //中间变量
       Numeric N; //下单手数
       Numeric T; //时间间隔
       Numeric SH; //平仓参数
       Numeric NOW; //当前时间
       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 BKDEL,SKDEL; //开仓撤单标志
       Global_Numeric BPDEL,SPDEL; //平仓撤单标志
       Global_Numeric BKM,SKM; //开仓委托手数
       Global_Numeric BPM,SPM; //平仓委托手数
       Global_Numeric BKP,SKP; //开仓委托价格
       Global_Numeric BPP,SPP; //平仓委托价格
       Global_Numeric BKT,SKT; //开仓委托时间
       Global_Numeric BPT,SPT; //平仓委托时间
    Begin
       //------------------------信号发出------------------------//
       If(1) //信号发出
       {
          //WOBV指标计算
          If(High - Low <> 0)
          {
             WOBV = WOBV + (((Close - Open) / (High - Low)) * Vol); //计算波动加权后的OBV,WOBV
          }
          SSMA = Ma(WOBV,AvgLength); //计算WOBV的MA
          //多空触发条件计算
          Con = CrossUp(WOBV,SSMA);
          If(Con == 1)
          {
             BuySetup = 1;
             LEPrice = High;
             SellSetup = 0;
          }
          Con2 = CrossDown(WOBV,SSMA);
          If(Con2 == 1)
          {
             BuySetup = 0;
             SellSetup = 1;
             SEPrice = Low;
          }
          //做多标识初始化
          If(MarketPosition == 1)
          BuySetup = 0;
          //做空标识初始化
          If(MarketPosition == -1)
          SellSetup = 0;
          //多头系统入场
          If(MarketPosition == 0)
          {
             If(BuySetup[1] && High >= LEPrice[1] + MinPrice)
             {
                BK(DefaultVol,Max(Open,LEPrice[1] + MinPrice));
             }
          }
          //空头系统入场
          If(MarketPosition == 0)
          {
             If(SellSetup[1] && Low <= SEPrice[1] - MinPrice)
             {
                SK(DefaultVol,Min(Open,SEPrice[1] - MinPrice));
             }
          }
          //多头系统出场
          Con3 = CrossDown(WOBV,SSMA);
          If(MarketPosition == 1 && BarsSinceEntry > 0)
          {
             If(Con3[1] == 1)
             {
                SP(DefaultVol,Open);
             }
          }
          //空头系统出场
          Con4 = CrossUp(WOBV,SSMA);
          If(MarketPosition == -1 && BarsSinceEntry > 0)
          {
             If(Con4[1] == 1)
             {
                BP(DefaultVol,Open);
             }
          }
       }
       //------------------------处理开启------------------------//
       If(A_IsExchangeOpen() == 1) //如果是开盘状态
       {
          If(BarStatus() == 2) //如果不带入历史值
          {
             If(RunStart() == 1) //如果已初始化成功
             {
                OPFLG = 1; //开启模型处理
             }
          }
       }
       //------------------------变量赋值------------------------//
       If(OPFLG == 1) //变量赋值
       {
          N = 2; //下单手数
          T = 3; //时间间隔
          NOW = CurrentTime(); //当前时间
          BIDP = Price("Bid1"); //买一价
          ASKP = Price("Ask1"); //卖一价
          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
                BKDEL = 0; //买开撤单标志归0
             }
             Else If(F_OrderStatus(BKID) == Enum_Canceled) //如果买开委托已撤
             {
                Commentary("【BK信号:买开委托已撤!】");
                If(F_OrderFilledLot(BKID) > 0) //如果买开委托部分成交
                {
                   BKM = BKM - F_OrderFilledLot(BKID); //买开委托手数
                }
                If(BKM > 0) //如果买开委托手数大于0
                {
                   BKP = ASKP; //买开委托价格
                   Commentary("【BK信号:买开委托追价!】");
                   BKID = A_SendOrder(Enum_Buy,Enum_Entry,BKM,BKP); //发出买开委托
                   BKT = NOW; //买开委托时间
                }
                BKDEL = 0; //买开撤单标志归0
             }
             Else If(F_OrderStatus(BKID) == Enum_Declared || F_OrderStatus(BKID) == Enum_FillPart) //如果买开委托挂单
             {
                If(BKDEL == 0) //如果未撤单
                {
                   If(TimeDiff(BKT,NOW) >= T) //如果时间间隔T秒
                   {
                      Commentary("【BK信号:买开委托撤单!】");
                      F_DeleteOrder(F_OrderContractNo(BKID)); //撤掉买开委托挂单
                      BKDEL = 1; //已发出撤掉买开委托挂单
                   }
                }
             }
          }
          If(SPFLG == 1) //如果有卖平委托
          {
             If(F_OrderStatus(SPID) == Enum_Filled) //如果卖平委托成交
             {
                Commentary("【SP信号:卖平委托成交!】");
                SPFLG = 0; //卖平标志归0
                SPDEL = 0; //卖平撤单标志归0
             }
             Else If(F_OrderStatus(SPID) == Enum_Canceled) //如果卖平委托已撤
             {
                Commentary("【SP信号:卖平委托已撤!】");
                If(F_OrderFilledLot(SPID) > 0) //如果卖平委托部分成交
                {
                   SPM = SPM - F_OrderFilledLot(SPID); //卖平委托手数
                }
                If(BRP > 0 && SPM > 0 && SPM <= BRP) //如果卖平委托手数不超过多头可用持仓
                {
                   SPP = BIDP; //卖平委托价格
                   Commentary("【SP信号:卖平委托追价!】");
                   SPID = A_SendOrder(Enum_Sell,SH,SPM,SPP); //发出卖平委托
                   SPT = NOW; //卖平委托时间
                }
                SPDEL = 0; //卖平撤单标志归0
             }
             Else If(F_OrderStatus(SPID) == Enum_Declared || F_OrderStatus(SPID) == Enum_FillPart) //如果卖平委托挂单
             {
                If(SPDEL == 0) //如果未撤单
                {
                   If(TimeDiff(SPT,NOW) >= T) //如果时间间隔T秒
                   {
                      Commentary("【SP信号:卖平委托撤单!】");
                      F_DeleteOrder(F_OrderContractNo(SPID)); //撤掉卖平委托挂单
                      SPDEL = 1; //已发出撤掉卖平委托挂单
                   }
                }
             }
          }
          If(SKFLG == 1) //如果有卖开委托
          {
             If(F_OrderStatus(SKID) == Enum_Filled) //如果卖开委托成交
             {
                Commentary("【SK信号:卖开委托成交!】");
                SKFLG = 0; //卖开标志归0
                SKDEL = 0; //卖开撤单标志归0
             }
             Else If(F_OrderStatus(SKID) == Enum_Canceled) //如果卖开委托已撤
             {
                Commentary("【SK信号:卖开委托已撤!】");
                If(F_OrderFilledLot(SKID) > 0) //如果卖开委托部分成交
                {
                   SKM = SKM - F_OrderFilledLot(SKID); //卖开委托手数
                }
                If(SKM > 0) //如果卖开委托手数大于0
                {
                   SKP = BIDP; //卖开委托价格
                   Commentary("【SK信号:卖开委托追价!】");
                   SKID = A_SendOrder(Enum_Sell,Enum_Entry,SKM,SKP); //发出卖开委托
                   SKT = NOW; //卖开委托时间
                }
                SKDEL = 0; //卖开撤单标志归0
             }
             Else If(F_OrderStatus(SKID) == Enum_Declared || F_OrderStatus(SKID) == Enum_FillPart) //如果卖开委托挂单
             {
                If(SKDEL == 0) //如果未撤单
                {
                   If(TimeDiff(SKT,NOW) >= T) //如果时间间隔T秒
                   {
                      Commentary("【SK信号:卖开委托撤单!】");
                      F_DeleteOrder(F_OrderContractNo(SKID)); //撤掉卖开委托挂单
                      SKDEL = 1; //已发出撤掉卖开委托挂单
                   }
                }
             }
          }
          If(BPFLG == 1) //如果有买平委托
          {
             If(F_OrderStatus(BPID) == Enum_Filled) //如果买平委托成交
             {
                Commentary("【BP信号:买平委托成交!】");
                BPFLG = 0; //买平标志归0
                BPDEL = 0; //买平撤单标志归0
             }
             Else If(F_OrderStatus(BPID) == Enum_Canceled) //如果买平委托已撤
             {
                Commentary("【BP信号:买平委托已撤!】");
                If(F_OrderFilledLot(BPID) > 0) //如果买平委托部分成交
                {
                   BPM = BPM - F_OrderFilledLot(BPID); //买平委托手数
                }
                If(SRP > 0 && BPM > 0 && BPM <= SRP) //如果买平委托手数不超过空头可用持仓
                {
                   BPP = ASKP; //买平委托价格
                   Commentary("【BP信号:买平委托追价!】");
                   BPID = A_SendOrder(Enum_Buy,SH,BPM,BPP); //发出买平委托
                   BPT = NOW; //买平委托时间
                }
                BPDEL = 0; //买平撤单标志归0
             }
             Else If(F_OrderStatus(BPID) == Enum_Declared || F_OrderStatus(BPID) == Enum_FillPart) //如果买平委托挂单
             {
                If(BPDEL == 0) //如果未撤单
                {
                   If(TimeDiff(BPT,NOW) >= T) //如果时间间隔T秒
                   {
                      Commentary("【BP信号:买平委托撤单!】");
                      F_DeleteOrder(F_OrderContractNo(BPID)); //撤掉买平委托挂单
                      BPDEL = 1; //已发出撤掉买平委托挂单
                   }
                }
             }
          }
       }
       //------------------------委托处理------------------------//
       If(OPFLG == 1) //委托处理
       {
          If(BKDFLG == 1) //如果已开启买开处理
          {
             If(BKFLG == 0) //如果没有买开委托
             {
                BKM = N; //买开委托手数
                BKP = ASKP; //买开委托价格
                Commentary("【BK信号:买开委托发出!】");
                BKID = A_SendOrder(Enum_Buy,Enum_Entry,BKM,BKP); //发出买开委托
                BKT = NOW; //买开委托时间
                BKFLG = 1; //已发出买开委托
             }
          }
          If(SPDFLG == 1) //如果已开启卖平处理
          {
             If(SPFLG == 0) //如果没有卖平委托
             {
                If(BRP > 0) //如果有多头可用持仓
                {
                   SPM = BRP; //卖平委托手数
                   SPP = BIDP; //卖平委托价格
                   Commentary("【SP信号:卖平委托发出!】");
                   SPID = A_SendOrder(Enum_Sell,SH,SPM,SPP); //发出卖平委托
                   SPT = NOW; //卖平委托时间
                   SPFLG = 1; //已发出卖平委托
                }
             }
          }
          If(SKDFLG == 1) //如果已开启卖开处理
          {
             If(SKFLG == 0) //如果没有卖开委托
             {
                SKM = N; //卖开委托手数
                SKP = BIDP; //卖开委托价格
                Commentary("【SK信号:卖开委托发出!】");
                SKID = A_SendOrder(Enum_Sell,Enum_Entry,SKM,SKP); //发出卖开委托
                SKT = NOW; //卖开委托时间
                SKFLG = 1; //已发出卖开委托
             }
          }
          If(BPDFLG == 1) //如果已开启买平处理
          {
             If(BPFLG == 0) //如果没有买平委托
             {
                If(SRP > 0) //如果有空头可用持仓
                {
                   BPM = SRP; //买平委托手数
                   BPP = ASKP; //买平委托价格
                   Commentary("【BP信号:买平委托发出!】");
                   BPID = A_SendOrder(Enum_Buy,SH,BPM,BPP); //发出买平委托
                   BPT = NOW; //买平委托时间
                   BPFLG = 1; //已发出买平委托
                }
             }
          }
       }
    End
    热帖

    全部评论/0 条

    本版积分规则

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

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