新手指南|Beginner Guide

盈时策略源码构成介绍

盈时策略源码构成介绍

一、基本框架

     盈时策略源码基本框架主要由以下5个部分构成:参数、变量、技术指标、入场模块和离场模块。

        //参数

        Params
             Numeric N1(1);
       //变量

       Vars
           Numeric N2;  
           NumericSeries N3; 

       Begin
            // 滑点计算:
            Slip = SlipSetting * MinMove * PriceScale;
   
            //技术指标 
           技术指标=… 
   
           // 公 用 条 件 :

          ConditionA = …;
 

         // 符合条件多头入场
         EntStopL =…;
         If(Direction >= 0 && MarketPosition == 0){
              If (条件) { 
                  MyEntryPrice = …;
                  Buy(PosSizeL, MyEntryPrice);
                  Commentary("多头突破(Stop)进场");
               }
           }
          // 符合条件多头入场
          EntStopS =…;
          If ( Direction <= 0 && MarketPosition == 0 ) {   
               If ( 条件) {
                    MyEntryPrice =…;
                    SellShort(PosSizeS, MyEntryPrice);
                    Commentary("空头突破(Stop)进场");
                }
            }   
           // 多头市价(Market)离场:
          ExMarketCondL =…;
          If ( Direction >= 0 && MarketPosition == 1 && BarsSinceLastEntry > 0 ){  
               If (条件) {
                   MyExitPrice =;  
                   Sell(0, MyExitPrice);
                   Commentary("多头市价(Market)离场");
                }
            } 
           // 多头止损(Stop)离场:
           ExStopRangeL =…;
           If ( BarsSinceLastEntry == 1 )  
               ExStopL =…;  
           If ( Direction >= 0 && MarketPosition == 1 && BarsSinceLastEntry > 0 ){  
               If ( 条件 ) {

                   MyExitPrice =…;
                   Sell(0, MyExitPrice);
                  Commentary("多头止损(Stop)离场");
               }
            }  
          // 空头市价(Market)离场:

          ExMarketCondS =…;
         If ( Direction <= 0 && MarketPosition == -1 && BarsSinceLastEntry > 0 ){ If (条件 ) { 
                MyExitPrice =…; BuyToCover(0, MyExitPrice);
                Commentary("空头市价(Market)离场");
                 }
           }
          // 空头止损(Stop)离场: 

          ExStopRangeS = …;
          If ( BarsSinceLastEntry == 1 ) ExStopS =…;
          If ( Direction <= 0 && MarketPosition == -1 && BarsSinceLastEntry > 0 ){ If (条件) { 
               MyExitPrice =…; BuyToCover(0, MyExitPrice);
               Commentary("空头止损(Stop)离场");
                }
           } 

       End 


二、参数  

       参数是一个预先声明的地址,用来存放输入参数的值,声明之后可以在公式中使用该参数名称引用其值。参数的值在公式的内部不能被修改,在整个程序中一直保持不变,不能对参数进行赋值操作(引用参数是个特例)。
        参数类型和用户函数、公式应用有关。用户函数是公式中比较特殊的类型, 它自身不能被超级图表、行情报价这样的模块调用,只能被公式应用或者用户函数调用,公式应用只能使用三种简单的基本类型,即数值型(Numeric)、布尔型(Bool)和字符串型(String)。三种简单类型参数通过传值的方式将参数值传入公式,公式内部通过参数名称进行运算。
       使用参数之前,必须对参数进行声明,使用关键字“Params”进行参数声明,并指定参数类型。参数声明的框架如下:

      Params
             参数类型 参数名 1(初值) 

             参数类型 参数名 2(初值) 

             参数类型 参数名 3(初值) 
 
  以下是参数声明的举例。
 
       Params
              Bool bTest(False); //定义布尔值参数 bTest,默认值为 False;

              Numberic Length(10); //定义数值值参数 Length,默认值为 10; 

              NumericSeries price(0);//定义数值型序列参数 Price,默认值为 0; 

              NumericRef output(0); //定义数值型引用参数 output,默认值为 0; 

             String strTmp(“Hello”);//定义字符串参数 strTmp,默认值 Hello; 
 
       整个策略中只出现一个 Params 声明,并且要放到策略的开始部分,变量定义之前。
  

三、变量 
       变量主要有四种数据类型:Numeric(数值型)、NumericSeries(数值型序列)、Bool(布尔型)、BoolSeries(布尔型序列)。
      变量包括:基本变量、进出场价格变量、复合指标变量、公用条件变量、公用条件变量、多头进场变量、空头进场变量、多头离场变量、空头离场变量。以下是各类变量的部分举例。

基本变量:
       Numeric Slip:滑点,用于储存计算出的滑点。Numeric PosSizeL(1):多头头寸大小,默认值为 1。                  Numeric PosSizeS(1):空头头寸大小,默认值为 1。
       …
进出场价格变量:
       Numeric MyEntryPrice:我的进场价格。

       Numeric MyExitPrice:我的离场价格。
       …
复合指标变量:   
       NumericSeries NVI:负量指标。

       NumericSeries WVAD:威廉变异离散量。
       …
