金字塔决策交易系统

标题: 如何定义并同时初始化一个元素类型是非数值(比如字符串)的VARIABLE数组变量 [打印本页]

作者: 代人发帖    时间: 2025-2-24 13:03
标题: 如何定义并同时初始化一个元素类型是非数值(比如字符串)的VARIABLE数组变量
请教:1.能否针对VARIABLE给详细的说明? 目前PEL手册上的说明太简单;a.没有说明VARIABLE全局变量和序列变量的区别.  b.没有说明如何定义一个用户自定义的序列变量;  c.没有示例说明
如何定义并同时初始化一个元素类型是非数值(比如字符串)的VARIABLE数组变量  


作者: 技术009    时间: 2025-2-24 13:22
本帖最后由 技术009 于 2025-2-24 13:31 编辑

1.区别在于初始化方式以及生命周期。
普通序列变量 本质上每个K都会初始化一次,全局则只在第一个K进行一次初始化,后续需要自己实现赋值逻辑 ,其值才会更新。

2.PEL不会强制类型。定义字符串,直接赋值就行了。
函数说明里直接就有范例的:

VARIABLE:X:=1,Y:=CLOSE,ARR[10]:=0,SARR[5]:='STR';
表示定义常数变量X并初始化为1,
申明序列变量Y并初始化为收盘价,
申明含10个浮点数的数组并全部初始化为0
申明含5个字符串的数组并都初始化为'STR'

需要留意的是VARIABLE 的作用是定义全局变量 或者一个内部数组,不能混淆了。

作者: hanzi-999    时间: 2025-2-24 14:21
谢谢! 几个PEL问题:
  1) 变量的声明即定义吗?
  2) 声明普通序列变量而不初始化,该如何写 ?
  3) 我想定义一个普通序列变量,该变量并非CLOSE而是我自己的用户自定义数值比如X,目的是计算该值的10周期EMA值(EMA(X,10),我该如何写?        
  4)SARR[5]:='STR' 的意思是 每个数组元素的值都初始化为'STR'吗?

补充内容 (2025-2-24 15:02):
针对4) 若需求是数组SARR[5]的每个元素是不同的(放不同的字符串),那么该如何声明使仅初始化一次呢?
作者: 技术006    时间: 2025-2-24 15:01
hanzi-999 发表于 2025-2-24 14:21
谢谢! 几个PEL问题:
  1) 变量的声明即定义吗?
  2) 声明普通序列变量而不初始化,该如何写 ?

1.参考这个
https://www.weistock.com/docs/PE ... AE%9A%E4%B9%89.html

2.直接用:=
3.例如:aaa=ema(close,10);
4.是的。
作者: hanzi-999    时间: 2025-2-24 15:07
针对2) 烦请给具体例子.   
针对你的回复3,这个close并非我自定义的序列变量.
我想建立一个序列变量, 里面的值是我自定义的数值,而非CLOSE,OPEN,HIGH这些   
针对4) 若需求是数组SARR[5]的每个元素是不同的(放不同的字符串),那么该如何声明使仅初始化一次呢?
作者: 技术006    时间: 2025-2-24 15:15
hanzi-999 发表于 2025-2-24 15:07
针对2) 烦请给具体例子.   
针对你的回复3,这个close并非我自定义的序列变量.
我想建立一个序列变量,  ...

2、对于没有明确声明的变量,首次使用:=时,就等于声明了。 随意直接就是AA:=MA(CLOSE+10,10);

3.没有区别,只要是序列变量都能完成计算。直接是就是AAA:=EMA(X,10);
这里的X可以是任意序列变量。

4.是的。你可以考虑定义成一个空字符串完成初始化声明,之后对SARR进行逐个元素的赋值。(元素操作只有这一种途径)



作者: hanzi-999    时间: 2025-2-24 16:08

关键是这个自定义数值的序列变量不知道如何声明和定义
CLOSE是系统自带的,而我是需要根据每根K的数据计算出x,然后将其存入序列,再计算EMA(X,10)
作者: 技术006    时间: 2025-2-24 16:11
hanzi-999 发表于 2025-2-24 16:08
关键是这个自定义数值的序列变量不知道如何声明和定义
CLOSE是系统自带的,而我是需要根据每根K的数据计 ...

x:(close+10)/2;
类似这种,说白了就是你把你要计算的出x的算法赋值给x就行。
作者: hanzi-999    时间: 2025-2-24 16:18
但是我的 x的值是用STKINDIEX调用其他指标得到的,不是个序列值.   

补充内容 (2025-2-24 16:20):
你这个示例中, close本身就是序列变量所以得到的x自然也是序列变量. 而我没法利用序列变量来建立序列变量

补充内容 (2025-2-24 16:22):
我是逐K模式,当是最新K时,调用子指标得到一个数值,然后想追加到序列变量里,然后利用序列变量计算EMA值
作者: 技术006    时间: 2025-2-24 16:21
hanzi-999 发表于 2025-2-24 16:18
但是我的 x的值是用STKINDIEX调用其他指标得到的,不是个序列值.

