以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  论坛上的SAR算法如何理解  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=79100)

--  作者:sadrick
--  发布时间:2015/5/27 18:35:53
--  论坛上的SAR算法如何理解

下面的黄色部分  我觉得有点多余  但去掉的话又和原图偏离  请指教!!!!




INPUT:CYC(10,1,100,2);
RUNMODE:0; //使用逐周期运行模式

 

//保证variable声明的变量都尽量在公式的最前面,防止带有IF语句的分支执行影响变量的初始化
variable:Step = 2 / 100; //步长
variable:fMax = 20 / 100; //最大值

 

variable:sarx=0;
variable:Trend=0;
variable:EP=0;
variable:AF=0;

 

//计算高点低点的值放到IF前面,防止前面语句直接退出导致最前CYC个周期的数据无法统计到
highprice:=ref(hhv(high,cyc),1);
lowPrice:=ref(llv(low,cyc),1);

 

原始SAR:SAR(10,2,20);

 

if barpos <= Cyc then
 exit;//不到CYC的统计周期,直接退出等待下个周期再做判断

if barpos = cyc+1 then
begin
 af:=Step;
 ep:=-1;
 if (high[barpos]-high[barpos-1])+(low[barpos]-low[barpos-1]) > 0 then
 begin
  //看跌
  Trend:= -1;
  sarx:=highprice;
 end
 else
 begin
  //看涨
  Trend:= 1;
  sarx:=lowPrice;
 end
 GOTO ENDANDSHOW;//跳转到末尾直接显示
End

//判断出这些日子数据的上涨,或者下跌
if Trend > 0 then
begin
 //是否为跳转标志
 if ep > 0 then
 begin
  sarx:=lowPrice;
  EP:=-1;
  GOTO ENDANDSHOW;//跳转到末尾直接显示
 end

 
 //如果今日最高价大于前N的最高价,加速因子需要增加
 if high > highprice then
 begin
  af := af+step;
  if af > fmax then
    af := fmax;
 end
 
 fsar := sarx + af * (highprice - sarx);
 //是否跳转
 if fsar > low then
 begin
  trend:=-1;
  ep:=1;
  af:=step;
 end
 sarx:=fsar;
end
else
begin
 if ep > 0 then
 begin
  sarx:=highprice;
  ep:=-1;
  GOTO ENDANDSHOW; //跳转到末尾直接显示
 end

 
 //看跌
 if low < lowPrice then
 begin
  af := af + step;
  if af > fmax then
    af := fmax;
 end
 
 fsar := sarx + af * (lowprice-sarx);
 
 //是否跳转
 if fSar < High then
 begin
  Trend := 1;
  EP := 1;
  AF := Step;
 end
 sarx := fSar;
end

//显示变量
ENDANDSHOW@; //此为语句标号,GOGO语句可以用这个标号直接跳转到这里
ShowSar:sarx;


--  作者:jinzhe
--  发布时间:2015/5/28 8:49:41
--  
请说出理由,论坛里面的是经过验证之后正确的,你的感觉不靠谱
--  作者:sadrick
--  发布时间:2015/5/28 9:43:16
--  如下如题如下
老师  ,或者这样说吧   ,因为sar的算法有很多种 ,特别是转折点的定义 , 所以我可以接受金字塔的写法 ,但我还没弄清楚金字塔控制语句的语法机制,所以感觉怪怪的  ,,,
比如说当某个点的SAR满足最后的的那段条件并执行
if fSar < High then
 begin
  YTrend := 1;
  EP := 1;
  AF := Step;
 end
 sarx := fSar;


此时的ytrend和EP 被重新赋予1的值 

当计算下一个点时 ,公式是否从头到尾再算一遍????如果又重新整个公式算一遍  ,那么上面这样的赋值好像没意义  因为公式的一开始
又执行了一遍 
 if barpos = cyc+1 then
 begin
 af:=Step;
 ep:=-1;

