公式怎么用onbar?
公式怎么用onbar? 计算指标需要历史行情, 但是公式好像用不了onbar怎么办???//------------------------------------------------------------------------ // 简称: GET_ADX // 名称: // 类别: 用户函数 // 类型: 用户函数 // 输出: 数值型 //------------------------------------------------------------------------ Params Numeric DMI_N(14); //DMI的N值 Numeric DMI_M(30); //ADX均线周期 ,DMI的M值 Numeric AvgLen(30); //最高最低价的EMA周期数 Numeric EntryBar(2);//保持BuySetup触发BAR数 Vars //DMI最终输出 Series<Numeric> oDMIPlus; Series<Numeric> oDMIMinus; Series<Numeric> oDMI; Series<Numeric> oADX; Series<Numeric> oADXR; Series<Numeric> oVolty; //DMI过程计算 Series<Numeric> sDMI; Series<Numeric> sADX; Series<Numeric> cumm; Series<Numeric> sVolty; Numeric PlusDM; Numeric MinusDM; Numeric UpperMove; Numeric LowerMove; Numeric SumPlusDM(0); Numeric SumMinusDM(0); Numeric SumTR(0); Series<Numeric> AvgPlusDM; Series<Numeric> AvgMinusDM; Numeric SF; // smoothing factor Numeric Divisor; Numeric i; Series<Numeric> TRValue; //-------------------- Series<Numeric> ADXValue(0); //计算ADX均线 Begin //此处添加代码正文 Events OnInit() { Range[0:DataCount-1] { //=========数据源相关设置============== AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权 AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格 AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓 AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算 } } OnBar(ArrayRef<Integer> indexs) { Range[0:DataSourceSize() - 1] { {//DMI指标计算, 最终将输出ADX指标 //--------------------------DMI计算开始-----------------------------------// SF = 1/DMI_N; TRValue = TrueRange; If(CurrentBar == DMI_N) { For i = 0 To DMI_N - 1 { PlusDM = 0 ; MinusDM = 0 ; UpperMove = High[i] - High[ i + 1 ] ; LowerMove = Low[ i + 1 ] - Low[i] ; If (UpperMove > LowerMove And UpperMove > 0 ) { PlusDM = UpperMove; }Else if (LowerMove > UpperMove And LowerMove > 0) { MinusDM = LowerMove ; } SumPlusDM = SumPlusDM + PlusDM ; SumMinusDM = SumMinusDM + MinusDM ; SumTR = SumTR + TRValue[i] ; } AvgPlusDM = SumPlusDM / DMI_N ; AvgMinusDM = SumMinusDM / DMI_N ; sVolty = SumTR / DMI_N ; }Else if(CurrentBar > DMI_N) { PlusDM = 0 ; MinusDM = 0 ; UpperMove = High - High[1] ; LowerMove = Low[1] -Low ; If (UpperMove > LowerMove And UpperMove > 0 ) { PlusDM = UpperMove; }Else if (LowerMove > UpperMove And LowerMove > 0 ) { MinusDM = LowerMove ; } AvgPlusDM = AvgPlusDM[1] + SF * ( PlusDM - AvgPlusDM[1] ) ; AvgMinusDM = AvgMinusDM[1] + SF * ( MinusDM - AvgMinusDM[1] ) ; sVolty = sVolty[1] + SF * ( TRValue - sVolty[1] ) ; }Else { oDMIPlus = InvalidNumeric; oDMIMinus = InvalidNumeric; oDMI = InvalidNumeric; oADX = InvalidNumeric; oADXR = InvalidNumeric; oVolty = InvalidNumeric; } If (sVolty > 0) { oDMIPlus = 100 * AvgPlusDM / sVolty ; oDMIMinus = 100 * AvgMinusDM / sVolty ; }Else { oDMIPlus = 0 ; oDMIMinus = 0 ; } Divisor = oDMIPlus + oDMIMinus ; if (Divisor > 0) { sDMI = 100 * Abs( oDMIPlus - oDMIMinus ) / Divisor; }else { sDMI = 0 ; } cumm=Cum( sDMI ); If(CurrentBar > 0) { If (CurrentBar <= DMI_N) { sADX = Cumm / CurrentBar ; oADXR = ( sADX + sADX[ CurrentBar - 1 ] ) * 0.5 ; }Else { sADX = sADX[1] + SF * ( sDMI - sADX[1] ) ; oADXR = ( sADX + sADX[ DMI_M - 1 ] ) * 0.5 ; } } oVolty = sVolty; oDMI = sDMI; oADX = sADX; //--------------------------DMI计算结束-----------------------------------// ADXValue = oADX; //计算ADX均线 } ParabolicSAR(SARStep, SARMax , oParCl, oParOp, oPosition, oTransition ) ; PlotAuto( "ParCl" , oParCl,0,Rgb(185,150,0),Enum_Dot) ; Commentary(Text(oParCl));Commentary(Text(oParOp));Commentary(Text(oPosition)); Commentary(Text(oTransition));//1 或 -1_多转空 为反转,0 为保持不变 AVG_VOL=AverageFC(Vol[1], VOL_Length); EMA1 = XAverage(close[1], EMA_Length1); PlotNumeric("EMA1",EMA1); EMA2 = XAverage(close[1], EMA_Length2); PlotNumeric("EMA2",EMA2); EMA3 = XAverage(close[1], EMA_Length3); PlotNumeric("EMA3",EMA3); SARsig[0]=oTransition;//oPosition;// Commentary(Text(MarketPosition)); // 根据信号进行交易 (False||()) //BAD!! AND 00*ADXValue[1] < ADXValue[2] ,,VOL[1]>0.8*AVG_VOL If( (SARsig[1]==1) AND //(EMA1 > EMA2 And EMA2 > EMA3) AND //low[1]>1*EMA1 AND //ADXValue[1] > 1*30 AND //OpenInt[1]>1*OpenInt[2] AND ////VOL[1]>0.7*AVG_VOL And MarketPosition != 1)//-1表示当前位置为持空仓,0表示当前位置为持平,1表示当前位置为持多仓 { Buy(1, Open);} //Else If( (SARsig[1]==-1) AND //(EMA1 < EMA2 And EMA2 < EMA3) AND //1*high[1]<EMA1 AND //ADXValue[1] > 1*30 AND //OpenInt[1]>1*OpenInt[2] AND //////VOL[1]>0.7*AVG_VOL And //MarketPosition != -1) //{ //SellShort(1, Open); } //// 平仓条件: SAR反转平仓 , 浮动止损? If (MarketPosition == 1 And SARsig[1]==-1) { Sell(0, Open); // 平多仓 } Else If (MarketPosition == -1 And SARsig[1]==1) { BuyToCover(0, Open); // 平空仓 } } } Return 0; End //------------------------------------------------------------------------ // 编译版本: 2025/01/08 001830 // 版权所有 BestTrader // 更改声明 TradeBlazer Software保留对TradeBlazer平台 // 每一版本的TradeBlazer公式修改和重写的权利 //------------------------------------------------------------------------