FAQ > 金融建模 > 建模问题 > 语法相关

Q:@在天软平台中的使用    

  • @ 在天软中有两种用法:一种是表达式前置符,另一种是多级表头分割符号。
  • 1、表达式前置符
    天软中有很多函数的参数是表达式,比如ema函数,第一个参数即表达式,如计算收盘价的10日移动平均,则用ema(close(),10)来计算。但是,对于用户的需求,可能不是简单的对收盘价计算移动平均,也许是需要计算(high()+low())/2-close()的N和M日移动平均,且多次用到了该表达式。比如计算这个表达式的ma值、ema和sma值,并且需要计算长期N 日和短期M日的平均值。
    此时,为了函数的可读性和简便性,我们会把这个表达式赋值到一个变量中。如果是直接赋值,如exp:= (high()+low())/2-close(),会把表达式计算出来的值给赋值到exp,也就是说exp存贮的是一个值,而不是表达式了。
    那么,要exp表示为一个表达式,而不是表达式计算出来的值,则需要在表达式前面加一个表达式前置符@进行标识:
      exp:=@((high()+low())/2-close())
    此时,exp即为一个表达式。该表达式需要用eval计算其值。如:
      v1:=ema(eval(exp),N);
    比如我们常用到的KDJ指标即有这样的应用(多次用到K值的表达式)。用户可查看函数KDJ_f的函数体。
    范例:

      exp:=@((high()+low())/2-close());
      return nday(100, 'time',datetostr(sp_time()),
            '10日',ema(eval(exp),10),
            '20日',ema(eval(exp),20),
            '60日',ema(eval(exp),60));

    部分结果如下截图:


    图形如下:
  • 2、多级表头分割符号
    如用户需要一级和二级表头时,可用@或者()进行分级。

    表头分割符用法
    @一级表头@二级表头
    ()二级表头(一级表头)


    范例1:@用法

      setsysparam(pn_stock(),'SH000001');
      setsysparam(pn_cycle(),cy_1m());
      setsysparam(pn_date(),inttodate(20140430)+16/24);
      stock1:="OF159901";
      Stock2:="OF510050";
      name1:=stockname(stock1);
      name2:=stockname(stock2);
      return nday(100,'time',datetimetostr(sp_time()),
            name1+'@时点净值',spec(FundIPOV(),stock1),
            name1+'@时点收盘',spec(FundIPOC(),stock1),
            name1+'@折价率(%)',spec((FundIPOV()/FundIPOC()-1)*100,stock1),
            name2+'@时点净值',spec(FundIPOV(),stock2),
            name2+'@时点收盘',spec(FundIPOC(),stock2),
            name2+'@折价率(%)',spec((FundIPOV()/FundIPOC()-1)*100,stock2));

    部分返回结果如表:



    范例2:()用法

      setsysparam(pn_stock(),'SH000001');
      setsysparam(pn_cycle(),cy_1m());
      setsysparam(pn_date(),inttodate(20140430)+16/24);
      stock1:="OF159901";
      Stock2:="OF510050";
      name1:=stockname(stock1);
      name2:=stockname(stock2);
      return r:=nday(100,'time',datetimetostr(sp_time()),
            '时点净值('+name1+')',spec(FundIPOV(),stock1),
            '时点收盘('+name1+')',spec(FundIPOC(),stock1),
            '折价率(%)('+name1+')',spec((FundIPOV()/FundIPOC()-1)*100,stock1),
            '时点净值('+name2+')',spec(FundIPOV(),stock2),
            '时点收盘('+name2+')',spec(FundIPOC(),stock2),
            '折价率(%)('+name2+')',spec((FundIPOV()/FundIPOC()-1)*100,stock2));

    结果同上范例。