以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  这个指标修改后要怎么引用它不同参数的线?  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=188015)

--  作者:300qh
--  发布时间:2021/4/23 15:40:24
--  这个指标修改后要怎么引用它不同参数的线?
input:n10(10,1,100,1),n2(2,1,100,1),n20(20,1,1000,1);
x1:SAR(n10,n2,n20),CIRCLEDOT;
x2:SAR(10,1,20);
x3:SAR(10,3,40);
这个抛物线指标一句话,一个参数就表示一根不同的线了。那么论坛中的这种PEL写的格式,我想画出它不同参数的线要怎么弄?
还是只能用引用任意指标的函数?还是可以创建成函数直接调用?
-----------------------------------------------------------------------------------------------------------------?


使用金字塔PEL语言实现的SAR算法,可以加工用户特定的移动止损功能  发帖心情 Post By:2010/10/24 16:24:47 [只看该作者]

//sar是个很有用的处理止损功能的函数,由于算法特殊,普通的软件的公式系统是无法进行描述的,这里我们将向大家展示金字塔PEL语言强大的算法描述功能,可以简单实现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;


--  作者:FireScript
--  发布时间:2021/4/23 15:58:10
--  
 这个只能用跨指标调用了。

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

 

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

这几个其实就是对应sar的三个参数了。所以可以把后面2个参数化。

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

 

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

这样跨指标调用时候 CYC,M,N分别就是sar的三参数了。
剩下的就是跨指标调用了。比如指标名称为X:
不跨品种和周期的话,下面这样调用即可
x:"X.ShowSar"(10,5,20);
sary:sar(10,5,20);


图片点击可在新窗口打开查看此主题相关图片如下:temp.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2021/4/23 16:04:36编辑过]

--  作者:FireScript
--  发布时间:2021/4/23 15:59:37
--  
另外你这个sar实现里面 Trend 现在是函数名称了。不能用这个名字了,你统一改下就了。

--  作者:300qh
--  发布时间:2021/4/23 20:24:05
--  
知道了,谢谢你了
--  作者:300qh
--  发布时间:2021/4/24 16:24:58
--  
如果模型里面全是这样的引用,并开多窗口,运行速度与正常指标一样吗?
--  作者:FireScript
--  发布时间:2021/4/25 9:07:28
--  
 如果引用太多,恐怕会影响到整体的运行速度的。你可以试下,因为每个人本地情况不一样,界限没那么明确的其实。