公式怎么用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公式修改和重写的权利
//------------------------------------------------------------------------
实在是听不懂你在问什么。
看你代码里写的样式似乎是一个用户函数,但是你又问的是公式。
公式和函数的区别在零基础课程里应该是有解释过的,属于很基础的概念。
函数是没有onbar这种驱动域的。函数像是一种插件一样,你想让他什么时候驱动,那你就放到模型的对应驱动域里就行了,怎么会在函数里写驱动域,这结构不就乱套了吗