//------------------------------------------------------------------------
// 简称: Pivot
// 名称: 求转折
// 类别: 用户函数
// 类型: 内建函数
// 输出: 布尔型
//------------------------------------------------------------------------
Params
Series<Numeric> Price(1); //数值型序列值
Numeric Length(10); //周期数
Numeric LeftStrength(1); //转折点左边Bar数
Numeric RightStrength(1); //转折点右边Bar数
Numeric Instance(1); //波峰点回溯值 在一定范围内,高低点不一定只有一个,可能有多个。这个参数可以确定要找的高低点到底是哪个。
//顺序按从当前bar往前回溯来确定,例如,2表示从现在往前回推第二个满足条件的高低点。
Numeric HiLo(1); //1 - 求高点, -1 - 求低点
NumericRef PivotPrice; //转折点数值
NumericRef PivotBar; //转折点回溯索引
Vars
Numeric CandidatePrice( 0 );//候选价格容器
Numeric LengthCntr( 0 ); //当前进行判断的bar的回溯值,也就是头部的回溯值。这个头部是待判断的头部。例如,如果值为3,表示现在正在判断往前数第三根bar是否为转折点
Numeric StrengthCntr( 0 ); //用来表示 左右肩部bar的回溯值
Numeric InstanceCntr( 0 ); //用来给找到的转折点编号。一开始是0,找到一个就加1。如果编号递延到参数要求的instance,就表示找到了目标转折点,那么函数就可以结束了。
Bool PivotTest( False); //用来表示当前进行判断的bar是否是一个转折点
Bool InstanceTest( False ) ;//用来表示当前处理的这个转折点是不是参数设定需要找到的最终结果。
Begin
InstanceCntr = 0 ;
InstanceTest = False ;
LengthCntr = RightStrength ; //因为转折点离当前bar的距离不可能小于转折点右边bar数(想想为什么?),直接从右边bar数开始的回溯数量开始判断,节省运算
While (LengthCntr < Length && (!InstanceTest ))//如果左边候选长度小于周期 并且 instancetest为否
{
CandidatePrice = Price[LengthCntr] ;//取bar上的数值作为候选价格
PivotTest = True ; //这个价格还需要进行转折点测试,判断是不是转折点
StrengthCntr = LengthCntr + 1 ; //strengthcntr往前推动一格,表示目标bar左边一格bar
While (PivotTest && StrengthCntr - LengthCntr <= LeftStrength )//这个while开始进行转折点判断,先判断左边能不能满足
{
If (( HiLo == 1 And CandidatePrice < Price[StrengthCntr] ) Or ( HiLo == -1 And CandidatePrice > Price[StrengthCntr] ))
//求高点 预选价格比price[str]低 或者求低点 预选价格比price高
PivotTest = False;//测试没通过
Else//求高点 预选价格比price[str]高 或者求低点 预选价格比price低
StrengthCntr = StrengthCntr + 1 ;//继续向左移动 直到把参数里要求的左边bar数全部判断过为止
}
StrengthCntr = LengthCntr - 1 ; //strengthcntr从头部位置向右一动一格。
While (PivotTest && (LengthCntr - StrengthCntr) <= RightStrength )//这个while开始循环判断右边能不能满足,下面的语句类似上面向左判断
{
If (( HiLo == 1 And CandidatePrice <= Price[StrengthCntr] ) Or ( HiLo == -1 And CandidatePrice >= Price[StrengthCntr] ))
PivotTest = False;
Else
StrengthCntr = StrengthCntr - 1 ;//继续向右移动 直到把参数里要求的右边bar数全部判断过为止
}
If (PivotTest) //在上面两个while循环中,如果有bar判断出来不符合条件,pivottest会变成false。如果全都符合,表示找到了一个符合参数给定条件的转折点。
InstanceCntr = InstanceCntr + 1 ;//找到了一个,innstancecntr编号加一。
If (InstanceCntr == Instance) //判断这个找到的转折点编号是否就是输入参数里要求找的那个。如果是,instancetest表示找到了结果
InstanceTest = True;
Else
LengthCntr = LengthCntr + 1 ;
}
If (InstanceTest ) //如果已经找到了结果
{
PivotPrice = CandidatePrice ;//用引用型参数返回高低点
PivotBar = LengthCntr ; //用引用型变量返回回溯距离
Return True;
}Else //这里表示没有找到结果
{
PivotPrice = -1 ; //返回-1表示没找到
PivotBar = -1 ;
Return False;
}
End
//------------------------------------------------------------------------
// 编译版本 GS2010.12.08
// 版权所有 TradeBlazer Software 2003-2025
// 更改声明 TradeBlazer Software保留对TradeBlazer平
// 台每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
老师,我是小白,能帮我写个程序吗?15931619461
另外,有一个Pivot函数,怎用?
复制代码,编译不过去
刘老师,如果想在tbquant里回测美原油,我需要怎么做?
刘老师,算法的原理能不能大概讲一下,或者有相关资料 ,贴下链接,谢谢您
这个暂时没有.....等下期再讲一遍看看视频
建议仔细看看注释 注释就是为了说明算法的
好的,谢谢刘老师
刘老师,明天如果开课的话,能不能课堂上简略的提一下pivot,zigzag的算法原理,和老师讲的对一下,怕理解上有偏差!
这周内容已经定好了 等后面吧
好的