公式怎么用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公式修改和重写的权利
//------------------------------------------------------------------------


公式用tbl语言怎么写
函数可以用onbar吗
longEntries要怎么用 ?
怎么一会儿用begin一会儿用event?
OnPosition这个功能怎么用?
春节 用TB怎么写?
老师怎么设置默认公式
大盘指数???怎么量化公式
在OnBar里执行策略前判断BarStatus==2 再执行有什么用
商品插入公式怎么保存

实在是听不懂你在问什么。

看你代码里写的样式似乎是一个用户函数,但是你又问的是公式。

公式和函数的区别在零基础课程里应该是有解释过的,属于很基础的概念。

函数是没有onbar这种驱动域的。函数像是一种插件一样,你想让他什么时候驱动,那你就放到模型的对应驱动域里就行了,怎么会在函数里写驱动域,这结构不就乱套了吗