或者新的点计算是从哪里开始 ,,, 从我自己手工计算比照了一下  ,似乎新的点是从下面那里开始的,,为什么可以这样
if YTrend > 0 then
begin
 //是否为跳转标志
 if ep > 0 then
 begin
  sarx:=lowPrice;
  EP:=-1;
  GOTO ENDANDSHOW;//跳转到末尾直接显示
 end
 麻烦老师解答   因为我想将文华的模型里的sar改成金字塔语言的,谢谢!

--  作者:jinzhe
--  发布时间:2015/5/28 10:10:29
--  
不会,
 if barpos = cyc+1 then
这个条件限定了,只会在当前k线图第11根k线判断一次,后面的k线不会重复判断
[此贴子已经被作者于2015/5/28 10:10:46编辑过]

--  作者:sadrick
--  发布时间:2015/5/28 11:07:55
--  如下如题如下
这里的限制条件弄明白了

但上面的例子还有疑惑

当上一个点满足最后的那段条件
if fSar < High then
 begin
  YTrend := 1;
  EP := 1;
  AF := Step;
 end
 sarx := fSar;
此时的ytrend和EP 被重新赋予1的值 


到下一个点计算时 , 为什么可以用上一个点被新赋值的ytrend和ep(等于1)作为条件     从下面的句子开始重新判断计算  这里有什么机制  有种循环的现象
if YTrend > 0 then
begin
 //是否为跳转标志
 if ep > 0 then
 begin
  sarx:=lowPrice;
  EP:=-1;
  GOTO ENDANDSHOW;//跳转到末尾直接显示
 end



这里是最不明白的  麻烦老师讲解一下
[此贴子已经被作者于2015/5/28 11:09:06编辑过]

--  作者:jinzhe
--  发布时间:2015/5/28 11:28:42
--  

这里已经判断是否跳转了,

 

 //是否跳转
  if fSar < High then
  begin
    trend1 := 1;
    EP := 1;
    AF := Step;
  end
 sarx := fSar;
end

 

 

要fSar < High 这条件满足之后,才会赋值,同时表示跳转


--  作者:sadrick
--  发布时间:2015/5/28 12:37:17
--  如下如题如下
不好意思  我表达不清楚

我是说假设上个点已经满足条件fSar < High并重新赋值 
    trend1 := 1;
    EP := 1;

新的一根BAR时,再次从下面代码开始计算 ,  为什么可以用上一个点的ytrend和EP(重新被赋值等于1)的值作为新的一个点的判断条件, 是IF的机制可以可样使用吗
if YTrend > 0 then
begin
 //是否为跳转标志
 if ep > 0 then
 begin
  sarx:=lowPrice;
  EP:=-1;
  GOTO ENDANDSHOW;//跳转到末尾直接显示
 end
 。。。

。。。

。。。



  


  

--  作者:jinzhe
--  发布时间:2015/5/28 13:19:50
--  
根据上跟k线的结果来进行计算,这个有什么不对吗?
--  作者:sadrick
--  发布时间:2015/5/28 13:25:43
--  如下如题如下
因为一般我们学的简单模型语句都是根据这根K已定义的变量来计算 ,要判断条件 也是使用这根K的值 , 很少用上一根K的变量的值 , 要用的话又要重新定义一次变量  ;而这里似乎就可以循环使用 

按照老师的说法  我举个例子


我原本的想法是 ,5 10 均线金叉就将1的值赋予A和B  ,之后每一根bar b的值加1  ,直到新的金叉产生 ,又重新将1赋值给AB  但写出来之后   B的值指挥不断增加 ,即新的金叉条件成立 也一样  请问哪里出问题了,,麻烦老师!  



VARIABLE:A=0;
VARIABLE:B=0;


ma5:=ma(c,5);
ma10:=ma(C,10);


IF  CROSS(MA5,MA10) THEN
 BEGIN
 A:=1;
 B:=1:
  GOTO ENDANDSHOW;/
 END

IF A>0 THEN
 B:=1+B;

ENDANDSHOW@; 
SA:A;
SB:B; 
 
 
 

--  作者:jinzhe
--  发布时间:2015/5/28 13:26:37
--  

这个不是循环的值,而是全局变量

用variable定义全局变量之后,

后面计算的值,都是根据上一根k线计算的