您现在的位置:程序化交易>> 期货公式>> 交易开拓者(TB)>> 开拓者知识>>正文内容

tbquant函数小bug--average等小于指定周期的时候并没有无效值 [开拓者 TB]

  • 咨询内容: 本帖最后由 quant_yunjinqi 于 2020-4-20 17:44 编辑

    函数的说明



    图表显示的结果




    理论上,不是应该在current_bar小于10的时候,short_ma的值是无效值吗?为什么是前面的bar的平均值?

    公式代码
    1. Params
    2.         //此处添加参数
    3.         Numeric millsecs(1000);
    4.         numeric short_window(10);
    5.         numeric long_window(20);
    6. Vars
    7.         //此处添加变量
    8.         Numeric avg;
    9.         Global Integer timerId;
    10.         Series<Numeric> my_short_ma;
    11.         Series<Numeric> my_long_ma;

    12. Defs
    13.         //此处添加公式函数
    14.         Numeric calcAvg(Numeric a,Numeric b)
    15.         {
    16.                 return (a+b)/2;
    17.         }

    18. Events
    19.         //此处实现事件函数
    20.        
    21.         //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
    22.         OnInit()
    23.         {
    24.                 timerId=createTimer(millsecs);
    25.                 //与数据源有关
    26.                 Range[0:DataCount-1]
    27.                 {
    28.                         //=========数据源相关设置==============
    29.                         //AddDataFlag(Enum_Data_RolloverBackWard());        //设置后复权

    30.                         //AddDataFlag(Enum_Data_RolloverRealPrice());        //设置映射真实价格

    31.                         //AddDataFlag(Enum_Data_AutoSwapPosition());        //设置自动换仓

    32.                         //AddDataFlag(Enum_Data_IgnoreSwapSignalCalc());        //设置忽略换仓信号计算

    33.                         //AddDataFlag(Enum_Data_OnlyDay());                //设置仅日盘
    34.                        
    35.                         //AddDataFlag(Enum_Data_OnlyNight());        //设置仅夜盘

    36.                         //AddDataFlag(Enum_Data_StrategyQuote());        //设置返回公式行情
    37.                        
    38.                         //AddDataFlag(Enum_Data_NotGenReport());        //设置数据源不参与生成报告标志
    39.                        
    40.                         //=========交易相关设置==============
    41.                         //SetMarginRate(0.1);        //设置保证金率为10%
    42.                        
    43.                         //SetCommissionRate(BitOr(Enum_Rate_FreeOfExitToday,Enum_Rate_ByFillAmount),5);        //设置手续费率为成交金额的5%%,不收平今, BitOr进行位或运算即设置属性和
    44.                        
    45.                         //SetSlippage(Enum_Rate_PointPerHand,2);        //设置滑点为2跳/手
    46.                        
    47.                         //SetOrderPriceOffset(2);        //设置委托价为叫买/卖价偏移2跳
    48.                        
    49.                         //SetOrderMap2MainSymbol();        //设置委托映射到主力
    50.                        
    51.                         //SetOrderMap2AppointedSymbol(symbols, multiples);         //设置委托映射到指定合约,symbols是映射合约数组,multiples是映射倍数数组
    52.                 }
    53.                 //与数据源无关
    54.                 //SetBeginBarMaxCount(10);        //设置最大起始bar数为10
    55.                        
    56.                 //SetBackBarMaxCount(10);        //设置最大回溯bar数为10
    57.                
    58.                 //=========交易相关设置==============
    59.                 //SetInitCapital(1000000);        //设置初始资金为100万
    60.                
    61.                 //AddTradeFlag(Enum_Trade_Ignore_Buy());        //设置忽略多开
    62.                        
    63.                 //AddTradeFlag(Enum_Trade_Ignore_Sell());        //设置忽略多平
    64.                        
    65.                 //AddTradeFlag(Enum_Trade_Ignore_SellShort());        //设置忽略空开
    66.                        
    67.                 //AddTradeFlag(Enum_Trade_Ignore_Buy2Cover());        //设置忽略空平
    68.         }

    69.         //在所有的数据源准备完成后调用,应用在数据源的设置等操作
    70.         OnReady()
    71.         {

    72.         }

    73.         //在新bar的第一次执行之前调用一次,参数为新bar的图层数组
    74.         OnBarOpen(ArrayRef<Integer> indexs)
    75.         {

    76.         }

    77.         //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
    78.         OnBar(ArrayRef<Integer> indexs)
    79.         {
    80.                 my_short_ma = average(close,short_window);
    81.                 my_long_ma = average(close,long_window);
    82.                   Commentary("CurrentBar: "+text(CurrentBar));
    83.                   Commentary("my_short_ma: "+text(my_short_ma));
    84.                   Commentary("my_long_ma: "+text(my_long_ma));
    85.                   if (my_short_ma[1]>my_long_ma[1] and MarketPosition<=0){buy(1,open);}
    86.                   if (my_short_ma[1]<=my_long_ma[1] and MarketPosition>=0 ){sellshort(1,open);}
    87.                  
    88.         }

    89.         //持仓更新事件函数,参数pos表示更新的持仓结构体
    90.         OnPosition(PositionRef pos)
    91.         {
    92.                
    93.         }

    94.         //委托更新事件函数,参数ord表示更新的委托结构体
    95.         OnOrder(OrderRef ord)
    96.         {
    97.                
    98.         }

    99.         //成交更新事件函数,参数ordFill表示更新的成交结构体
    100.         OnFill(FillRef ordFill)
    101.         {
    102.                
    103.         }

    104.         //定时器更新事件函数,参数id表示定时器的编号,millsecs表示定时间的间隔毫秒值
    105.         OnTimer(Integer id,Integer intervalMillsecs)
    106.         {
    107.                
    108.         }

     

     来源:CXH99.COM

  • TB技术人员:
    1. Params
    2.         Series<Numeric> Price(1);        //数值型序列值
    3.         Numeric Length(10);                        //周期数
    4. Vars
    5.         Numeric AvgValue;
    6. Begin
    7.         AvgValue = Summation(Price, Length) / Length;
    8.         Return AvgValue;
    9. End
    复制代码从average函数的算法里可以看出,在length小于指定周期时,也会有相应的计算值 ,并不会是无效值 。。
    只不过此时的计算结果是可能不符合交易者需求的,所以建议在代码里做一些判断控制,不要用此计算结果来进行交易的判断。

 

有思路,想编写各种指标公式,交易模型,选股公式,还原公式的朋友

可联系技术人员 QQ: 262069696  点击在线交流或微信号:cxh99cxh99  进行 有偿收费 编写!

怎么收费,代编流程等详情请点击阅读!

(注:由于人数限制,QQ或微信请选择方便的一个联系我们就行,加好友时请简单备注下您的需求,否则无法通过。谢谢您!)


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容