全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
OnBar中改变自己需要指标的计算周期,为何影响到已设定参数其它指标的输出?
hkk501 分享到
2022-01-17 15:25

Params
    //此处添加参数
    Integer length1(5);//EMA周期
    Integer length2(20);//EMA周期
    Integer length3(60);//EMA周期
    //MACD
    Integer FastLength(12);
    Integer SlowLength(26);
    Integer MACDLength(9);        
Vars
    //此处添加变量
    Series<Numeric> ema1;
    Series<Numeric> ema2;
    Series<Numeric> ema3;
    Series<Numeric> MACDDiff; 
    Series<Numeric> AvgMACD;
    Series<Numeric> MACDValue;    
    Plot plt;
Defs
    //此处添加公式函数

Events
    //此处实现事件函数
    
    //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
    OnInit()
    {
        plt.figure(0);
        plt.setOption("DIF","x-format","time");
        plt.setOption("DEA","x-format","time");
        plt.setOption("零线","x-format","time");
        plt.setOption("MACD","x-format","time");
        
        //与数据源有关
        Range[0:DataCount-1]
        {
            //=========数据源相关设置==============
            //AddDataFlag(Enum_Data_RolloverBackWard());    //设置后复权

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

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

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

            //AddDataFlag(Enum_Data_OnlyDay());        //设置仅日盘
            
            //AddDataFlag(Enum_Data_OnlyNight());    //设置仅夜盘
            
            //AddDataFlag(Enum_Data_NotGenReport());    //设置数据源不参与生成报告标志
            
            //=========交易相关设置==============
            //MarginRate rate;
            //rate.ratioType = Enum_Rate_ByFillAmount; //设置保证金费率方式为成交金额百分比
            //rate.longMarginRatio = 0.1; //设置保证金率为10%
            //rate.shortMarginRatio = 0.2; //设置保证金率为20%
            //SetMarginRate(rate);    
            
            //CommissionRate tCommissionRate;
            //tCommissionRate.ratioType = Enum_Rate_ByFillAmount;
            //tCommissionRate.openRatio = 5; //设置开仓手续费为成交金额的5%%
            //tCommissionRate.closeRatio = 2; //设置平仓手续费为成交金额的2%%
            //tCommissionRate.closeTodayRatio = 0; //设置平今手续费为0
            //SetCommissionRate(tCommissionRate); //设置手续费率
            
            //SetSlippage(Enum_Rate_PointPerHand,2);    //设置滑点为2跳/手
            
            //SetOrderPriceOffset(2);    //设置委托价为叫买/卖价偏移2跳
            
            //SetOrderMap2MainSymbol();    //设置委托映射到主力
            
            //SetOrderMap2AppointedSymbol(symbols, multiples);     //设置委托映射到指定合约,symbols是映射合约数组,multiples是映射倍数数组
        }
        //与数据源无关
        //SetBeginBarMaxCount(10);    //设置最大起始bar数为10
            
        //SetBackBarMaxCount(10);    //设置最大回溯bar数为10
        
        //=========交易相关设置==============
        //SetInitCapital(1000000);    //设置初始资金为100万
        
        //AddTradeFlag(Enum_Trade_Ignore_Buy());    //设置忽略多开
            
        //AddTradeFlag(Enum_Trade_Ignore_Sell());    //设置忽略多平
            
        //AddTradeFlag(Enum_Trade_Ignore_SellShort());    //设置忽略空开
            
        //AddTradeFlag(Enum_Trade_Ignore_Buy2Cover());    //设置忽略空平
    }

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

    }

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

    }

    //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
    OnBar(ArrayRef<Integer> indexs)
    {
        String s;
        Numeric vLowest;
        Numeric vHighest;
        Numeric x;
        x = 3;
        vLowest = Lowest(L,x);//有此语句,ema,MACD图形从第x个开始???
        vHighest = Highest(H,x);
        Commentary("CurrentBar:"+Text(CurrentBar));            
        //EMA
        ema1 = XAverage(C,length1);
        PlotNumeric("ema1",ema1);
        ema2 = XAverage(C,length2);
        PlotNumeric("ema2",ema2);
        ema3 = XAverage(C,length3);
        PlotNumeric("ema3",ema3);
        //MACD
        MACDDiff = XAverage( Close, FastLength ) - XAverage( Close, SlowLength ) ;    
        AvgMACD = XAverage(MACDDiff,MACDLength);
        MACDValue = (MACDDiff - AvgMACD)*2;        
        plt.line("DEA",date+time,AvgMACD);//慢线
        plt.line("DIF",date+time,MACDDiff);//快线
        If (MACDValue >= 0)    { 
            plt.setOption("MACD","color",Red);
            plt.barv("MACD",date+time,MACDValue);
        } Else {
            plt.setOption("MACD","color",Green);
            plt.barv("MACD",date+time,MACDValue);
        }
        plt.line("零线",date+time,0);
        print(Text(FastLength)+","+Text(SlowLength)+","+Text(MACDLength));
    }

    //下一个Bar开始前,重新执行当前bar最后一次,参数为当前bar的图层数组
    OnBarClose(ArrayRef<Integer> indexs)
    {

    }

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

    //策略账户仓更新事件函数,参数pos表示更新的账户仓结构体
    OnStrategyPosition(PositionRef pos)
    {
        
    }

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

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

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

    //通用事件触发函数,参数evtName为事件名称,参数evtValue为事件内容
    OnEvent(StringRef evtName,MapRef<String,String> evtValue) 
    {
        
    }

    //当前策略退出时触发
    OnExit()
    {

    }

x=3时,输出从第3个Bar开始

x=20时,输出从第20个Bar开始

 

kyover

系统自动读取公式最大的回溯范围n,然后图表最开始的n根bar是不出信号不画图的,因为所有计算结果都因为样本不足而可能出错

2022-01-17 15:31
您未登录,请先 登录注册 后发表评论
顶部