将技术分析进行到底
提供专业的程序化交易解决方案

麦语言编程教程之二:解决两大类问题

所有的编程都可以归结为以下三类:

第一,表达式问题。以当前视角,给出变量的计算公式。所谓的当前视角,就是不考虑位置关系,把那个位置当作是当前位置。事实上,前面那张表中任何一个方格的数据,都是把这个方格所在列当成当前K线来解读的。

第二,逻辑判断问题。其实可以归结成表达式问题,但是考虑到逻辑判断比较重要,而且和纯计算数值的表达式略有些不同的,所以独立出来。

第三,定位问题。只有一个位置不需要确定,那就是当前,这里说的当前,是K线图上最后一根K线,不是前面说的当前视角。定位的结果是得到历史某个位置到当前的距离。定位的目的是到那个历史位置去取值,可以是逻辑值,也可以是数据值。当然定位还有另外一个作用,就是画线,这种情况我们之后再讨论。

 

 

表达式问题和逻辑判断问题

这两个问题都是比较简单的。关键点是以当前视角给出计算公式,不需要考虑计算公式之外的位置问题。

****************************************************************************

先来一个简单的例子:求当前K线最高价和最低价一半的价格。

这是一个和位置完全没有关系的问题,因为当前K线是不需要定位。所以我们可以直接定义变量名称并给出计算公式。

HL:(H+L)/2;

****************************************************************************

如果在表达式中,某个数据需要通过定位从历史中取,那么可以用定位问题的解决方法取到这个数值,然后再与其他与位置无关的变量组成表达式。

例如,计算最高、最低价,以及前一根K线收盘价的平均。

前一根K线收盘价定义为:

ZC:=REF(C,1);//定位问题后面会有详细说明
HLC:(H+L+ZC)/3;

****************************************************************************

在一个区间内计算数值,如果有系统函数,则与定位无关。因为这个定位过程是有系统函数后台完成的。

例如:最近5根K线收盘价的平均值。虽然理论上需要分别定位到前面4根历史K线,然后取到收盘价,再计算平均。但是由于有系统函数MA(),所以仍是在当前K线上解决的,和定位没有关系。

在当前位置上解决区间问题的系统函数我们总结如下:

  1. 所有的平均值的函数
  2. 所有的数理统计函数
  3. HHV()、HV()、LLV()、LV()函数
  4. COUNT()、SUM()函数
  5. EVERY()、EXIT()函数
  6. LOOP1()函数

 

 

定位问题

所谓的定位问题,就是在上面那张表里,确定数据存储在哪个方格中

取值的过程是使用REF函数实现的,前提是需要知道历史方格与当前位置的距离。

如果距离是动态变化的,那么就需要根据方格满足的条件,然后使用BARSLAST()函数动态计算距离。

****************************************************************************

先看一个简单的例子:前面第3根K线的收盘价。与当前位置的距离已经确定了是3,所接定位取值的过程比较简单

CC:REF(C,3);//从C那一行与当前距离为3的方格里把数据拿过来,存贮到CC这个变量当前方格中。

****************************************************************************

稍复杂的例子:分钟周期上,在盘中取前一天的收盘价。

与前面一个例子不同,距离参数是动态变化的,不是一个常量。

这种情况,我们需要用BARSLAST()根据方格满足的条件计算动态数值。

那用什么条件在分钟周期上定位前一天最后一根K线呢?

因为是最后一根K线,那么下一根K线就属于第二天,所以日期在这两根K线之间发生了切换。而且,只有最后一根和第一根K线才会满足这个条件。

所以我们用条件COND:=DATE<>REF(DATE,1)可以定位到当天第一根K线,那么前面一根就是前一天最后一根K线。

N:=BARSLAST(COND)+1;//前一天最后一根K线与当前的距离。之所以加1,是因为BARSLAST(COND)定位到的是当天第一根K线到当前的距离。

有了这个动态距离之后,就可以通过REF来取值了。

YC:REF(C,N);//从C那一行与当前距离为N的方格里把数据拿过来,存贮到YC这个变量当前方格中。随着时间向右扩展,N也随之增加,但是定位到的昨天最后一根K线的绝对位置是不变的。

****************************************************************************

再深入思考,如果取前天最后一根K线收盘价怎么处理?其实过程是一样的。

COND:=DATE<>REF(DATE,1);
N1:=BARSLAST(COND)+1;
N2:=REF(N1,N1);

两个N1一样吗?先看第二个N1,它是距离参数。而第一个N1是存储数值的变量。所以这两个N1含义是不同的。如何理解?从N1那一行与当前位置距离为N1(当前位置方格中的数值)的方格里把数据拿过来,放到N2当前的方格里。