STKINDIEX返回的本身就是序列值。你直接给出你调用的指标的算法变量,我们看下
作者: hanzi-999    时间: 2025-2-24 16:25
A:=(C/REF(C,1)-1)*100;
B:=-(REF(C,1)/C-1)*100;

BZJ:=TACCOUNT(41);
T:=REF(C,1)<C;
TK:=IF(T,A,B);
BTK:=TK/BZJ;

DB:=BTK;
DBZ:SUM(DB,0);

补充内容 (2025-2-24 16:26):
custom_value := STKINDIEX(contract_array, 'X.DBZ', 0, -1, 0, 20);
作者: 技术006    时间: 2025-2-24 17:23
DBZ变量本身就是序列变量。引用过来之后它同样是一个序列变量。
作者: hanzi-999    时间: 2025-2-24 23:00
技术009 发表于 2025-2-24 13:22
1.区别在于初始化方式以及生命周期。
普通序列变量 本质上每个K都会初始化一次,全局则只在第一个K进行一 ...

你好! 定义数组时为什么要加variable关键字(我知道variable关键字是表示全局变量),而不可直接用ARR[10] 或Y:=CLOSE 呢?

补充内容 (2025-2-24 23:01):
你好! 定义数组时为什么要加variable关键字(我知道variable关键字是表示全局变量),而不可直接用ARR[10]:=0 或Y:=CLOSE 呢?
作者: admin    时间: 2025-2-24 23:41
hanzi-999 发表于 2025-2-24 23:00
你好! 定义数组时为什么要加variable关键字(我知道variable关键字是表示全局变量),而不可直接用ARR[10]  ...

这是pel的语法要求。variable不单单代表生命全局变量。也代表声明数组
作者: hanzi-999    时间: 2025-2-27 11:14
admin 发表于 2025-2-24 23:41
这是pel的语法要求。variable不单单代表生命全局变量。也代表声明数组

你好!  
1.我能否这样理解: variable 声明的既是数组又是全局变量. 因为这种全局变量实际是由数组来实现的.    这个理解对吗?
2.如何定义全局数组变量? 因为有说明里说: variable:A[10]=0; //定义一个含10个元素的数值型数组A,并把所有元素初始化为0;
这个只说明定义了数组,那全局数组变量又该如何定义?
作者: 技术006    时间: 2025-2-27 11:17
本帖最后由 技术006 于 2025-2-27 11:26 编辑
hanzi-999 发表于 2025-2-27 11:14
你好!  
1.我能否这样理解: variable 声明的既是数组又是全局变量. 因为这种全局变量实际是由数组来实现 ...

1. 不是,variable 是关键字,它只是具备2种功能
2.没有所谓的全局数据,数据就是数组,

注:在pel中,基本不会使用到数组,因为pel对所有基于逐根计算k线的结果,都是序列变量。
而数组本质上是在一根k上反复赋值操作处理,如果是K线和k线之间是横向关系,那数组是基于k线内部的垂直处理的。

作者: hanzi-999    时间: 2025-2-27 11:56
技术006 发表于 2025-2-27 11:17
1. 不是,variable 是关键字,它只是具备2种功能
2.没有所谓的全局数据,数据就是数组,

1)那么数组是不是有全局变量的作用?
2)但是,很多程序需要全局数组来高效处理业务逻辑,所以我需要用到全局数组

作者: 技术006    时间: 2025-2-27 12:57
本帖最后由 技术006 于 2025-2-27 12:59 编辑
hanzi-999 发表于 2025-2-27 11:56
1)那么数组是不是有全局变量的作用?
2)但是,很多程序需要全局数组来高效处理业务逻辑,所以我需要用到全 ...

1.不是
2.PEL是封装后的脚本语言,不能等同视为C这类的语言中的。使用它的目的就是为了降低编程的难度。正常情况下,策略开发都是直接把需要的结果赋值给变量,那就是一个序列变量。在PEL中,没有所谓的搞成数组形态就会效率更高


作者: hanzi-999    时间: 2025-2-27 13:25
1.不是的话,在策略需要对50个品种的指标数据建立50个全局变量, 对于代码来说编写很低效. 因为没有全局变量数组

作者: 技术006    时间: 2025-2-27 13:42
hanzi-999 发表于 2025-2-27 13:25
1.不是的话,在策略需要对50个品种的指标数据建立50个全局变量, 对于代码来说编写很低效. 因为没有全局变量 ...

引用策略直接都是赋值给一个变量即可。不过是需要你逐个赋值。即使是使用数组也只能像下面的结构进行。

VARIABLE: X[5]:=0;
X[1]:=STKINDI('CU00','KDJ.K',0,6,0);
X[2]:=STKINDI('RU00','KDJ.K',0,6,0);
X[3]:=STKINDI('M00','KDJ.K',0,6,0);
X[4]:=STKINDI('CF00','KDJ.K',0,6,0);
X[5]:=STKINDI('IF00','KDJ.K',0,6,0);




欢迎光临 金字塔决策交易系统 (https://www.weistock.com/BBS/) Powered by Discuz! X3.4