公用指标变量:
       NumericSeries IndicatorA:机器自动生成的技术指标,说明系统寻优不仅限制于传统的技术指标,扩展技术指标的覆盖范围。
        …
公用条件变量:
       BoolSeries ConditionA:市场状态的过滤条件,与各模块的条件配合使用,过滤掉信号的噪音。
       …
多头进场变量:
       NumericSeries EntStopL:多头进场的价格指标变量。
       …
空头进场变量:
       NumericSeries EntStopS:空头进场的价格指标变量。
       …
多头离场变量:
       BoolSeries ExMarketCondL:多头离场的条件指标变量。

       NumericSeries  ExStopL:多头止损价格。

       NumericSeries ExStopRangeL:多头止损范围。
       …
空头离场变量:
      BoolSeries ExMarketCondS:多头离场的条件指标变量。

      NumericSeries  ExStopS:空头止损价格。

      NumericSeries ExStopRangeS:空头止损范围。
      …
 
四、指标 
        声明参数和变量后,策略会进行指标计算。策略代码中的指标主要包括技术指标、公用指标和公用条件。这些指标将会应用于进出场条件的判断。
         技术指标包括滑点( Slip )、威廉变异离散量( WVAD )、抛物线转向(ParabolicSAR)等多种指标。以下是技术指标的部分举例。

        Slip = SlipSetting * MinMove * PriceScale:滑点计算。
        ParabolicSAR(ParAfStep, ParAfLimit, ParClose, ParOpen, ParPosition,ParTransition):求抛物线转向(ParabolicSAR)。
        …
        公用指标主要是对各种类型的价格数据进行函数处理,其中,价格数据包括开盘价(open)、最高价(high)、收盘价(close)和最低价(low),价格类型包括当前价格、N 周期前的价格等,处理价格数据的函数包括简单算术运算(+、-、*、/)、求平均值(Average)、求绝对值(Abs)、求 N 周期以来某价格的最大值(Highest)等。公用指标在策略代码中一般用 IndicatorA、IndicatorB等表示。以下是公用指标的部分举例。
       IndicatorA = (High+Low+Close)/3:求当前最高价、最低价和收盘价的算术平均。
       IndicatorB = Abs((High[N1] - Low[N2])):求 N1 周期前最高价与 N2 周期前最低价差值的绝对值。
       IndicatorC = Average(High,N):求 N 周期以来,最高价的平均值。
       …
        公用条件一般为普通逻辑运算或系统定义的逻辑运算,普通逻辑运算包括大于(>)、小于(<)、等于(==)、不等于(<>或!=)等关系操作以及与(AND或&&)、或(OR 或||)、非(NOT 或!)等逻辑操作,系统定义的逻辑运算包括上穿(CrossOver)、下穿(CrossUnder)等。公用条件取值为 1 或 0,当逻辑运算为真时,公用条件取值为 1,当逻辑运算为假时,公用条件取值为 0。在代码中用 ConditionA、ConditionB 等表示。

         ConditionA = Average (IndicatorA, N) < IndicatorA: 指标 A 的 N 周期均值小于指标 A 的当前值。
         ConditionB = CrossOver(IndicatorB, 0):指标 B 的值上穿 0 线。

         

五、入场模块

       多头入场模块的框架一般如下: 
 
       // 多头入场: 
       If  ( 多 头 入 场 条 件 ) 

            { MyEntryPrice = ……; 
            Buy(PosSizeL, MyEntryPrice); 
            Commentary("多头进场"); 
             } 
          } 
 
        其中,多头入场条件位置为系统自动生成的入场条件,一般为上节所述的参数、变量、指标等与各类价格的逻辑组合,返回值为 1 或 0;"MyEntryPrice" 处计算入场价格;Buy 为系统函数,其功能为产生一个多头建仓操作,语法为Buy(Numeric Share=0,Numeric Price=0),其中的参数 Share 买入数量,为整型值,取值 0 时为使用系统设置参数,Price 为买入价格,为浮点数,取值 0 时为使用现价;Commentary 的功能为在 K 线图的当前 Bar 添加一行注释信息。 
       上述多头入场模块的含义为: 当入场条件满足时, 多头入场, 以
