-
从一无所知开始学习交易开拓者(
TB
)期货程序化交易编程
经常会看到很多朋友
问
:
帮我写个公式怎么样啊
?
帮我把某个公式改成
TB
的怎么样啊
?
我想出现这种情况的原因有两种
:
一是真的不会
,
毕竟做期货的会编程的不多
p>
;
二是自己如果多花点时间的话是弄的出来
,
但是有点懒
;
我想无论是哪种原因
,
都应该好好的学习下
TB,
因为真正的你的交易思路只有你自己才清楚
而且也只有你自己去把你的交易思路用
TB
表现出来你才能更清楚的知道你的交易思维中有何缺点
但是编程不是一件很容易的事情
,
当然
,
如果您入门了
,
你会发觉
TB
编程其实和泡妞一样的简单
< br>,
就看你敢不敢下手
了
所以本文仅是写给完全不懂编程的朋友的
,
仅是最基本的入门资料
,
如果您
是高手
,
请忽略此文
,
以免耽误您的时间
.
我先
不说那些专业术语
,
什么变量
,
函数和语法的
,
我们先不管他
,
以免看的头晕
.
我想先说
说在
TB
中代码的执行顺序
,
也就是说在
TB
的
K<
/p>
线图
(TB
把
K
线叫做
Bar)
里面你写的公式或者指
标是如
何得到执行的
;
我想这个东西是最重要而且也是最好理解的
.
在其他的期货软件比如文华飞狐一类
,
我们是无法知道
你写的公式是如何执行的
,
甚至我们不知道我们写出来的公
p>
式是不是真的
就体现出了我们的思想
p>
,
因为你写的公式或者指标是被这些软件在幕后进行处理的
,
是黑箱操作
!
而<
/p>
TB
不同
,
我们
能够清楚的看到你写的代码在任意一根
K
线上是如何得到执行的
!!!!
好了
,
先说说在
TB
里面代码是如何得到执行的
< br>.
1,
代码从第一根
K
线开始执行
,
一直到最后一根
K
线
;
2,
在每一根
K
线上
,
代码都是从第一行开始执行
,
一直到最后一行
p>
;
明白了吧
,
是不是很简单
,
我们先看一个小例子<
/p>
,
如果您还不明白
,
那只能说我完全没有任何能力写这文章
,
您就板砖
吧
我们就写个输出每日的收盘价的例子
;
打开
TB,
在左边的
TB
公式里面
,
点击新建技术指标
,
新建其他的也没有关系
,
然后在
出来的对话框的简称里面填入名
字
,
记
住
,
这个名字只能是
E
文哦
在名字里面填入你喜欢的名字
< br>,
点确定就
OK
了啊
然后在出来的公式编辑器里面输入
Begin
End
注意
,
除了参数和变量定义外
,
所有的代码都必须包含在
Begin
和
End
之间
意思很简单
就是
Begin
后
,
你的代码就开始执
行了
,End
了
,
你的代码就执行完毕拉
呵呵
<
/p>
我们再在
Begin
和
< br>End
之间输入一些代码
,
完整
的就是
:
Begin
File
Append(
年
月
< br>
日的收盘价等于
FileAppend(
End
我们再说说这两行代码是什么意思
F
ile
就是文件
,Append
就是添
加
,
现在明白了吧
< br>FileAppend
就是添加一个文件
,
文件名是什么呢
?
就是你后面写的
< br>,
这个文件的路径在哪里呢
?
就
是
c:
里
面的
C
盘
,
且在这个文件里面添加一行东西
,
这行东西的内容就是你后面所写的
Text(Year)+
年
月
日的收盘价等于
当然<
/p>
,
如果这个文件已经存在
,
他就不会添加文件了
,
仅仅在这个文件的后面添加一
行上面你写的内容
好了
,
再看看
Text,Text
的意思就是把那些不是
字符串的东西如数字啊
,
等变成字符串
.
而
Year,Month,Day
就
代表了
正在执行你写的代码的那一根
K
线的年
,
月
,
日
,
年月日是数字
< br>,
我们当然要用
Text
把它搞
成字符串
,
不然
Windows
会告诉你你犯了错误的
Close
的意思我不说大家也明白了吧
,
就是代表了当前
正在执行你的代码的那根
K
线的收盘价啊
,
呵呵
,
如果代码执
行到最后的那根
K
线
且行情正在走动的时候
Close
代表的就是
现在的最新价了咯
.
好了
我们点公式编辑器上面的工具栏的第五个按钮
(
打勾的那个东西
),
校验保存公式
,<
/p>
稍微等一下
,
就
OK
了
我们在回到
< br>K
线图里面
,TB
把
K
线图叫做超级图表
,
呵
呵
,
有点不习惯
在
K
线图里面右键
,
选择商品设置
,
然后吧里面的样本数由默认的
300
改成
5,
意思
是让在超级图表里面仅仅显示
5
条
K<
/p>
线
,
当然
,
p>
你可以搞成任意你喜欢的数字
你甚至可以
从任意一个你喜欢的时间开始显示
K
线
,
我们选择
5
跟
K
线仅仅是为了测试的方便
点确定
后
,
你就看到在
K
线图里面只显示了
5
跟
K
线
,
所以我们的代码也仅仅只在这
5
跟
K
线上执行了
当然现在代码还不能被执行
,
因为我们现在还需要把我们刚刚所写的那个指标加到
K
线图上面才能被执行的
我们再在超级图表里面右键
,
选择插入技术分析
,
在出来的列表里面选择我们刚刚所写的技术指标
,
然后确定就
OKl
饿
p>
晕死
,
现在怎么
在
K
线图上没有任何变化啊
?
呵呵
我们上面说了
< br>,
我们这个例子仅仅是把每日的收盘价写到文件里面去啊
,
那么我们找一找文件在什么地方咯
?
FileAppend(
很明显
,
文
件是在
c
盘的
,
文件的名字是
好了
,
我们到
c
盘找到
文件
,
双击打开
,
我们就会看到下面的内容
:
2007
年
9
月
24
日的收盘价等于
67280
2007
年
9
月
25
日的收盘价等于<
/p>
67800
2007
年
9
月
26
< br>日的收盘价等于
67160
2007
年
9
月
27
日的收盘价等于
67300
2007
年
9
月
28
日的收盘价等于
68020
我们现在来分析下
:
首先你写的代码
在第一根
K
线上执行
,
先执行第一行代码
:
FileAppend(
年
月
日的收盘价等于
这行代码就输出了第一根
K
线的年
,
月
,
日
,
就在
文件里输出成
年
9
月
24
日的收盘价等于<
/p>
然后执行第二行代码
:
FileAppend(
折行代码把第一根
K
线的收盘价输出到
文件里面
,
于是就输出了
好了
,
代码在第一根
K
线上执行
完毕
,
于是再转到第二根
K
线
,
再执行第一行代码
,
再执行第二行代码
.........
好了
,
现在代码在第二根
,
第三根
,
第四根
K
线上执行完毕
,
于是转到第五根也就是最后一根
K
线上执行第一行代码
再执行第二行代码
到此为止
,
所有的代码在所有的
K
线上执行完毕了
,
圆满的完成了党和祖国赋予他的神圣使命<
/p>
,
于是也就有了我们
上面所看到的结果<
/p>
:
2007
年
9
月
24
日
的收盘价等于
67280
2007
年
9
月
25<
/p>
日的收盘价等于
67800
2007
年
9
月
26
日的收盘价等于
67160
2007
年
9
月
27
日的收盘价等于<
/p>
67300
2007
年
9
月
28
< br>日的收盘价等于
68020
OK,
下回继续
我一直非常愿意帮助客户们解答在编程中的难点,但是却不大愿意帮助客户写完整的公式策略。这其中有三个
原因:
1
、
别人写的交易策略,你难以调整它。
据统计,
90%
以上的交易策略会在
2
年半之内由于种种原因失效或者效率降低。通常的做法是一个季度左右,
交易员就需要微
调其策略,调整参数或改动某些条件。如果策略不是自己编写的,调整起来就会有困难。
2
、别人写的交易策略,你很难彻底
执行它。
系统交易最重要的好处在于它的执行能力。它可以使
你的交易摆脱人性的弱点,摆脱心理因素的干扰。然而这
一切的基础,在于自信。人只会
信任自己了解的东西,这是人性。如果一个交易策略是别人写的,无论它的测
试报告是多
么天花乱坠,你都不会信任它,因为你不了解它。一旦市场出现了危机情况,你就会坐立不安,你
就会总怀疑是不是策略有问题,然后就又把策略扔到一边,回到凭感觉去操作的老路上去了。
3
、最重要的一点在
于:
编程就是理解
,编写交易策略调试交易策略的过程其实就是
理解市场的过程。这是一
种非常宝贵的积累。大多数人都是通过在市场中亏钱,靠爆仓来
理解市场的。成本高昂,而且难以总结。使用
这种方法来了解市场,往往就算你亏了很多
钱,交了大把学费,你仍然不知道自己到底输在哪里。你总结不出
来,你就不可能有长进
,就不可能赢。而通过写交易策略来了解市场你不需要交什么学费,从历史测试报告里
很
容易分析出来自己到底错在哪里,如此你就很容易改进。把编好的交易策略与模拟帐户交易结合起来就可以
为你带来足够逼真的实战经验。
skywalker
说的非常棒
!
编程其实是一种思想
,
编程的目的是把
你的思想用各种图形表现出来而已
我们期货编程的目的是表现我们的交易思想
< br>是为思想而编程
,
不是为编程而编程
!
说起这点我想起了
TB
p>
的伟大
!
不管你用文华还是飞狐
,
当你把指标公式写完后
可能你自己的不是很清楚
你的代码所表现出来的东西到底是不是就是你的交易思想呢
?
因为他们的代码是工作在后台的
我们在前面无法得知这些代码如何工作
而
TB
完全不同
你可以在任意时候知道你的代码在做什么
!
所以你也就非常的清楚你的代码是不是真的表现了你的意思
!
好了
现在
开始写数据类型
,
变量和赋值
.
p>
这是些非常基本的概念
,
相信您一下就懂的
线说数据类型吧
数据类型和人的类型差不多
人不是分
黄种人
,
白种人
,
黑种人么
?
TB
里面的数据也一样
分字符串类型
,
数值型
,<
/p>
还有布尔型
字符串类型很简单
,
用分号
括起来的东西就叫做字符串类型的数据
,
如
如
数值型数据类型也
同样的简单
,
数值大家知道吧
,
如
1542
啊
,1.
021
啊
....
这些东西就是数值型
的数据类型
当然
,
< br>如果把一个数值型的东西用分号
括起来了那他就不再是数
值型数据了
,
而是字符串类型的数据
如
1688
是数值型数据
,
但是
就是字符串类型的数
据了啊
还有就是布尔型
,
当然
,
没有接触过编程的朋友可能不明白布尔型的
意思
说白点
,
布尔型就是真假型
,
意思就是布尔类型的数据只能取真
(True)
或假
(False)
值
.
比如
2>1,
p>
这个东西就是布尔类型的数据
,
因为
2
是大于
1
啊
,
所以这个表达式返回
True(
真
)
那么
2<1,
p>
大家说这个表达式是不是个布尔类型的数据呢
?
< br>呵呵
,
也是的
,
因为
2
大于
1
啊
,
所以
2<1
是错误的
,
就返回
Fals
e(
假
)
咯
大家明白了吧
,
就这三个类型
,
其中最只要的就是数值型数据类型哦
用的最多的也是数值型数据类型
如果
明白了
,
那么请您就记住在
TB
里面数值型的
E
文是
Numeric
吧
晕死
,
看下
TB
的帮助
,
数据类型里面还有个序列型
,
如果数值序列型
,
字符串序
列型
,
布尔序列型
序列这个东西看起来很难理解
想个办法来理解他吧
比如我们的
p>
K
线图上有
10
跟
K
线
,Close
大家知道吧
,
就是收盘价
但是这个
Close
包含了第一根
K
线的收盘价
,
也包含了
第二根
K
线的收盘价
.......<
/p>
一直包含到第五根
K
线的收盘
价
也就是说序列型的数据在没根
K
线上都有一个值的
OK<
/p>
了吧
?
如果不
O
K
也没有关系
,
慢慢的就懂了
再说说变量
p>
顾名思义
,
变量就是一个可以改变的东西<
/p>
现在这个变量的值是
100,
但是等下我可以把它改成
20,
只要您喜欢
p>
,
你可以随心所欲的改变这个值
呵呵
,
能够修改他的值的东西就叫做变量了
p>
记住
:
在
p>
TB
里面变量都是要先定义的
!
而且有着他独到的定义方法
,
而且这个定义必须放
到
Begin
的前面
如我们定义一个数值型变量
a.
就应该这样
Vars
Numeric a;
Begin
......
End
当然你也可以定义两个或者多个变量
,
如
Vars
Numeric
a;
Numeric b;
//.........
更多变量定义
Begin
......
End
大家也许想到了
< br>我定义这个变量
a,
我要让他等于
2,
这个东西很简单
你可以在变量
定义的时候就给他赋初值让他一开始被定义就等于
2,
也可以在
Begin
下面写
.
< br>如
Vars
Numeric a(2);
Numeric b;
//.........
更多变量定义
Begin
......
End
明白了么
?
那么变量
< br>b
呢
?
我们没有用括号
()
扩个东西啊
,
那么
这个时候
b
这个变量等于什么呢
? <
/p>
很简单
,
如果你在定义变量的时候没有给
他初值
,
那么
b
这个时候等于
0
咯
好了
再看在
Begin
里面怎么修改这个变量的值
Vars
Numeric a(2);
Numeric b;
//.........
更多变量定义
Begin
a = 3;
b = 100;
End
很简单的
现在大家应该知道了变量是什么东西了吧
对了
,
忘记告诉大家了
,
在
Begin
下面给变量复制仅仅只对当前正在
执行你的代码的
K
线有效咯
,
到下一根
K
线他
就是初
始值了啊
写个例子吧
Vars
Numeric a(100);//
定义一个变量
,
类型是数值类型
,
变量名字是
a,
变量的初始
值是
100
Begin
if(CurrentBar == 0)//
如果是第一根
K
线
,
就把变量
a
的值变为
1
{
a = 1;
}
FileAppend(
End
我们再来看看输出结果
:
1
100
100
100
100
我们再来理解下这个结果
(<
/p>
当然这个时候我们的
K
线图上面只有
p>
5
跟
K
线啊
,
其实随便多少跟
K
线都一样
)
首先代码在第一根
K
p>
线上面执行
,
先执行
if(CurrentBar == 0)
这个东西
,Cur
rentBar
代表正在被执行的
K
线
的索
引
因为代码现在在第一根
K
线上执行
,
所以索
引就是
0
拉
,
于是这个表达式就成立了啊
,
既然
if
(CurrentBar ==
0)
这
个表达式
成立
,
那么他就会执行
{}
里面的东西
a = 1;
把
< br>1
赋给变量
a,
也就是说吧变量
a
的内容改成
1,
< br>然后执行
FileAppend(
这个时候变量
a
的值是
1,
所以当然
输出
1
了啊
代码执行完毕
然后转到第二根
K
线
,
既然是第二
根
K
线
,
那么
这根
K
线的索引就是
1
了啊
,1
肯定不等于
0
啊
那么表达式
if(CurrentBar == 0)
就不成立了啊
,
既然不成立那么他也就不会执行
{}
里面的东西
a = 1;
于是就直接执行
Fil
eAppend(
那么这个时候
a
的值
是多少呢
?
很明显是
100,
就是他的初始值
,
而不是上一根
K
线执行代码的时候改变了的
a
的值
!
这点千万注意啊
我相信好多朋友会在这里犯下错误的咯
再说给变量赋值
< br>其实我们上面已经说了
,
记住
=
和
==
的区别吧
=
就是把
=
右边的东西赋给
=
左边的东西
如
a = 100;
就是把
=
右边的
100
赋给左
边的变量
a
如
b = 9;
就是把
9
赋给变量
b
我们在日常中一直把
=
当成等于
,
千万急着在
TB
里
面
=
就是赋值
!!!
真正的等于的符号是
==
if(a=
=b)//
就是如果
a
等于
b
{
//
做某件事情
}
好了
快
11
点了
睡觉了
下次见
看了,学了,收获不少,不断
消化
ING
。
。
。
谢谢斑竹!
但是编程不是一件很容易的事情
,<
/p>
当然
,
如果您入门了
,
你会发觉
TB
编程其实和泡妞一
样的简单
,
就看你敢不敢下
手了
如
1688
p>
是数值型数据
,
但是
就是字符串类型的数据了啊
p>
说白点
,
布尔型就是真假型
,
意思就是布尔类型的数据只能取真
(True)
p>
或假
(False)
值
.
序列这个东西看起来很难理解
想个办法来理解他吧
比如我们的
p>
K
线图上有
10
跟
K
线
,Close
大家知道吧
,
就是收盘价
但是这个
Close
包含了第一根
K
线的收盘价
,
也包含了
第二根
K
线的收盘价
.......<
/p>
一直包含到第五根
K
线的收盘
价
也就是说序列型的数据在没根
K
线上都有一个值的
p>
在
TB
里面变量都是要先定义的
!
而且有着他独到的定义方法
,
< br>而且这个定义必须放到
Begin
的前面
那么变量
b
呢
?
我们没有用括号
()<
/p>
扩个东西啊
,
那么这个时候
b
这个变量等于什么呢
?
很简单
,
如果你在定义变量的时候没有给他初值
,
那么
b
这个时候等于
0
咯
好了
再看在
Begin
里面怎么修改这个变量的值
Vars
Numeric a(2);
Numeric b;
//.........
更多变量定义
Begin
a = 3;
b = 100;
End
现在大家应该知道了变量是什么东西了吧
对了
,
忘记告诉大家了
,
在
Begin
下面给变量复制仅仅只对当前正在
执行你的代码的
K
线有效咯
,
到下一根
K
线他
就是初
始值了啊
写个例子吧
Vars
Numeric a(100);//
定义一个变量
,
类型是数值类型
,
变量名字是
a,
变量的初始
值是
100
Begin
if(CurrentBar == 0)//
如果是第一根
K
线
,
就把变量
a
的值变为
1
{
a = 1;
}
FileAppend(
End
我们再来看看输出结果
:
1
100
100
100
100
我们再来理解下这个结果
(<
/p>
当然这个时候我们的
K
线图上面只有
p>
5
跟
K
线啊
,
其实随便多少跟
K
线都一样
)
首先代码在第一根
K
p>
线上面执行
,
先执行
if(CurrentBar == 0)
这个东西
,Cur
rentBar
代表正在被执行的
K
线
的索
引
因为代码现在在第一根
K
线上执行
,
所以索
引就是
0
拉
,
于是这个表达式就成立了啊
,
既然
if(CurrentBar == 0)
这个表达式成立
,
那么他就会执行
{}
里面的东西
a = 1;
把<
/p>
1
赋给变量
a,
也就是说吧变量
a
的内容改成
1, <
/p>
然后执行
FileAppend(
这个时
候变量
a
的值是
1,
< br>所以当然输出
1
了啊
代码执行完毕
然后转到第二根
K
线
,
既然是第二根
K
线
,<
/p>
那么这根
K
线的索引就是
1
了啊
,1
肯定不等于
0
啊
那么表达式
if(CurrentBar == 0)
就不成立了啊
,
既然不成立那么他也就不会执行
{}
里面的东西
a = 1;
于是就直接执行
Fil
eAppend(
那么这个时候
a<
/p>
的值是多少呢
?
很明显是
100,
就是他的初始值
,
而不是上一根
K
线执行代码的时候改变了的
a
的值
!
这点千万注意啊
我相信好多朋友会在这里犯下错误的咯
再说给变量赋值
< br>其实我们上面已经说了
,
记住
=
和
==
的区别吧
=
就是把
=
右边的东西赋给
=
左边的东西
如
a = 100;
就是把
=
右边的
100
赋给左
边的变量
a
如
b = 9;
就是把
9
赋给变量
b
我们在日常中一直把
=
当成等于
,
千万急着在
TB
里
面
=
就是赋值
!!!
< br>
真正的等于的符号是
==
<
/p>
if(a==b)//
就是如果
a
等于
b
{
//
做某件事情
}
现在我们说说
TB
中的流程控制
流程控制就是控制代码执行的流程
还说的明白点就是如果满足什么阳的条件就做什么事情
或者不满足什么条件的时候做什么事情
简单说流程控制就是控制语句控制代码
控制语句中分为逻辑控制语句
(
p>
就是条件控制语句
)
和循环控制语句
条件控制语句中大家记住
If
这个关键字
,
翻译成中文就是如果
< br>
循环控制语句中大家记住
For
,
就是开始循环了
先说
If.
假设一个这样的条件
:
如果
(
收盘价
>
开盘价
p>
)
则输出
:
今日收红阳线
我们先把这个东西翻译成
TB
如果翻译成
If
收盘价和开盘价大家
都知道会翻译成
Close
和
Open
输出语句就是
FileAppend,
则翻译成
TB
就是
:
If(Close>Open)
{
FileAppend(
今日收红阳线
}
是不是很简单呢
?
大家记住一点
,
凡是
if(
如果
)
语句中的代码
,
都给我用
{}
括起来
我们再把上面的条件加上一点
:
如果
(
收盘价
>
开
盘价
)
则输出
< br>:
今日收红阳线
否则如果
p>
(
收盘价
==
开盘
价
)
则输出
:
今日收十字线
我们再翻译成<
/p>
TB,
把否则翻译成
Else,
如果翻译成
If
If(Close>Open)
{
FileAppend(
今日收红阳线
}
Else If(Close==Open)
{
FileAppend(
今日收十字线
}
同样的简单
,
我们可以再把上面的
条件再加
:
如果
(
< br>收盘价
>
开盘价
)
则输出
:
今日收红阳线
否则如果
(
收盘价
==
开盘价
)
则输出
:
今日收十字线
否则
则输出
:
今日收绿阴线
上面的否则大家知道翻译成
Else
吧
,
有两种翻译方法
< br>,
因为收盘价和开盘价的比较只存在着三种情况
:
p>
收盘价大于开盘价
,
收盘价等于开盘价
p>
,
收盘价少于开盘价
,
我们先这样翻译
:
If(Close>Open)
{
FileAppend(
今日收红阳线
}
Else If(Close==Open)
{
FileAppend(
今日收十字线
}
Else If(Close
{
FileAppend(
今日收绿阴线
}
上面的这个语句是很好理解的
但
是大家想到了吗
?
开盘价和收盘价的比较
,
如果不满足
Close>Open,
也不满足
Close==Open
那么肯定的一点就是
p>
:Close
所以上面的语句可以写成
:
If(Close>Open)
{
FileAppend(
今日收红阳线
}
Else If(Close==Open)
{
FileAppend(
今日收十字线
}
Else
{
FileAppend(
今日收绿阴线
}
再说
For
循环语句
.
先记下
For
语句的语法格式
:
For
循环变量
=
初始值
To
结束值
{
TradeBlazer
公式语句
;
}
也就是
(
假如变量
i
已经定义
,
且循环
5
次
)
For i = 0 To 4
{
TradeBlazer
公式语句
;
}
for
语句的理解稍微复杂点
,
但是大家不要怕
,
同样的很简单的
,
我们先看看
p>
For
语句是如何执行的
:
比如上面的例子
首先执行
i=0,
就是给变量
i
赋
值让
i
等于
0,
然后判断
i
是不是少于等于
4,
p>
这里
i
等于
0,<
/p>
所以小于
4,
于是执行
< br>{}
里面的
TradeBlazer
公式语句
;
执行
{}
里面的
TradeBlazer
公式语句后
,TB
系统会自动给变量
i
< br>加
1,
这个时候
i
就等于
1
了
(
上面刚刚开始的时候
i
等于
0,
加了
1
就是等于
< br>1
了
)
再判断
i
是不是少于等于
To
后面的
4,1
当然少于
4,
< br>于是再执行
{}
里面的
Trad
eBlazer
公式语句
;
执行完<
/p>
{}
里面的
TradeBlazer
p>
公式语句后
,Tb
系统又自动给变量
i
加
1,
上面
i
已经等于
1
了
p>
,
加
1,
于是这个
时候
i
等于
2
了
,
于是再判断变量
i
的值
2
是不是少于
To
p>
后面的
4,
当然少于拉
,
于是再执行
{}
里面的
TradeBlazer
公式语句
;
....
以此执行
,
当
i
等于
5
< br>的时候
,
再与
To
后面的
4
进行比较
,
当然
5>4
了
,
p>
所以不满足条件了
,
于是不再执行
{}
里面的
TradeBlazer
公式语句
;
而开始执行
{}
下面的语句拉
明白了么
?
应该很清楚了
大家再研究下下面的<
/p>
HHV
的写法
,
就会很明白了的
:
//-----
--------------------------------------------------
-----------------
//
简称
: HHV
//
名称
:
求
N
周期的最高值
//
类别
:
用户函数
//
类型
:
用户函数
//
输出
:
数值型
//-----------
--------------------------------------------------
-----------
Params
NumericSeries Price(0);
Numeric Length(5);
Vars
Numeric highestValue(0);
Numeric minDay;
Numeric i;