放到N2当前方格中的数据代表什么意思呢?以当前视角理解,也就是说把存数据的方格看作是当前位置,然后理解N1的含义:当前位置左边满足第一个满足条件COND的K线与当前位置的距离加1。

换句话说,我们先用REF( ,N1)定位到昨天最后一根K线上,然后在这根K线上以当前视角,再得到前一天与当前视角这跟K线的距离。

再简单一点说,N1是昨天最后一根K线到当前位置的距离,N2是前天最后一根K线到昨天最后一根K线的距离。

(这里说的当前位置,就是K线图上最后一根K线。而当前视角,是把历史某根K线当作最后一根K线看待的意思。)

N3:=N2+N1;//前天最后一根K线到当前位置的距离。
YYC:REF(C,N3);//从C那一行与当前距离为N3的方格里把数据拿过来,存贮到YYC这个变量当前位置方格中。

 

其实这个问题还有另外一种解决办法

COND:=DATE<>REF(DATE,1);
N1:=BARSLAST(COND)+1;//以当前视角,当前位置左边满足第一个满足条件COND的K线与当前位置的距离加1
YC:=REF(C,N1);
YYC:REF(YC,N1);//从YC行与当前距离为N1的方格里把数据拿来,存储到YYC这个变量当前位置方格中。

两种方法得到的结果是相同的,区别在于,一个是从C行取值,一个是从YC行取值,由于这两行本身的含义不同,所以定位用的距离参数也有所差异。但是本质都是一样的。

****************************************************************************

既然讨论定位的问题,那么我们就要把问题讨论透彻,来解决一个终极问题:求前面第10天的收盘价格。

解决方案如下:

COND:=DATE<>REF(DATE,1);
N1:=BARSLAST(COND)+1;
NN1:=REF(N1,N1);
N2:=N1+NN1;
NN2:=REF(N1,N2);
N3:=N2+NN2;
NN3:=REF(N1,N3);
N4:=N3+NN3;
NN4:=REF(N1,N4);
N5:=N4+NN4;
NN5:=REF(N1,N5);
N6:=N5+NN5;
NN6:=REF(N1,N6);
N7:=N6+NN6;
NN7:=REF(N1,N7);
N8:=N7+NN7;
NN8:=REF(N1,N8);
N9:=N8+NN8;
NN9:=REF(N1,N9);
N10:N9+NN9,NODRAW;
YC10:REF(C,N10);

我放弃用文字解释的想法了,大家看图吧。

2006.1

 

你一定会问,100天也要这么求吗?当然不必要,之所以讲前面的内容,是为了让大家理解最本质的东西。

BARSLAST函数可以完全被SUMBARS函数代替。

BARSLAST表示最近一次满足条件到当前位置的距离。

SUMBARS表示左边第N次满足条件到当前位置的距离,如果N=1,等效于BARSLAST。

还有一点差异,BARSLAST计算距离时不包含当前这根K线,而SUMBARS则包含。

求10天前收盘价的问题,还可以通过以下方式解决:

COND:=DATE<>REF(DATE,1);
N10:SUMBARS(COND,10),NODRAW;//与前面得到的数值是相同的。
YC10:REF(C,N10);

****************************************************************************

终极问题解决了,接下来我们看一下另一个稍微简单一点的问题:定位历史区间

涉及到从历史区间内取值的问题,我们只需要定位到区间结束的位置,然后在这个问题上,以当前视角,把问题转换为表达式问题就可以了。

看个例子:取昨天最高最低价。

COND:=DATE<>REF(DATE,1);//确定区间起点K线位置的条件,红色外套
NN:=BARSLAST(COND)+1;//以当前视角,计算区间起点到当前位置的距离
HH:=HHV(H,NN);//以当前视角,计算一天内的最高价
HZ:REF(HH,NN);//从HH那一行与当前距离为NN的方格里把数据拿过来,存贮到HZ这个变量当前方格中。

我们也可以完全从定位的角度解决这个问题。也就是找到昨天最高价那个K线到当前位置的距离。这里需要使用HHVBARS定位区间高点到区间结束位置的距离。

COND:=DATE<>REF(DATE,1);
NN:=BARSLAST(COND)+1;
NN2:=HHVBARS(H,NN);//左边包含当前K线在内的NN根K线里,最高价那根K线到当前的距离(不包含当前K线)。
NN3:=REF(NN2,NN);//从NN2那一行距离当前位置NN的方格中把数据拿过来,存到NN3行当前方格中。
NHZ:=NN3+NN;//昨天最高价到当前的总距离
HZ:REF(H,NHZ);//从NH2那一行距离当前位置NN的方格中把数据拿过来,存到NH3行当前方格中。

昨天最低价的道理是一样的。

 

 

 

赞(0)
未经允许不得转载:文华程序化 » 麦语言编程教程之二:解决两大类问题
分享到: (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

横冲直撞 一直到最远方