MyEntryPrice 的价格买入 PosSizeL(其取值在参数声明中)手的商品,并在入场的 Bar 添加注释信息"多头进场"。 
        空头入场模块的框架一般如下: 

       // 空头入场: 
      If (空头入场条件) 

         { MyEntryPrice = ……; 
         SellShort(PosSizeS, MyEntryPrice); 
         Commentary("空头进场"); 
         } 
       } 
 
       其中,空头入场条件、MyEntryPrice 以及 Commentary 功能与多头入场模块的对应位置相同,SellShort 为系统函数,其功能为产生一个空头建仓操作, 语法和参数与 Buy 相同。 
      上述空头入场模块的含义为: 当入场条件满足时, 空头入场, 以MyEntryPrice 的价格卖出 PosSizeL(其取值在参数声明中)手的商品,并在入场的 Bar 添加注释信息"空头进场"。 
      以下为入场模块的部分举例。 
 
        // 多头限价(Limit)进场: 
        EntLimitL = DEMA(Low, EntLimLenL3) -Max(AvgTrueRange(EntLimLenL1), AvgTrueRange(EntLimLenL2));//计算多头进场指标 
        If  (   Direction   >=   0   &&   MarketPosition   ==   0   )  

             { If ( Close[1] <= EntLimitL[1] ) { 
                     MyEntryPrice = IIF(AccountDataExist, Q_AskPrice+Slip, Open);  
                     Buy(PosSizeL, MyEntryPrice); 
                     Commentary("多头限价(Limit)进场"); 
              } 
          } 
        // 空头突破(Stop)进场: 
        EntStopS = NthHigher(TrueLow, EntStopLenS2, EntStopNumCntS) - AvgTrueRange(EntStopLenS1); //计算空头进场指标 
        If ( Direction <= 0 && MarketPosition == 0 ) 

            {  If ( Close[1] <= EntStopS[1] ) { 
                  MyEntryPrice = IIF(AccountDataExist, Q_BidPrice-Slip, Open); 
                  SellShort(PosSizeS, MyEntryPrice); 
                  Commentary("空头突破(Stop)进场"); 
                  } 
          } 
           // 空头市价(Market)进场: 
          EntMarketCondS = CrossUnder(AdaptiveMovAvg(PriceOscillator(TrueHigh, EntMarLenS1, EntMarLenS6), EntMarLenS4, EntMarLenS3, EntMarLenS4), AdaptiveMovAvg(PriceOscillator(TrueHigh, EntMarLenS2, EntMarLenS5), EntMarLenS4, EntMarLenS3, EntMarLenS4)); 
         If ( Direction <= 0 && MarketPosition == 0 )

              {  If ( EntMarketCondS[1] ) { 
                      MyEntryPrice = IIF(AccountDataExist, 0, Open); 

                      SellShort(PosSizeS, MyEntryPrice); 
                      Commentary("空头市价(Market)进场"); 
                       } 
             } 

六、离场模块

        多头离场模块的一般框架如下: 
 
        //多头离场 
        If (多头离场条件) 

           { MyExitPrice = ……;  
           Sell(PosSizeL, MyExitPrice); 
           Commentary("多头离场"); 
            } 
         } 
 
         其中,多头离场条件和 Commentary 功能与入场模块的对应位置相同,MyExitPrice 处计算离场价格,Sell 为系统函数,其功能为产生一个多头平仓操作,其语法为 Sell(Numeric Share=0,Numeric Price=0),其中的参数 Share 为卖出数量,为整型值,取值 0 意为平掉当前所有持仓;Price 为卖出价格, 为浮点数,取值 0 时为使用现价。 
       上述多头离场模块的含义为:当离场条件满足时,多头离场,以 MyExitPrice 的价格平掉 PosSizeL(其取值在参数声明中)手的多头持仓,并在入场的 Bar 添加注释信息"多头离场"。 
       空头离场模块的一般框架如下: 
 
       //空头离场 
       If (空头离场条件) 

           { MyExitPrice = ……;  
            BuyToCover(PosSizeL, MyExitPrice); 
            Commentary("空头离场"); 
            } 
         } 
 
        其中,空头离场条件、MyExitPrice 和 Commentary 的功能与多头离场模块的对应位置相同,BuyToCover 为系统函数,其功能为产生一个空头平仓操作, 其语法和参数与 Sell 相同。 
       上述空头离场模块的含义为:当离场条件满足时,空头离场,以 MyExitPrice 的价格平掉 PosSizeL(其取值在参数声明中)手的空头持仓,并在入场的 Bar 添加注释信息"空头离场"。 
       以下为离场模块的部分举例。 
 
       // 多头目标(Target)离场: 
       ExAbsTargetL = EntryPrice * (1 + ExAbsTargPcL/100);//计算离场指标

       If ( Direction >= 0 && MarketPosition == 1 && BarsSinceLastEntry > 0 ) {  
           If ( Open >= ExAbsTargetL ) { 
               MyExitPrice = IIF(AccountDataExist, Q_BidPrice-Slip, Open); 

               Sell(0, MyExitPrice); 
               Commentary("多头目标(Target)离场"); 

               } 
           } 
          // 空头止损(Stop)离场: 
          ExAbsStopS = EntryPrice * (1 + ExAbsStopPcS/100);          
          If ( Direction <= 0 && MarketPosition == -1 && BarsSinceLastEntry > 0 ) {  
              If ( Close[1] >= ExAbsStopS ) { 
                   MyExitPrice = IIF(AccountDataExist, Q_AskPrice+Slip, Open); 

                   BuyToCover(0, MyExitPrice); 
                   Commentary("空头止损(Stop)离场"); 
                   } 
             } 
             // 空头日内平仓: 
            If ( Direction <= 0 && MarketPosition == -1 ){ 
                 If ( Time >= CloseExitClock/1000000 ) { 
                       MyExitPrice = IIF(AccountDataExist, 0, Open); 
                       BuyToCover(0, MyExitPrice); 
                       Commentary("空头日内平仓"); 
                   } 
                }