新浪博客

从一无所知开始学习交易开拓者(TB)期货程序化交易编程(二)

2016-10-21 12:17阅读:

我们先看看下面的这个函数,这个函数的名字叫:HHV,是根据轮回老大的建议改写的,我们必须要读懂这个函数,且知道怎么样去
调用这个函数,如果真懂了,这课就圆满的完成了!

[Copy to clipboard] [ - ]
CODE:
//------------------------------------------------------------------------
//
简称: HHV
//
名称: N周期的最高值
//
类别: 用户函数
//
类型: 用户函数
//
输出: 数值型
//------------------------------------------------------------------------
Params
NumericSeries Price(0);
Numeric Length(5);
Vars
Numeric highestValue(0);
Numeric minDay;
Numeric i;
Begin
minDay = Min(CurrentBar,Length-1);
for i=0 to minDay
{
highestValue=Max(highestValue,Price[i]);
}
Return highestValue;
End
//------------------------------------------------------------------------
//
编译版本 GS2004.06.12
//
用户版本 2007/09/24 08:29
//
版权所有 pwqzc
//
更改声明 TradeBlazer Software保留对TradeBlazer平台
//
每一版本的TrabeBlazer公式修改和重写的权利
//------------------------------------------------------------------------


我们一行一行的读,一行一行的理解;
首先我们都知道,//后面的代表是注释,什么是注释?我狂晕!
通过注释我们可以粗略的明白这个函数是干什么的?代表了什么意思:
这个函数的名字HHV,他的作用是求N周期的最高值,并且会把这个最高值返回给调用这个函数的用户
通过此,我们就能够想到,这个N是个参数,比如5个周期或者10个周期或者其他周期的最高值,
再仔细一想,是什么价格的最高值啊?是收盘价的最高值还是开盘价的最高值?或者是最高价的最高值呢?
于是我们也就想到了这个函数的另外个参数:价格,比如5个周期的收盘价的最高值,或者10个周期的最高价的最高值
紧接着,这个函数开始定义参数了,
Params
后面定义的就是参数,一个代表要得到什么价格的最高值,一个代表要得到什么周期的最高值;
参数定义完了,这个函数就开始定义变量,对于函数,我们首先定义一个变量highestValue,我们这个函数必须要把这个变量返回给用户的
这个变量highestValue就代表了你想得到的最高值!其他的两个变量我们先不要理睬,紧接着就是Begin,前面我们说过,Begin后面,我们的代码就要开始工作拉
我们先想一想,假设我们求5天的收盘价的最高值,在第一根K线上,我们希望得到的收盘价的最高值就是这天的收盘价;
到第二根K线的时候我们希望得到的收盘价的最高值是这两天的收盘价中价格最高的那个,第三根就是得到这三根K线里面收盘价最大的那个收盘价,
第四天同样如此,第五天同样如此,第六天开始就取前面5天的收盘价的最高价,第七天......N天同样如此了;
这个时候我们就应该想到,如果当前K线的索引小于你需要的周期数的时候就取当前K线的前面几个周期的最高值
于是代码开始写:
minDay = Min(CurrentBar,Length-1);
这个大家都很明白吧,如果当前K线索引假设是3,而你要得到的是5个周期的最高值,因为暂时还没有5个周期,我们我们就取这3个周期来获得这三个周期的最高值
为什么要-1?因为K线的索引是从0开始计算的,那么前面的minDay?就是个变量,我们用这个变量来代表周期,于是我们再到定义变量的地方去定义这个变量:
Numeric minDay;
再看代码:

[Copy to clipboard] [ - ]
CODE:
for i=0 to minDay
{
highestValue=Max(highestValue,Price[i]);
}


很明显,这是一个前面我们所说的For循环,For循环里面我们必须要先定义一个变量i(可以是其他名字),代表从什么基数开始循环;
于是再到定义变量的地方去定义这个i变量:
Vars
Numeric highestValue(0);
Numeric minDay;
Numeric i;
再看这个For循环,
i0的时候,看这个时候0是不是小于等于最小周期minDay,如果条件成立,就执行:

[Copy to clipboard] [ - ]
CODE:
highestValue=Max(highestValue,Price[i]);

Price[0]
代表今天的价格,先比较今天的价格和最高值,取最大的那个保存;再把i+1
于是这个时候i1,再比较是不是小于等于最小周期minDay,如果条件成立,再执行:

[Copy to clipboard] [ - ]
CODE:
highestValue=Max(highestValue,Price[i]);

这个时候Price[1]就代表了昨天的价格,把昨天的价格和保存的最高值比较,取他们的最高的那个再次保存;
依次循环,我们是不是就得到了某个周期某个价格的最高值了呢?
呵呵
最后面,我们用代码:
Return highestValue;
把这个得到的最高值返回给用户,Return就是返回拉.
明白了吗?
调用这个函数的时候就更简单了,比如求10个周期的收盘价的最高值:
HHV(Close,10);
20个周期的最高价的最高值:
HHV(High,20);
呵呵
大家在看看和分析这个文章里面的函数就会完全明白了的
http://www.tradeblazer.net/forum/thread-520-1-1.html


我们现在来写一个飞狐的DMA函数
原文出自这里:

QUOTE:
请编飞狐DMA函数.
函数: DMA(X,N)
别名: 动态移动平均
参数: X为数组,N为计算周期
返回: 返回数组
说明: 求X的动态移动平均。
算法: Y=DMA(X,N) Y=N*X+(1-N)*Y',其中Y'表示上一周期Y,A必须小于1
示例: DMA(CLOSE,HIGH-LOW/CLOSE)
表示求以该周期震幅为平滑因子的平均价


他上面的描述有点错误,应该是N必须小于1;
N不是计算周期,我们还是看看文华的关于DMA的描述吧,这样清楚点:
[attach]396[/attach]
很简单,我们可以看出,如果要写这个用户函数,则我们必须要先定义两个参数,
一个是上面的X,代表价格,我们用Price来表示,一个是N,代表动态因子,我们用Length来表示
当然,您可以用任意你喜欢的名字来表示;
好的,开始吧!
我们先新建一个用户函数,简称写DMA,名称写:求动态移动平均,分类选用户函数,模板任意(我选bool),然后确定;
出来如下东西:
Params
Numeric Num(10);
Vars
Bool Con1;
Begin
Con1 = Close > Num;
Return Con1;
End
我们把那些没用的东西删除,仅留下下面的内容
Params

Vars

Begin

我的更多文章

下载客户端阅读体验更佳

APP专享