KnowHowEasyLanguagePowerEditor
简介
OmegaResearchTradeStation系列产品是交易者公认最好用的交易工具整合环境。你不只可以拿它来看盘,使用它内建的诸多技术指针协助分析交易,你也可以自行开发属意的指标,只要你想的到的。最重要的你可以用它来开发交易系统协助你进入机械化交易的世界。把交易构想付之实现并量化,你可以给自己交易最重要的东西──信心!
这个开发并实现交易梦想的核心就存在它内含的EasyLanguagePowerEditor当中。它不是一般点选内建指针,再加一些逻辑运算选项的阳春交易系统设计平台。它是透过一个类似Pascal语法的所谓EasyLanguage来书写你的程序代码,然后透过内部的编译器产生执行效率高的机码(这就是让它屹立不摇的卖点)。甚至连它的竞争者如Equis的MetaStock等多年来也只能不敢吭声的当老二。
虽然它名为「容易语言」,可是对许多没有程序语言经验的人来说它还真是宛如火星语一般的叫人直呼「不容易」。特别对我们这些非英语系的地区又多一曾障碍可称为最高级的「真不容易」。你的英语能力我没办法帮你改善的,至于EasyLanguage我可以助你一臂之力!不过你的计算机概念我也无能为力,基本上你还是要靠你自修加强,如果还是拿过去的理由让自己逃避,那省点事就干脆不要交易了吧!因为你放弃的是一条通往成功交易的不二法门,那就「学海无涯、回头是岸」吧。
以下所附的几则程序代码是未来全文所拿来探讨的样本,你可以节录列以便对照文章内的解说达事半功倍之效。对了、这些程序你都可以在你的PowerEditor找到,因为这些都是TS2000i所内建的。
MACD指标:
{*******************************************************************
Description :ThisIndicatorplotsMACD
ProvidedBy :OmegaResearch,Inc.(c)Copyright1999
********************************************************************}
Inputs:FastMA(12),SlowMA(26),MacdMA(9);
Plot1(MACD(Close,FastMA,SlowMA),"MACD");
Plot2(XAverage(MACD(Close,FastMA,SlowMA),MacdMA),"MACDAvg");
Plot3(Plot1-Plot2,"MADiff");
{AlertCriteria}
IfPlot3CrossesOver0Then
Alert("MACDhasgeneratedabullishalert")
Else
IfPlot3crossesunder0Then
Alert("MACDhasgeneratedabearishalert");
{MACDExpertCommentary}
#BeginCmtry
Commentary(ExpertMACD(Plot1));
#End;
MACD函数之1:
{*******************************************************************
Description:MovingAverageConvergenceDivergence
ProvidedBy:OmegaResearch,Inc.(c)Copyright1999
********************************************************************}
Inputs:Price(NumericSeries),FastMA(NumericSimple),SlowMA(NumericSimple);
MACD=XAverage(Price,FastMA)-XAverage(Price,SlowMA);
MACD函数之2
{*******************************************************************
Description:ExponentialAverage
ProvidedBy:OmegaResearch,Inc.(c)Copyright1999
********************************************************************}
Inputs:Price(NumericSeries),Length(NumericSimple);
Variables:Factor(0);
IfLength+1<>0ThenBegin
IfCurrentBar<=1ThenBegin
Factor=2/(Length+1);
XAverage=Price;
End
Else
XAverage=Factor*Price+(1-Factor)*XAverage[1];
End;
MACD多头交易讯号
{*******************************************************************
Description :MACDLongEntry
ProvidedBy :OmegaResearch,Inc.(c)Copyright1999
********************************************************************}
Inputs:FastMovAvg(12),SlowMovAvg(26),MACDMovAvg(9);
Variables:XMACD(0);
IfCurrentBar>2ANDMACD(Close,FastMovAvg,SlowMovAvg)CrossesAboveXAverage(MACD(Close,FastMovAvg,SlowMovAvg),MACDMovAvg)[1]Then
Buy("MACD")ThisBaronClose;
MACD空头交易讯号
{*******************************************************************
Description :MACDShortEntry
ProvidedBy :OmegaResearch,Inc.(c)Copyright1999
********************************************************************}
Inputs:FastMovAvg(12),SlowMovAvg(26),MACDMovAvg(9);
IfCurrentBar>2ANDMACD(Close,FastMovAvg,SlowMovAvg)CrossesBelowXAverage(MACD(Close,FastMovAvg,SlowMovAvg),MACDMovAvg)[1]Then
Sell("MACD")ThisBaronClose;
待续
第一章:指标写作
现在开始我会逐行解说每一行程序代码的意义。我不想用一般手册的说明方法,因为那样子让我觉得没有效率;它让你懂一些方法,却也让你合上书后忘的一乾二净。我让你在实做中学习,马上披挂上阵!有成就感你就不容易忘。然后我会举一反三拿一些实例加强你的观念进入深植,想忘都不可能!至于手册、我希望你不要丢掉它,放在身边你会常常用它的;爱因斯坦说:不要去背找得到的数据来增加大脑的负担。相信我!我这二十多年涉猎许多计算机语言,没有手册我一行码都掰不出来的。让我们系上安全带,飞上天HI一下!
MACD指标:
Indicator?什么是Indicator?它就是指标、技术指标。不过在TS2000i它更泛指「可以显示在图型工作区的指针」,也就是说它不只是包含计算指标部份,更包括了显示部份(画图PLOT)。以下就是一个完整的MACD指针程序,使用EasyLanguage语法完成的。
{*******************************************************************
Description :ThisIndicatorplotsMACD
ProvidedBy :OmegaResearch,Inc.(c)Copyright1999
********************************************************************}
这一段我们称为『备注』、『批注』(Remark)。在PowerEditor中它会显示为绿色,因为它不会被理会或被编译,但它方便我们阅读,知道自己在这段程序企图得到或想表现些什么。
批注被包围在大括符里头{}。只要你把一段文字用大括符包围起来,就是告诉PowerEditor不要去执行这段东西,就算它里面是计算式也不必去鸟它。因为它是写给我这有血有肉的人看的,不是给你这大脑装满海沙的家伙看的。
Inputs:FastMA(12),SlowMA(26),MacdMA(9);
Inputs:『外来参数输入』。
文法 Inputs 加冒号『:』之后输入外来参数『FastMA』后加括符内填初设值『(12)』。如果有一个以上的参数需要被代入,参数间用逗点隔开『,』。最后结束时以分号终止『;』。
Inputs的部份是代表这些数据未来在我们使用该指标时是可以被更改的。如本例可以看到12,26,9就是一般MACD的惯用参数。特别说明的是当我们在设定参数名称(FastMA)时虽然没人管你要命什么名称,但设定一些可读性高的名称对你未来使用会是一件好事的。FastMA一条快速的移动平均线比用abc来的叫人会意些吧?
初值一般也引用常用数据来代入,如此在使用上你也会方便自己许多。为什么我们要设外来参数呢?因为它方便你在使用时迅速的更改配合当时需要。也许你有天想看看以6,13,5计算的MACD会长得如何?那好你直接在图形页改参数便可。如果你不用Inputs、那抱歉你只有再进入PowerEditor改新参数,然后重新编译一次才可以使用,当然你要是每到阴天闲的发慌我不阻止你如此干,至少你孩子会对我感激涕零。
Plot1(MACD(Close,FastMA,SlowMA),"MACD");
Plot1 呼叫Plot1函式(函式未来会提,现在你就当自己是皇上吆喝各司其职的小太监上场。有侍衣、侍食、侍寝、、之类的他们有自己的专属工作,只待你一声令下,只是你要叫对人)。函式后面紧跟括符『()』,同样以分号结束叙述。括符内加入函式本身需要的参数或变量。加什么呢?这时手册就派上用场了!每一个函式要加的参数是不一定的,所以手册会帮你找到。你也可以利用在线手册,点选右上像一本书的图示或是选单的Tools>EasyLanguageDictionary。
文法Plot1(代入要显示的数据,”显示的文字字符串”);同样的各参数间以逗点相隔,以分号结束。这里有一个不同;字符串输入必须包含在“”之间。它藉以区隔特别是数字以文字不被处理而直接表现。比如说”3-2”会表现3-2而不是变成1。
Plot1它有许多兄弟姊姊,排行由1到4。为什么呢?因为TS200i设计成每个指针的显示个数最大为4,无法显示更多。对了这四条线的当然包括你喜欢加在如RSI的超买或超卖的水平线,珍惜物资喔。
这例子中第一个代入的数值变量,我们的MACD数据由另一个函式完成运算。也就是说函式之中另有函式!其实不用大惊小怪,在程序语言这是很正常的事。你叫来服侍你吃饭的小太监当然需要再找御膳房的小太监帮你张罗,不是这样吗?
MACD()这个函式需要输入三个参数。后两个是我们提过的外部输入的天数参数,就是算12天平滑平均减26天平滑平均。那用什么来算呢?『收盘价』不是吗?所以第一个参数我们置入Close。在EasyLanguage中Open、High、Low、Close、IF、THEN等被称为保留字(ReservedWord),也就是说这些字被定义为具专门用途的用语,其意义被永久固定无法更改或被指定他用。不要怀疑这里的他就是指你!所以在此这个Close就是代表收盘价,无论你在任一程序中发现它都是那个意思。
待续
Plot2(XAverage(MACD(Close,FastMA,SlowMA),MacdMA),"MACDAvg");
Plot2自然是要画第二条线,所以不再解释Plot用法。这里特别的是再加入一名采买食物的小太监XAverage()。它是『平滑系数平均值』的计算函式,代入两个参数,第一数据是被运算的基数如同刚才的Close。是呀!如果你是写XAverage(Close,9);就是要计算9天的收盘平滑系数平均数(EMA)了。这里因为我们要计算MACD指标,所以我们必须把计算结果的MACD再做一条它的9天平均。所以、我们第一个参数代入Plot1相同的函式求出MACD。第二参数就代入外部参数的MacdMA,它的意义就是9天。咦?我刚才说溜嘴提到跟Plot1相同这句话吗?隐藏多年的秘密竟然、、好吧!其实你的身世是、、、喔这不是秘密啦?你都知道了?好吧既然移不开话题我只好坦白啦!你也可以这么写。
Plot2(XAverage(Plot1,MacdMA),"MACDAvg");
这个意义是一样的。因为现在Plot1的数据就是代表MACD的运算结果。你可以尝试改写,将发现输出结果并没有改变。不信?那往下看!
Plot3(Plot1-Plot2,"MADiff");
Plot3看到了吧?我没骗你吧!这里是在表示我们MACD的『柱状图』部份。柱状图便是MACD减去MACD平均的差值,表现这两数据的差离、乖离(OffSet)。所以我们直接精简表示为Plot1–Plot2。
好!讨论到此这个指标的核心已经结束。其它的程序代码是指针附加功能,我也会解释。只是到此你应该有利用现成函式自己写个指标亮相的能力了。所以我想在此先谈一些运用变化,让你举一反三增加几个甲子的功力。
让我们来尝试用不同的方式改写这个指标。行动前我再解释一个重要的部份,就是除外部参数外我们还必须了解及学会运用内部参数或变量的运用。内部参数文法如同Inputs,只不过它不用Inputs是用Vars。例
Vars:Macd_Now(0),Macd_Xavg(0),Macd_Diff(0);
是不是差不多?我们一般会给变量初值为零,算是一个重置(ReSet)的动作。当然你如有特殊需要是可以直接代入需要的数据不一定设为零。上点BCC计算机基本概念;Vars就是我们向计算机要求分配一个记忆区供我们置放一些运算结果。就像我们跟计算机要一张椅子,我拿椅子当比方就是它是张单人椅,请不要尝试跟你的阿那答想亲蜜的挤一张椅子。所以啦、椅子永远是要到的那一张,坐的人可以是任何一个人。以下例子说明内部变量使用文法。
Vars:Macd_Now(0);
Macd_Now=3.14<正确的代入,椅子正被3.14所坐。
3.14=Macd_Now<错误!3.14正被椅子坐?
Macd_Now=Macd_Now+2000<正确!Macd_Now增肥2000公斤后变了另一个家伙,虽然他妈妈都认不出他了,他还是有资格坐在椅子上。
这样了解变量的运算了吧?现在我就来改写MACD的指标。点选File>New>General下选Indicator产生一个空白的指标公式书写页。CreateaNewIndicator窗口下输入指针名称(Name)『My_MACD』,Short_Name可不要或输入简短的花名如『Nmacd』。Note嘛、就自己心情舒发啦,像是仅将此程序献给我的小花之类的。就是说嘛!第一次写TS2000i的指标耶!
改写MACD指标:
{*******************************************************************
Description :ThisIndicatorplotsMACD
ProvidedBy :OmegaResearch,Inc.(c)Copyright1999
********************************************************************}
Inputs:FastMA(12),SlowMA(26),MacdMA(9);
Vars:Macd_Now(0),Macd_Xavg(0),Macd_Diff(0);
Macd_Now=MACD(Close,FastMA,SlowMA);
Macd_Xavg=XAverage(Macd_Now,MacdMA);
Macd_Diff=Macd_Now–Macd_Xavg;
Plot1(Macd_Now,"MACD");
Plot2(Macd_Xavg,"MACDAvg");
Plot3(Macd_Diff,"MADiff");
Plot4(0,”0”);
如何?是不是一样的东西?我们甚至用了第四条线来画零轴中线。最后你必须按『F3』进行,记住!所有新写或改写的程序都必须按一下F3让PowerEditor帮你检视并编译才可以使用。当回应你Excellent!你就可拍拍手鼓鼓掌,因为它签了通行证给你。快去TS2000i打开一张图然后按F7看看Indicator有没有你的大作出现?找到My_MACD点选有没有热泪盈眶呀?
不过打击接踵来到。你的柱状图为啥跟MACD一样是条线呢?嗯、再回到我们的PowerEditor点选File>Properties在IndicatorProperties–My_MACD窗口下选ChartStyle>Plots>MADiff>Type>Histogram。记得改完按确定后还是要按F3再编译一次。自己可以尝试看看如何把零轴改成点状的线段表示。
待续
接下来、我们再举一个例子写另一个通用指标Stochastic,就是我们惯称的KD指标。我们设定通用天数为9天,我们知道必须要运算RSV(不成熟随机值)、与得到9天范围的最高与最低。完成程序如下
Inputs:Length(9),OverSold(20),OverBought(80);
Vars:RnHi(0),RnLo(0),RSV(0),sK(0),sD(0);
IfCurrentBar>1thenbegin
RnHi=Highest(High,Length);
RnLo=Lowest(Low,Length);
RSV=(Close-RnLo)/(RnHi-RnLo)*100;
sK=((sK[1]/3)*2)+(RSV/3);
sD=((sD[1]/3)*2)+(sK/3);
end;
Plot1(sK,"%K");
Plot2(sD,"%D");
Plot3(OverBought,"OverBought");
Plot4(OverSold,"OverSold");
以上程序代码大致应该没问题,不需再逐行解说了。所以我挑重点说明。这里出现一个新东西,我们第一个接触的『判别式』;IF(逻辑判断)THEN(执行)。我们把这个运算译成白话就是:如果(IF)今天下雨?(事实判断)那么(THEN)我们出门就要打伞(行动)。写成程序为:
IF今天下雨?THEN我们出门就要打伞;
在『今天下雨?』这个条件判别将产生『真TRUE』或『伪FALSE』的结果,如果结果为真(TRUE),我们则执行随后要求的动作,如伪(FALSE)随后动作将不会被执行。再看以下例子:
My_Count=12;
IFMy_Count>10THENMy_Count=My_Count+10;(TRUE>执行)
IFMy_Count<10THENMy_Count=My_Count/100;(FALSE>不被执行)
再插个花谈谈EasyLanguage『操作数』!在四则运算没有什么问题,顺序也依习惯做先乘除后加减。在『条件式』写法中可用逻辑操作数连接几个条件判断;如AND、OR等。特别的是大于或等于写成>=,不可以写=>。
拉回来再谈下去。如果THEN之后我们要执行的不只是担一步骤,那要如何解决?难道我们要一条一个IF~THEN的写下去?当然不必如此!我们用一个方式来告诉它执行某范围的动作,我们用BEGIN跟END来界定多个动作。
IF今天下雨?THENBEGIN
我们出门就要打伞;
出门前提醒家人外出也要带伞;
检查家里的窗户关了没;
END;
上面的条件判断后将执行三个动作。当然你还可以在IF-THEN中再加入另一个IF-THEN,形成所谓的『巢状判别式』,往后碰到例子再加强说明吧。除上面谈的IF-THEN之外我们又看到几个常用函式,介绍一下用法!
CurrentBar是一个常常会呼叫的函式,不过它不必引入参数,它回传的是一个数字,这数字跟你计算指针的起始有效日数有关。在此例中、我们在数据开始的第9天后才能开始计算出KD的值,所以CurrentBar回传为1时就是第9天。所以我们在第9天之后开始计算KD(CurrentBar>1),如此你就不会在第9天之前看到乱七八糟的指针数据了。
Highest(比较数据,范围天数)。这个函式很容易了解因为它用High+Est。这里的High不是指我们说的当日最高,而是一堆数据里的最高值将被发现出来。所以我们如果输入Highest(Close,9);将会寻找出过去9天中最高的收盘价。而相对的Lowest()便是找出输入范围的最低值。
最后一个是sK与sK[1]、sD与sD[1]。其中的不同点在于后面加了一个中括符。在EasyLanguage中,我们用中括符[X]来表示取前X天的数据或数据。所以当我们运算%K的时候需要昨天的%K数据,所以我们代入sK[1]就是得到1天前的%K数据。同理sD[1]也是这个意思。这个符号使用范围很广,几乎所有的变量都可以使用如此的表示。如Close[10]表10天前的收盘价、High[6]表6天前的当日最高值。好啰这段程序到现在应该没有感觉陌生的语法了吧?老写原来已经有的指标是否有点少些新鲜感?我们在继续推进前最后再举一个例子;它是在寰宇财金[45]-『最新技术分析指标』中的【随机RSI摆荡指标--P133】。
Name:StochRSI
Inputs:Price(close),Length(9);
Vars:ToRSI(0),HiRSI(0),LoRSI(0);
ToRSI=RSI(Price,Length);
HiRSI=Highest(ToRSI,Length);
LoRSI=Lowest(ToRSI,Length);
Value1=(ToRSI-LoRSI)/(HiRSI-LoRSI);
Value2=.8;
Value3=.2;
Plot1(value1,"StRSI");
Plot2(value2,"O.B");
Plot3(value3,"O.S");
依惯例介绍个新朋友。『Value1』是EasyLanguage里一个贴心的变量设定。还记得我们要使用变量前都必须在Vars:后先『宣告变量使用』的动作。不然编译器在你按F3时会给你错误讯息,非法使用变量一类的。不过这个Value1不必经过这道手续,它是例外的;EasyLanguage留下Value1~Value999给你「滥用」。为什么说滥用呢?就是它虽然使用方便,但会养成你写程序的坏习惯,降低你的程序可读性。像这几行完成的程序当然无妨,如果你未来写个老太婆的缠脚布那么长的程序,而你不停的、快乐的用上ValueX;嘿嘿!你在写完的半年后想修改个内容你就会吃尽苦头了,因为你的作品像极了结绳记事,那个长的像肉包子大的结到底是记录发生的那条大事?它会让你悔不当初。
接下来继续谈我们的MACD指标后半段。
{AlertCriteria}
IfPlot3CrossesOver0Then
Alert("MACDhasgeneratedabullishalert")
Else
IfPlot3crossesunder0Then
Alert("MACDhasgeneratedabearishalert");
这段是在设定TS2000i发出警讯(Alert)的部份。当条件吻合的时候TS2000i会产生一个浮动窗口给你讯息。还记得Plot3是那个数值吗?对了它就是MACD的柱状图,也就是MACD–MACD的9天平均;也就是我们一般定义空或多的方式。当Plot3穿越零轴(昨天于零下)时我们启动警讯功能,提示我们行情翻多。这里我们不用Plot3>0,因为会产生只要Plot3持续大于零,那你的警报器就会响个不停。我们在此使用CrossesOver(或CrossesAbove都为穿越向上)。这个语法会在未来经常用到,它与>判别不同的就是它只在穿越的那一天为『真值TRUE』。那向下穿越便是CrossesUnder或CrossesBelow!如果我们非得用大小于表示的话,那CrossesOver便可同义于:
IFPlot3[1]<0andPlot3>0Then
这里我们看到一个『生字』-『ELSE』解读为如果不成立的话;它是配合着IF-THEN一起使用的。就是说我们的IF条件式在判读时,如果不能为真则不会执行后续动作。但如果我们需要在不为真时执行另一个动作,我们便可以使用这ELSE来解决。原先还不认识ELSE前我们可能如此去写程序:
IfPlot3CrossesOver0ThenAlert("MACDhasgeneratedabullishalert");
IfPlot3CrossesUnder0ThenAlert("MACDhasgeneratedabearishalert")
现在透过ELSE的语法,我们便可以结合上面两行变成一个完整的叙述,如指标内的写法。
{MACDExpertCommentary}
#BeginCmtry
Commentary(ExpertMACD(Plot1));
#End;
最后一段叙述是在指针中加入一些指针功能解说。它可以方便新手或对你独创指标不甚了解的使用者得到一些使用信息。#BeginComtry~#End; 是说明档专属的写法,所有的说明叙述被包括在这个范围里。而Commentary()函式是输入说明文字文件的地方,不要忘了文字字符串要加“”。在此范例,当中输入的是另一个函式ExpertMACD(Plot1),它是一个互动的说明文件,可以告诉你点选的MACD代表什么意义或如何运用。当然我们可以如此简单的去写说明功能:
#BeginCmtry
Commentary(“MACD零轴以上为多头,以下为空头”);
#End;
如此我们在TS2000i中开启一个图形,插入(F7)MACD指标。然后我们在上面的菜单中选择Drawing>ExpertCommentray便可发现一个说明的浮动窗口,随着我们点选不同日期数据说明也会跟着不同;这是比较复杂写作的TS2000i专家说明互动文件。
对了,有一个事情你应该知道!TS2000i无法处理双字符的文字;也就是说它看不懂中文,所以我们无法在程序中输入中文字符串,它将会以乱码呈现。当然这包括了我们所谈过的批注或以上的说明运用。
待续
第二章:函式写作
我进入了解EasyLanguage是在TS4的时代,因为在此之前TS的程序写法还是阳春的、跟MetaStock一样。不过我的学习进步的很快,我几乎一夜之间就学会了;因为我有一位好老师。谁呢?就是EasyLanguagePowerEditor本身!它的求助文件提供了方便及迅速的知识支持。最可爱的是它内建的所有链接库,我拿我熟悉的技术指标开始阅读学习;于是语法、技巧与函式建立与呼叫一次搞定。
其实计算机的语言世界,跟我们人类的真实世界语言使用是大同小异的。不同语言间有许多的相似点,只要你掌握变量、运算、条件、循环、程序与函式等这些使用方法,你便几乎已经学会该语言技巧。EasyLanguage是一个衍生自Pascal的语言,所以各位学会EasyLanguage在交易的圈子是特别有用的。因为许多知名的交易开发程序它都不约而同的使用类Pascal的语法。比如你再往WealthLab学习时就会了解我所说的,当然更是容易学会使用AmiBroker等程序。
在进入主题前提一堆这些事是鸡婆,也是希望学习能下点耐心与苦功,相对的学习也是必须花点心让它Smart点,善用程序提供的资源。很多好程序都提供了求助的现上资源,可是很少看到有人会去使用它。
这一章谈的是EasyLanguage一个重要的语法运用-『函式Function』。想象你是个恋MACD癖、使用MACD狂。三餐缺了MACD就食不知味,从指标、PaintBar、ShowMe到交易策略交易系统你都要代入MACD才甘心、才有安全感?那你有没有想过要写几次MACD的基本运算?因为每一个开头起点你的资源永远只有开高低收几个数据,你都要重新算12天、26天的平滑系数平均值,然后相减再做9天平均,对吧?为什么不让这些核心表达式独立成一个部份,然后我们不论何时都可以把它呼叫达到程序书写简化的目的?人有错手嘛、你也没把握每一次写的时候都对。这个上面题的独立成为一个部份就是我们现在要学的函式的使用。
函式里面包括许多运算,可能是简单也可能复杂。你可以把它看成一个包含许多表达式的黑盒子(BlackBox),它可能有一个以上的输入端(Inputs)但只能有一个输出端(Outputs)。记得我们的MACD指标叙述吗(我改写过的)?
Macd_Now=MACD(Close,FastMA,SlowMA);
Macd_Xavg=XAverage(Macd_Now,MacdMA);
上叙中MACD跟XAverage便是函式,我先前谈的小太监。以MACD函式来说;括符内的Close,FastMA,SlowMA便是输入值(Inputs),是提供MACD函式运算的数据。我们在前头使用一个变量空间(Macd_Now)来接收MACD的计算结果输出值(Outputs)。函式输出值在任何程序语言中返回值永远只能有一个。所以我们不可能只写一个函式就把MACD与MACD的9天平均一起丢回来,我们必须再使用另一个函式XAverage来帮我们求得9天的MACD均值。有趣的是呆会我们会看到XAverage这个函式可忙的很,它是EasyLanguage的内建通用函式;它的设计目的就是专门运算平滑系数平均值,你说、在MACD全都用平滑系数运算的指标里,它会不会有够热闹跟忙碌呀?
MACD函数之1:
{*******************************************************************
Description:MovingAverageConvergenceDivergence
ProvidedBy:OmegaResearch,Inc.(c)Copyright1999
********************************************************************}
对上面这个满脸发绿的家伙我就不再解释了。不错它就是批注,给人涂鸦写些到此一游之类的地方。
Inputs:Price(NumericSeries),FastMA(NumericSimple),SlowMA(NumericSimple);
Inputs我们也不再有疑问,就是外部数据输入的设定,逗点区隔用分号结束叙述。不过函式有一些差异喔,看到NumericSeries?它可不是像指针用法直接输入数据(Value)而是输入格式(Format)。函式只宣告未来使用时你只可以给我喂些什么饲料?不合规格的饲料我才不肯吃进肚子里。除了NumericSeries(数值序列,就是数字啦!给我“阿花我爱妳”之类的踢!)之外函式也可以宣告输入格式为TrueFalse(逻辑真伪值)与String(Text文字),输出值也相同这三类;它在你File>New>General选Function时出现的窗口便会提示你设定回传值类别(ReturnType),在此我们希望它回传数值所以勾选Numerric。
MACD=XAverage(Price,FastMA)-XAverage(Price,SlowMA);
我们在MACD函式中只有这可怜的一行就解决了。不过这一行要注意的可也不少喔!首先你会发现等式左边『MACD』在此为什么没有用Vars宣告呢?因为在此的MACD是有特殊意义的,别忘了这个函式名称就叫做『MACD』!语法规定回传值它就是使用函式名称,所以不必再使用变量宣告手续脱裤子哺哺了。而且函式中不得再使用MACD做为其它变量使用,回传动作也只许一次。所以我们不能把上式写成了:
MACD=XAverage(Price,FastMA);
MACD=MACD–Xaverage(Price,SlowMA);
如此将导致MACD回传值被动作两次,导致非预期的不确定性。如果你是非得把简单变复杂的个性,我建议你改写成如下:
Vars:MACD_Temp(0);
MACD_Temp=XAverage(Price,FastMA);
MACD_Temp=MACD_Temp–Xaverage(Price,SlowMA);
MACD=MACD_Temp;(唯一的一次回传)
或者写成:
Vars:MACD_Temp(0);
MACD_Temp=XAverage(Price,FastMA);
MACD=MACD_Temp–Xaverage(Price,SlowMA);(唯一的一次回传)
记住、无论你写的是什么,从函式到指针、ShowMe、交易讯号等,写完都需要按一下F3!编译后才可以让TS2000i使用。再继续看下去!
MACD函数之2
{*******************************************************************
Description:ExponentialAverage
ProvidedBy:OmegaResearch,Inc.(c)Copyright1999
********************************************************************}
先复习一下这个函式的运算;平滑系数平均数。我们必须先由天数参数求得我们称为的『平滑因子』,它是如此得到的:平滑因子(F或Factor)=2/(天数+1)。然后我们将今天的数据(一般是Close)乘平滑因子+平滑因子补码(1-Factor)乘上昨日的平滑系数平均数,这也就是我们一般称的EMA公式(ExponentialMovingAverage)。
Inputs:Price(NumericSeries),Length(NumericSimple);
Variables:Factor(0);
Variables的简写就是Vars,在意义上同样是做变量使用宣告。在这里我们宣告一个名为Factor的变量,初值设为零。
IfLength+1<>0ThenBegin
这行的目的就是防止丢一些不知所云的饲料进来,比如说负数。如果你真的白目的丢进0这种鸭蛋、、我也会帮你自动加1,反正就是怕你做傻事啦。
IfCurrentBar<=1ThenBegin
CurrentBar不懂就翻上一章复习一下。这里就是设定还没到计算天数满足之前我们要做什么事呢?这里已经是让你看到IF之中的IF『巢状的条件判断写法』重点要记的是:每一个Begin都会对应一个End,可是呢、有没有注意只有第一个IF(主要判别)结束部份才能冠上分号(;)。这是EasyLanguage的文法一定要记住。
Factor=2/(Length+1);
上面说的平滑因子计算。
XAverage=Price;
如果还没有到开始计算的天数前,我们先用Price(在此通常为Close)代入。
End
Else
不然的话,也就是说进入可计算的天数之后,我们可以做正常计算了。
XAverage=Factor*Price+(1-Factor)*XAverage[1];
回传XAverage值。在你眼光所及,上面没几行也有一个Xaverage的回传程序;我不是刚提不可能做两次回传吗?呵!我可不会自打嘴巴,看倌自己看仔细来,这两个回传的条件是不可能同时发生的,所以同一时间只会有一个数据被传回。
End;
吐气、收拳、、结束。只有这里的End被加上分号,切记。
好啰!函式部份总算交代过去了。现在再课外补习一下;这次函式谈的是平均价的函式,所以我再举一个最常用的算术平均(简单算术平均)的函式来解读一下。大家应该现在的功力都不错了,所以我只挑重要的来解读。
{*******************************************************************
Description:SimpleMovingAverage
ProvidedBy:OmegaResearch,Inc.(c)Copyright1999
********************************************************************}
Inputs:Price(NumericSeries),Length(NumericSimple);
Variables:Sum(0),Counter(0);
Sum=0;
Forcounter=0ToLength-1Begin
Sum=Sum+Price[counter];
End;
IfLength>0Then
Average=Sum/Length
Else
Average=0;
看了一看,有一位新朋友不介绍可不行。就是程序的重要语法帮助我们累记或计次运算的灵魂FOR『循环』(Loop)。如果我们要得到一个数目,它是1+2+3+4、、、+10的总和,请问程序该如何写?
Total=1+2+3+4+5+6+7+8+9+10;
好小子有你的,你够狠!你要我怎么讲下去?好吧那加到1000怎么写?哼!傻眼了吧?看我的:
Vars:Total(0),Count(0);
Total=0;(不放心在Reset一次,变数归零)
ForCount=1to1000Begin
Total=Total+Count;
End;
白话文解释上头程序就是:
宣告使用两个变量Total与Count。
将Total的值设为0。
给(For)你一个变数它叫Count,它初值为1,但每次回来跟我报到之后都会被加1(变成2,第三次变成3),一直加到它变成1000为止。当然还没数到1000之前你只能在我画的圈圈里(Begin..End;)活动,不可以偷跑。
新的Total值等于原来的Total值加上Count的值。
文法:FOR『指定变量』 = 初始值To循环结束值Begin…End;
Forcounter=0ToLength-1Begin
Sum=Sum+Price[counter];
End;
假设我们要求的是算6天收盘的平均价,Length代入6、Price代入Close,程序可表现为:
Forcount=0to6-1Begin
Sum=Sum+Close[count];
End;
当count=0时sum=0+Close[0](就是今天的收盘Close[0]=Close同义)
当count=1时sum=Close[0]+Close[1](sum在上一行已经代入Close[0])
当count=2时sum=(Close[0]+Close[1])+Close[2]
当count=3时sum=(Close[0]+Close[1]+Close[2])+Close[3]
、、、一直到count=5循环结束。
它称为循环(Loop)的原因就是因为它会让程序在此产生一个回路、一个停留。一直等待循环条件满足它才会放行让程序执行下一个部份。现在我们介绍的是单纯的向上计数的循环,它也有往下数越算越小的,也有跳着数的;这些比较特别的运用你可以翻手册找找。下一章我们开始要谈最兴奋的话题──交易系统程序语法。
第三章:交易讯号介绍
没有了这一部份,TS2000i充其量不过是一套所谓还不错的实时软件罢了。所以你花的两千多美金绝大部份是买在它拥有的交易系统开发设计能力。不然几百块美金或万把块台币你就可以买第二首选的MetaStock啦。所以你一定要用心的把开发写作技巧学起来,才对得起自己的银子。
交易系统是实现你机械化交易的能力。看看你有没有办法把自己的交易构想白纸黑字化(量化、数据化)?你在做这件事的时候你是没有办法用灰色地带表达交易过程的,所以你对自己做了坦白、交易者最忌欺骗自己的。第二、你很懒我知道,因为我也不怎么勤快!当我们建立起一套交易系统的时候绝对是非常沾沾自喜的。感觉世界就在你脚下,抱着螺丝起子大喊我是世界之王!但、等等你今天吃蔬菜了吗?不是啦!是你的系统有做过历史数据测试(Back-Testing)吗?不同的商品市场不同的时间单位?不要告诉我你有啦,没有人会用手工去做那些事。现在给你介绍世界级的交易系统泼冷水大师TS2000i!短短的几秒钟它就会把你从世界之王的宝座将你打到波斯市场里窝在街头乞食的乞丐,原来天堂到地狱不过是眨眼的功夫。可是、相信我它是为了你好。不要用它没点头说好的系统在真实世界交易,不然恶梦它会成真。最后我会告诉你在TS2000i所提供的系统效能报告里的一些有用数据,让你的系统早日获得它的首肯,真正的让自己变成世界之王。
在TS4跟TS2000i之间是OMEGA对交易系统设计上做了最大的改良。TS4是把交易讯号跟交易系统混合一个部份完成,方便但它被锁在程序代码长度64K的梦魇。64K就相是一间两个褟褟米大的小套房,你很快就会有窒息感的,随便放个冰箱、电视呀什么的。EasyLanguage的变量根本就是个败家子,当你想呼叫昨天的收盘价用Close[1]是不是觉得很方便呀?在许多正统的程序语言里〔〕代表的是数组(Array)的意思。也就是说TS2000i里所有的变量(内建与使用者自建Vars:)都是宣告数组的方式在进行。所以不像正统的Pascal它宣告一个实数的变量只占两个Bytes,TS2000i每宣告一个变量就切割一个乘上你数据天数为个数的数组。所以以前动不动TS4就会跳出来哭着说『没地方睡觉啦』!
现在、TS2000i把交易讯号(Signal)跟交易系统(Strategy)设计跟成两个部份,所以你想飙个几千行的程序代码都不会有问题的。告诉你这些是要你知道写完也编译好后的交易讯号是必须要送到StrategyBuilder里做后续的引入与其它条件参数设定后才能使用的。我们开始谈吧!
MACD多头交易讯号
{*******************************************************************
Description :MACDLongEntry
ProvidedBy :OmegaResearch,Inc.(c)Copyright1999
********************************************************************}
Inputs:FastMovAvg(12),SlowMovAvg(26),MACDMovAvg(9);
Variables:XMACD(0);
IfCurrentBar>2ANDMACD(Close,FastMovAvg,SlowMovAvg)CrossesAboveXAverage(MACD(Close,FastMovAvg,SlowMovAvg),MACDMovAvg)[1]Then
Buy("MACD")ThisBaronClose;
我发现OMEGA公司把这段程序写的有点心不在焉。所以我改写如下:
Name:MACDBullish(Signal)
Inputs:FastMovAvg(12),SlowMovAvg(26),MACDMovAvg(9);
Vars:XMACD(0),MACD_Avg(0);
XMACD=MACD(Close,FastMovAvg,SlowMovAvg);
MACD_Avg=XAverage(XMACD,MACDMovAvg);
IfCurrentBar>2ANDXMACDCrossesAboveMACD_Avg[1]Then
Buy(“MACD”)ThisBaronClose;
这样看是不是清爽一点?看起来写交易讯号其实跟写指针没两样。差别在于指标拿结果来『画』(PLOT),讯号拿计算结果来做(TRADE)。所以上面的程序唯一可让我大书特书的就只有最后的叙述了。
IfCurrentBar>2ANDXMACDCrossesAboveMACD_Avg[1]Then
Buy(“MACD”)ThisBaronClose;
我尝试用普通话再翻译一次。假如(IF)进入正常计数模式下的第二天(CurrentBar在此约为26+9天,35天从数据起始日起算),然后又(AND)发现今天的MACD穿越过(CrossesAbove)昨天的9天MACD平均价的话(THEN)标示为“MACD”的买进讯号(BUY)将被启动,我们将在这个交易时段(ThisBar)结束前以收盘价买进一口(未标示口数将以内定值最小单位执行)。
这一叙述实在有太多要讲给大家听的,不过复杂的让我不知从何说起。就从头说吧,BUY是其中的一个买卖方向指令;基本方向指令约有四个(TS8不只)Buy、Sell、ExitLong、ExitShort,再加买卖条件指令(如Market、Limit等后面会说)就可以包括所有我们一切交易动作所需。
Buy与Sell望文生意就是我们要买跟卖出。ExitLong是平仓指令,就是当你手上的部位是多头时,卖出部位对冲了结(或称Cover);当然如果你手上没部位或者不是多头部位,这个指令就算条件被满足了也不会被执行。说到部位方向我就需要再介绍一个好用的内部函式『MarketPosition』它的传回值是0=没部位、1=多头部位(Long)、跟-1=空头部位(Short)。以下两个叙述的意义是相同的:
IfMarketPosition=1ANDClose>Close[1]ThenSellThisBarAtClose;
IfClose>Close[1]ThenExitLongThisBarAtClose;
是不是用ExitLong比较容易了解并且精简呢,这就是ExitLong跟Sell的使用不同点。对了!ExitShort不必我再提一次了吧?接下来我们谈接在Buy或ExitLong之后可以放什么?我们可以用括符代入字符串如(”MACD_Buy”)。这有什么好处呢?未来在TS2000i上执行交易策略时它会在进出场时间的那跟在线标示向上(Buy或ExitShort)与向下(Sell或ExitLong)的箭头,如果你的讯号不只一组;比如像BillWilliams的『鳄鱼』交易系统,除了你知道图上长满痘痘外根本分不清那一个进场讯号是谁发的?AO?AC?所以我们可以加这样的识别标签来方便我们辨识;当然标示功能是选项要加不加随你高兴。到此我们知道了两个东西写起来像这样Buy(”MACD_Buy”)。
再往后、我们可以再加一个也是选项的东西『部位规模』。如果你不想加那么TS2000i会以一口最小的单位来做进出仿真。如果你的交易构思包括部位的调整那你可以在此设定你的进出口数用Contracts(合约数);如果是股票就用Share为单位。到此我们的指令成长到Buy("MACD_Buy")5Contracts。
再来必填的进场(出场)时间点,就只有ThisBar(现在这根线)跟NextBar(下一根线的交易段)。通用合法叙述约有以下几个ThisBarOnClose(本时段收盘)、NextBarAtMarket(下一时段市价,其实就是下一根的开盘)、NextBarAt720.5Stop(下一时段停损720.5成交)、NextBarAt720.5Limit(下一时段720.5限价成交)。我举这些例子要你清楚看到ThisBar的叙述接的只有Close,其它的几乎都无法设定成立。所以你要今天停损出场请你提早订座,在昨天就要设定啦。现在我们学到Buy("MACD_Buy")5ContractsThisBarAtClose。完了吗?还没!
你不会想一辈子都只傻乎乎用Close进来又出去吧?比如说你要用停损单,那你要如何填价格呢?比如我们的停损在720.5我们就写成At720.5Stop或限价停损为At720.5StopLimit。再如果、720.5是你算出来的停损点,你现在是做空,该商品为小麦最小跳动点值为1/4美分或0.25美分。所以你停损应该是720.5加一点720.75,那你如何写?
ExitShortNextBarAt720.5+1PointStop;
只要写1Point,TS2000i就会自己去找对应的商品信息,自己帮你加上一个最小跳动点值。记住这叫最小最小跳动点值(TickVaule),对应的叫一大点跳动值用BigPointValue表示。以小麦为例Point=0.25美分,而BigPointValue=1美分。如果你想设一个停损点在突破三日最高价被突破时,写成:
ExitShortNextBarAtHighest(High,3)+1PointStop;
大概就是这样啰,其实还有清明上河图那么长还没讲。以后吧!以后慢慢说,反正写这系列我就有漫长抗战的打算;现在先充实大家的基本战技要紧。交易讯号写好编译OK之后我们就要用到策略架构功能(StrategyBuilder),准备看看我们的成果。选单>GO>TradeStationStrategyBuilder>New>Name填入My_System,Note自己掰>下一步>Add>勾选我们的两个讯号MACDBullish跟MACDBearish,你会发现讯号增加进来后LongEntry跟ShortEntry被点选,而Exit部份空着,没错!我们是只写了进场讯号>下一步>哗!看到一堆我们设定的Inputs参数,确认无误后>下一步>Pyramiding金字塔交易,到埃及去吗?当然不是啦!是指你有没有要做加码的策略?没有不要鸟它直接到下一关,如果有选的话请再选你的加码讯号是可以允许来自相同的讯号组吗?>下一步(真烦到底要走几步呀?)>第一格预设的50指最大的开仓数,第二格65000是设定最大部位建立口数或股票股数。下面打勾的是当你进场时要不要通知TS2000i的大掌柜TrackingCneter知道,如此你可以在那里看到你的实时损益,内定为勾选>下一步>讯号计算的最大起始值内定为50>终于按完成。又回到开始的窗口,我们可以发现我们的My_System已经在合格可使用策略名单了。
开启TS2000i我们在工作表上开一个商品图。按F7加入MACD指针(方便我们对照讯号)。再一次F7选Strategy部份点选我们的My_System,看到箭头了吗?那就是我们的设定进出讯号。
好、我想在这里结束基础课程,谈完我们的MACD系列从指针、函式、交易讯号到策略架构运用。因为OMEGA附的系统实在不怎么会振奋民心,所以我在此先结束我们的新兵入伍课程,告一段落。未来将进入实用课程,也就是我会实例加说明一步一步架构一个真正可用的交易系统;当然会包括指标写作的深入技巧与TS2000i的其它常用功能。好!稍息后解散!
第一部份完
TS2000i交易系统开发123──VIDYA(弹性指数动态平均)
开场白:从一个闪过脑海的念头开始
从这篇开始,我们进入中级的课程。我尝试用一个『空白』的角度,从零开始一步步的从无到有建立起一套完整的交易系统;到最佳化系统与报表评估。当然我采取的是呈现事实的角度,而不是提供一套保证获利的系统。如果你是喜欢与期待有人把饭煮好并拜托你吃的;孩子、长大些、成熟些!天下没有白吃的午餐。
像每一个人的过程一般,我们从一个交易概念开始出发。也许你看了我的文章『使用Vidya概念强化你的F1赛车』,觉得VIDYA是个不错的新概念指标,但不知道开发成交易系统会如何呢?于是、、你打开了TS2000i开始一段探索之旅。
首先、我们一般会先写成指针功能,方便我们先『面试』一下,未来我们也可以拿来核对讯号使用。我们要把核心VIDYA的运算写成一个函式(UserFunction),因为我们会在『指标』、『PaintBar』、『ShowMe』与『交易讯号』里重复呼叫使用。这个函式应该会是长的像这样:
{UserFunctionName:SS_Vidya}
Inputs:Length(NumericSimple),Smooth(NumericSimple);
Vars:Up(0),Dn(0),UpSum(0),DnSum(0),AbsCMO(0),SC(0);
Up=IFF(Close>Close[1],Close-Close[1],0);
Dn=IFF(Close<Close[1],Close[1]-Close,0);
UpSum=Summation(Up,Length);
DnSum=Summation(Dn,Length);
AbsCMO=AbsValue((UpSum-DnSum)/(UpSum+DnSum));
SC=(2/(Smooth+1))*AbsCMO;
If Currentbar=Length then SS_Vidya=Close;
If Currentbar>Length then SS_Vidya=(SC*Close)+((1-SC)*SS_Vidya[1]);
首先我们要像RSI计算一样,把今天收盘高或低于昨日分开记录并予以加总。UP变量记录今天比昨天收高的部份,DN记录下跌。这里我们使用一个到处看得到的判断语法『IFF』(Lotus、Excel到MetaStock都有)文法如下:
IFF(判断式,为真处理式,为伪处理式);
Up=IFF(Close>Close[1],Close-Close[1],0);
Up变量=IFF(如果今天收盘>昨日收盘,成立的话Up为今收减昨收,不成立的话Up代入零);
Dn= IFF(Close<Close[1], AbsValue(Close-Close[1]),0);
Dn变量=IFF(如果今天收盘<昨天收盘,成立的话Dn为今收减昨收的绝对值,不成立的话Dn代入零);
其实上式可以写成:
Dn= IFF(Close<Close[1],Close[1]-Close,0);
但是我故意这样做想来跟你介绍另一个常用的数学函式『AbsValue绝对值』。经过绝对值函式运算,我们只会得到正数不会出现带负号的数字。比如我们写AbsValue(3)或AbsValue(-3)我们都将得到『3』。
过来我们会常常用到『总和』的运算。Summation就是提供如此的功能运算函式。所以我们的UpSum记录几天的收盘上涨总和,而DnSum记录的是几天的收盘下跌总和。
UpSum=Summation(Up,Length);
DnSum=Summation(Dn,Length);
Summation必需代入两个参数,加总的数据(Up)与加总个数(Length)。如果我们要算9天的收盘平均,可以这样处理;
Summation(Close,9)/9;
我们在AbsCMO又再使用了AbsValue函式一次,之后巴拉巴拉的应该大家都看得懂吧?不懂的话请跳回前面初级重修。没问题就按F3编译后继续看下去。
完成核心函式后,我们开始写我们的指针功能。
{
IndicatorName:SS_Vidya
Chande'sVariableIndexDynamicAverage(VIDYA)
}
Inputs:Length(21),Smooth(5);
Value1=SS_Vidya(Length,Smooth);
If Value1>0 then begin;
Plot1(Value1,"VIDYA");
End;
这一段应该没问题,写完直接按F3编译。好啰,你应该可以在TS2000i里呼叫像以下的图形:
如此,我们看到我们的交易构思慢慢的完成。
1.已修正,应该是复制时出了问题。谢谢抓虫!
2.一些讯号问题我后面都会提到,这位同学我们这里没有资优跳级的!嘿嘿!不过你的这段语法,有些明显的逻辑错误与文法修正的须要。
IF Condition1=True then Buy("买") this bar at Market lowest(low,10) Stop
首先、Condition1不须加=TRUE;如果你的结果是取真值的话。所以你只要写这样If Condition1 Then…….。其次你真的不能跳级,因为我前面有谈及,EasyLanguage中关于今天你能做的坏事只有收盘成交,at Close(收盘买进或卖出)没有其它的指令可以使用。所以你的This Bar at Market是禁止的。再来、既然你已经使用Market了,就不可能再有后面的设价叙述。所以我不知道你这个指令的确实意图?如果照你后来的解释,我们也不可能设定一个停损买进是在我们现在的市价之下的,因为那将会被直接执行。所以我能想到的是以下几种可能,你参考看看:
If Condition1 Then Buy Nex tBar at Market;条件一被满足,明天市价买进。
If Condition1 Then Buy This Bar at Close;条件一被满足,今天收盘价买进。
If Condition1 Then Buy Next Bar at Lowest(Low,10);条件一被满足,明天在最近10日低价限价买进。
If Condition1 Then Sell Next Bar at Low(Low,10) Stop;条件一被满足,明天在最近10日低价停损卖出。
所以我劝你打好基础,有耐心点慢慢看下去。一般我们需要了解的语法与技巧我都会提及的。
第二部份:别让你的眼睛欺骗了你
曾经在台湾期货开放元年,我必须大老远的跑到台北,并备妥『身家调查』去办开户。有一位业务拉着我去看他的发现,让我这南部上来的乡下人长见识。他把KD指标天数调到45天左右,告诉我每一个交叉点是如何完美的相对于图上的高低点。当下我实在很想告诉他:老兄!你的近视度数最近有去复检吗?事后我想了一想,我是错了!他有的是斜视,跟近视无关。
其实我们都常常跟上面的那位仁兄一样,只是他是少数我碰到眼睛健康比较差的罢了。我们的眼睛经常有意无意的『对不准』价格与技术指针的日期轴,特别是如果你处于发现新世界的兴奋中时。所以我们必须要TS2000i的一些功能来帮我们做视力矫正,让我们看清事实的残酷。
上一章我们架好了指标的部份后,只发现一条紧贴价格的VIDYA,至于它的效果是否真如电视说的,真的可以迅速的美白呢?我们来用科学证明它的效果吧!这一章要跟你介绍TS2000i的两个验证专用工具,PaintBar跟ShowMe。是的、我一开头就告诉过你,这篇文章是模拟我们一步步开发系统的过程写的。一般我们不论用什么手段『取得』指标公式,我们都必须严厉的测试它的成效与特性。开启你的PowerEditor建立一个PaintBar空白页,编辑以下程序代码:
{***************************************
Writtenby:ParksonDow
Name:Vidya_BB
****************************************}
Inputs:Length(21),Smooth(5);
Value1=SS_Vidya(Length,Smooth);
Condition1=Close>Value1;
Condition2=Close<Value1;
If Condition1 OR Condition2 Then Begin
value2=High;
value3=Low;
PlotPaintBar(value2,value3,"Vidya_BB");
If Condition1 Then
SetPlotColor(1,Blue)
Else
If Condition2 Then
SetPlotColor(1,Red);
End;
唉!又要开始依文解释了。这里又出现一位新朋友,TS2000i的另一个特殊使用变量ConditionX。我们有介绍过他的兄长ValueX,这次它也有当纲。Value是使用在一般的变量,就是数字一类的;而Condition则是专司逻辑变量,也就是说它只存放真伪判断值(TRUE或FALSE)。Condition英文做『条件』的解释,所以在使用上后面会放上它的条件判断。所以我们的Condition1是判断收盘是否大于VIDYA?Condition2则是判断收盘是否是在VIDYA之下。
If Condition1 OR Condition2 Then Begin
这条读成:如果条件一或条件二其中一个成立的话,我们就、、。我们在EasyLanguage会常用到两个逻辑判断,AND跟OR。如果我们要所有的条件都为真才执行动作,我们就必须把每一个条件用AND连接起来;它代表无论你是否建立上百上千的条件判断,只要当中有一个条件不为真(TRUE)则整条判别都不被成立。相反的不管你是否有上千上百的条件,而你用OR连接它们;结果是只要其中一个条件为真,则整个条件判断成立。
Condition在使用上,我们只须写IFCondition1Then、、,而无须注明Condition=TRUE。如果你要使用伪(FALSE)值运算,可以用IFCondition1<>TRUEThen表示。如果你不用TRUE或FALSE的保留字,那么告诉你外国人的TRUE值是-1、FALSE值为1,不要鸡婆给它写错怪我没跟你说。就像外国人上涨是绿色表现,下跌是红色,如果你还没去修正TS2000i的设定而且没觉得很奇怪,快去改正吧,不然你不觉得奇怪吗?为什么你的K线是绿线带领上涨的?
上段的程序当收盘大于或小于都会被带进来处理,例外的便是收盘等于VIDYA的日子。接下来的Value2与Value3是设定你到时要画的PaintBar是这跟线的那一个价位到那一个价位,我们设成高点到低点。
PlotPaintBar(value2,value3,"Vidya_BB");
这句是PaintBar的主要语法,我们在这个符合条件的线(Bar)上涂鸦;命名为Vidya_BB,范围由当日最高画到当日最低。涂什么颜色在下面的式子里。
If Condition1 Then
SetPlotColor(1,Blue)
Else
If Condition2 Then
SetPlotColor(1,Red);
SetPlotColor函式是用来设定我们要上的颜色是什么,它不一定只用在PaintBar上,许多地方都可以运用让你的TS2000i活像件夏威夷衫。第一个输入的参数是要画的线段代号,我们这里PLOT只有一个所以值设1就对了。紧跟第二个参数便是颜色设定,TS2000i没几个颜色好玩的;你可以在在线求助档用Color找看看。说故事、说故事:如果条件1成立(收盘大于VIDYA)我们就用蓝色用力的给它画上去。如果条件2成立(收盘小于VIDYA)的时候,我们就洒狗血用红的画。
同样写完按F3编译,然后我们在原来的图上再按F7选PaintBar功能,点选我们的Vidya_BB。那么你将会看到以下的图:
效果其实看起来还不错,对吧?有俱备冠军相。
待续
再来!我们现在已经把多空用PaintBar顺利的『分化』它们了。接着我们学着用ShowMe来帮我们试着标示进场点。开一个ShowMe新页写以下的程序:
{***************************************
Writtenby:ParksonDow
Name:Vidya_BS
****************************************}
Inputs:Length(21),Smooth(5);
Value1=SS_Vidya(Length,Smooth);
Condition1=Close[1]>Value1 AND Close[2]>Value1 AND Close[3]<Value1 AND Value4=0;
Condition2=Close[1]<Value1 AND Close[2]<Value1 AND CLose[3]>Value1 AND Value4=0;
If Condition1 Then Begin
Value2=High[1]+1Point;
Value4=1;
Plot1(value2,"Bull");
End;
If Condition2 Then Begin
Value3=Low[1]-1Point;
Value4=-1;
Plot2(value3,"Bear");
End;
If Close Crosses Above Value1 OR Close Crosses Under Value1 Then Value4=0;
根据这个公式的出处『寰宇财金45最新技术分析指标』第195页有提及该VIDYA指标的进场法则。当今天与昨天收盘都高于VIDYA时我们在明天以今天的高点加一个跳动点设停损买进指令。所以我们尝试将此概念写成ShowME让我们看看进场的情形会如何?一连串的条件让我们写成AND的连环船Condition1跟Condition2就是在写上述规则,相信现在的你们应该都可以自己试着读出,不必我再解释。不过其中陌生的应该是Value4的使用时机。要解释Value4我们要先解释最后一行:
If Close Crosses Above Value1 OR Close Crosses Under Value1 Then Value4=0;
这行看起来有点头大?其实没有很复杂的。它的意思是如果今天收盘穿越VIDYA之上(代表昨天没有),或者今天收盘跌破VIDYA(昨天在上头),则我们将Value4设定为零。如果有美国时间我们也可写成:
If(Close[1]<Value1 AND Close>Value1) OR (Close[1]>Value1 AND Close<Value1) Then Value4=0;
这样叫讨皮痛对吧?不过意义是一样的。为什么我们要加一个Value4呢?因为它用来做一个判断开始的『标识』,用来阻断ShowMe尽情的乱画搞的我们眼花。如果你不信就把Condition1跟Condition2的后面Value4=0的判断去掉,编译看看出来的麻子像什么。这是一个程序书写技巧,我称它为『旗标』(Flag)。就像我们写一个交通警察进去帮我们管制交通。最后一行我们开启为绿灯(设Value4=0),于是让Condition1与Condition2得以执行(我们的AND连环船是必须一致表决通过的,Value4不为零就不能成立)。再来、我们在底下的两个IF判断中如果成立,顺利执行画点功能则Value4之后便被上锁,不再是零而是变为1或-1。于是我们的Condition不会再执行,直到趋势被改变启动最后一行时,Value4才会再度设回为零。
我们这个ShowMe功能设定成标示出买卖日进场价位。所以未来你看到图可能标示在线中或空白的地方。如果跟线有重迭就是代表指令当天有成交,被标示在空白地方的话未来可以决定是否以原设定价做追价动作。最后来看看ShowMe的标示方法:
If Condition1 Then Begin
Value2=High[1]+1Point;
Value4=1;
Plot1(value2,"Bull");
End;
它跟指针的语法可以说没啥两样,使用了Plot的函式。代入的是标示的价位与文字标签。好啰按F3吧!去看看我们的成果。
待续
第三部:让想法自由飞行
问问我们自己,花这么多时间学习最终要的是什么?什么都不是!我们要的只是自由,一个人生命的自由。从知识得到财富的自由,最终解放我们自己,亲尝生而自由的感觉,这才是交易最终的目的。
我从未想过用一生浸淫交易当中,生命还有很多我想学习的东西,地平线的那端还有许多我未曾走过的地方。你希望在垂垂老已的时候还搞精密计算来交易维生吗?还是这只是你现在唯一想到防止自己老人痴呆的方法?十多年前我便放弃传统的图形分析、抽象交易法;转入机械化交易的研究。因为它是目前我所认知的最好解决交易的方式。在目前它可以让你明确的走到设定的未来,达成你的资产目标。未来、不知多久的未来,只要你一息尚存;你都可以使用一个最简单与有效的方法交易获利,你为什么不选择这样的路呢?
从以前我的网站已然谈过许多机械化交易的观念,达到机械化交易的方式就是跟我做像以下的事:白纸黑字写下你的交易法则,并确实执行!如果你不能用确定的字眼写成,那你零分。如果你写的像万里长城那么长,那60分。你以为很容易?写看看吧!这些年来还没人真的写给我看过。知道吗?这就是你交易无法成功的盲点。相信我、现在就开始做这件事!完成了、你就完成机械化交易的目标。
上TS2000i是另外一回事;我们称为『程序化交易』。因为你可以机械化你的交易,也就是说你的交易可以『数据化』、『量化』,所以可以把它『程序化』。很多人以为非得上计算机才叫机械化,其实不完全对的。机械化交易其实就是要我们把自己的交易条理化罢了。
现在我们来看看VIDYA的交易;如果我们依它来交易,我们的白纸黑字会是什么?
做多条件:如果今天跟昨天的收盘都大于VIDYA;那么我们明天在今天的高点外买进。
做空条件:如果今天跟昨天的收盘都小于VIDYA;那么我们明天在今天的低点外买进。
做多回补:如果今天收盘跌落VIDYA之下,多单回补。
做空回补:如果今天收盘站上VIDYA之上,空单回补。
这是最基本的交易规则,包括了我们何时、如何进场与出场。不要紧张,这章会有点长度,最终我会让规则最终很充实的;但现在我们一步一步来。依惯例先让你看一看程序代码,也请你先比较程序跟上头的规则之间转移的技巧。
{***************************************
Writtenby:ParksonDow
Name:Vidya_1
****************************************}
Inputs:Length(21),Smooth(5);
Value1=SS_Vidya(Length,Smooth);
Condition1=Close[1]>Value1ANDClose>Value1;
Condition2=Close[1]<Value1ANDClose<Value1;
Condition3=CLoseCrossesUnderValue1;
Condition4=CloseCrossesAboveValue1;
IfCondition1Then
Buy("Buy_V")NextBaratHigh+1PointorHigher;
IfCondition2Then
Sell("Sell_V")NextBaratLow-1PointorLower;
IfCondition3Then
ExitLong("Exit_B")ThisBaratCLose;
IfCondition4Then
ExitShort("Exit_S")ThisBaratCLose;
没问题吧?再有问题就请同学重修前头的东西啦。唯一新的东西应该就是那个Higher(更高)跟Lower(更低)了。其实它就是我们在设STOP的意思,拿一段来讲古吧!
IfCondition1Then
Buy("Buy_V")NextBaratHigh+1PointorHigher;
我有点觉得一直在当乩童旁的『桌头』。现在是说:如果条件一成立的话,我们下买进指令,买在下一个时段当价格高过(+1)现在时段的高点,当然更高的价格也会被接受。基本上就是以今天高价为参考价,突破买进(BreakOut)。
在第一段我的目的只是要承继我们先前的努力与研究,把PaintBar与ShowMe所得的心得做完整的转移。所以我们的买进的讯号会是跟ShowMe相同,而持仓的时间会跟PaintBar一样的,你的平仓会标示在PaintBar的颜色转换间。没问题的话就编译看看成果吧!热身一下、辛辣的就快上菜了。
待续
第四部份:不要再背离科学盲目交易下去了
你认为到上头的箭头出现你的工作就大功告成了?错!痛苦的事才刚刚开始呢。我们学习交易的人,摸着良心说;有几个人做过我上一章说的『白纸黑字』呢?还有、有几个人真正的逐笔逐笔的核对过讯号的进出呢?更徨论在不同的数个市场的历史价格中一笔笔的计算记录呢?这些难道不重要吗?你是怎么放心的去用你的系统交易的呀?
今天、TS2000i帮你迅速的完成上面那些不可能的任务。它帮你一笔一笔的标上进出的讯号时机,最重要的它帮你计算盈亏还有做你想象不到的策略分析与风险控管。现在我们就是要开始介绍这部份,另一个TS2000i的宝藏。保持你的TS2000i停在上面最近的一张图上头;点选View>StrategyPerformanceReport你会看到像这样的一个新窗口,我们交易系统的策略效能评估报告。
这个评估报表是非常复杂与「庞大」的,不下于你在阅读上市公司的财报。基本上你要不俱备某种程度的统计学知识,我保证你会像诸葛亮写出师表的最后那一句『临表涕泣,不知所云』。在这里我只选择性的介绍一些我们这些统计的『门外汉』可以理解与重要的数据来做解说。先看最上页Summary摘要的部份,这部份你必须要全部了解的。
TradeStationStrategyPerformanceReport-Vidya_1WN5-60min.(2005/1/3-2005/6/24)
这行没什么要解释的,只是让我们知道报表的分析项目与时间。我用的策略是Vidya_1的系统,商品是2005年7月份的小麦小时图。分析期间为2005年的1月3日到6月24日。
PerformanceSummary:AllTrades 分析摘要:全部的交易。
这部份分析与显示包括做多与做空混合并列,也就是完整的交易部份。在摘要的这部份你往下看会找到一共有三部份;除这个包含多空的AllTraders部份还有只列做多『LongTraders』与只列做空的『ShortTraders』部份。
Total NetProfit 净盈
Gross Profit 毛利
Gross Loss 毛损
虽然我写净盈,但是它不代表你的系统一定会产生最后的盈利,它仍有正负数的表示。它是代表你的系统获利部份减去亏损的数值;也就是下方的GrossProfit(毛利、获利交易)减去GrossLoss(毛损、亏损交易)。有些人喜欢直接以Netprofit是否为正与正值多寡来评断系统的好坏,其实这是很「不健康」的方式。比如说两个系统NetProfit都为产生20,000美元的获利;系统A的GrossProfit是USD$25,000,GrossLoss为USD$5000。系统B的GrossProfit为USD$60,000,GrossLoss为USD$40,000。我会喜欢系统A多一点,因为系统A所产生的交易过程资金变动会比较小,就是说心脏会比较平稳跳动过日子。交易次数也应该不会像B系统多,干嘛便宜了期货公司?
OpenpositionP/L 未平仓损益
如果你尚有未平仓的部位,这里会显示它目前结算的盈亏。
Total#oftrades 时间范围内总共交易次数
Percentprofitable 系统获胜百分比
Numberwinningtrades 获利(成功)交易次数
Numberlosingtrades 亏损(失败)交易次数
这四个一组介绍因为它们是有连带关系的。它说明你的系统在设定的时间内总共进场交易几次?而这个进场次数产生了几次的获利交易与亏损交易次数。最后获利与亏损次数的比率为何。再一次告诉你不要又拿获利百分比不健康的看系统。也许你的系统是20%的次数获胜比,但是可能它的一次获利可以抵20次的亏损,你要不要?看报表就是要学会综合评估的要领,如果一个数据就可以决定那TS2000i弄出一堆数据是冲着你开玩笑的吗?
Largestwinningtrade 最大一笔的交易获利
Largestlosingtrade 最大一笔的交易亏损
列出的是我们的交易系统在交易过程,产生的一笔最大的获利金额与最大的一笔亏损金额。这里我们希望获利的金额远大于亏损金额,这样的话代表我们的系统多少是健康与优秀一点的。
Averagewinningtrade 平均每笔获利金额
Averagelosingtrade 平均每笔亏损金额
Averagewinningtrade=GrossProfit/Numberwinningtrades。这里我们也希望平均每笔获利的数据大于甚至远大于平均每笔亏损,因为我们的系统获利就是靠获利跟亏损拔河而来的呀。
Ratioavgwin/avgloss 获利与亏损比
Avgtrade(win&loss) 所有交易次数综合每笔平均获利
获利与亏损比,代表我们每投入一元的风险可以得到多少的报酬?如本例数据为2.43,代表我们每投入一元的风险可以赚回2.43元的利润。一般来说1:3会是一个让人有挡不住的交易冲动,不过这个2.43也强差人意的了。比如说你玩一些博奕的东西如21点,你每押一元可能的就是赢另一个一块钱,所以它的获利亏损比为1。2.43代表着你每押2.43次亏损后赢了一次便能打平。
Avgtrader代表净盈平均分配到所有的交易次数(包括亏损次数)所产生的每笔平均获利金额。Avgtrade(win&loss)=TotalNetProfit/Total#oftrades。
Maxconsec.Winners 最大连续交易获利次数
Maxconsec.Losers 最大连续交易亏损次数
这两个数都是取所有交易次数里的最大值表示。也就是说这个系统曾经连续获利几次与连续亏损几次。在这个例子里我们可以发现它的连续获利为5次,可是我们的总交易次数不过为20次,而且最大连续亏损只1次(跳着来)。所以这个5次可能只是一个特例,没什么参考价值。倒是最大连续亏损的1次是可以来好好的参考一下的!
Avg#barsinwinners 平均获利持仓时间
Avg#barsinlosers 平均亏损持仓时间
显示你获利从进场到出场平均历经多久的时间?一个正常的系统获利的时间应该也是多于亏损的持仓时间的。活的越久领的越多呀,广告不都这么说的?
Maxintradaydrawdown 最大当日造成资产亏损值
这个可是这报表的重要数据。Drawdown的意思就是掉下去啦!缩水啦!简单的说:你的交易系统在经历例子里的20次交易时间中,你的资金曾经一度缩小多少的最大值;你完成所有交易必须承受的最大资金风险。一般的运用就是如果小麦的保证金是USD$1,000,你必须至少准备USD$1,000加Maxintradaydrawdown(此例为USD$700)=USD$1,700。这样才可以保证你一交易时便碰到这个冲击后仍能不被追缴保证金或再出击的能力。这个数据产生于单笔交易统计所得。
Maxintradaydrawdown到底是什么?第一它不一定是由亏损交易中产生的。比如你有一笔交易最后它产生了USD$800的获利,但是它在产生获利之前也就是你未平仓之前,它一度产生USD$700的浮动亏损;因为你的停损并未被启动,但是它在盘中是曾经造成这个亏损的,这个曾经造成的亏损就是DrawDown!所以获利与亏损的部位都可能有DrawDown产生的。
在摘要的部份我选择重要的解说就是这些。接下来谈Traders交易详列部份的报表。
在点选Trades的部份后,我们会看到像底下的窗口内容。
这部份详列了评估系统每笔的交易细节。这页里特别强调策略与财务的分析,所以称它是高等的分析报表。在左上角你可以点选不同的报表展现方式。也可以用传统的报表如下所列。
我们现在解释的名词以高等的报表为主,因为上头有许多名词隐藏许多公式,反正就是不说你永远也搞不清楚的啦。
Trade# 交易次数编号
Type 交易类别,买进或卖出
Date 进出日期
Time 进出时间
Price 进出价格
这个不用解释吧?
Contracts 建立部位数目(几口)
Profit 盈亏、损益
上半部的数字显示进场的部位是几口,下面的数字为交易的损益;跟小学的成绩单一样红的就是打屁屁的,特别怕你忽略掉它还帮你括符起来。
%Profit 单笔获利百分比
CumProfit 累计盈亏金额
上项为此笔交易相对于资金的获利百分比。下方为自第一笔交易以来所累计的总交易盈亏。
Run-up 部位持有时间曾经产生的最大获利
Drawdown 部位持有时间曾经产生的最大亏损
Run-up跟Drawdown是相反的名词。Run-up在标示你这笔交易可能产生的最大利润,非平仓利润是指你当过路财神的部份。比如你买进一口小麦,最后你平仓赚得USD$1000,可是盘中可能曾经发生过USD$1500的浮动获利;我们总是没法平在最好的价位不是吗?Run-up就是那个最好的价位。至于Drawdown就是嗯~最大梦魇的那一部份啰。
EntryEff. 进场价位效率
ExitEff. 出场价位效率
多头进场价位效率
Entry_Efficiency=(Highest_Price-Entry_Price)/(Highest_Price-Lowest_Price).
做空进场价位效率
Entry_Efficiency=(Entry_Price-Lowest_Price)/(Highest_Price-Lowest_Price).
不要被上头的两个公式吓到了(现在说会不会有点晚了)!其实你不觉得蛮眼熟的吗?它根本就是用来算KD里那个RSV(或%R公式)的公式啦。这个公式是在分析你的进场价位是在这段时间(在平仓之前)价格范围的百分比。为什么分多空呢?因为你做多进场当然是越靠近最低价格越好啰,所以拿最高价减进场价再去除价格范围;得到的比数越高表示含盖的价区越高,自然代表一个好的开始。空单当然我们希望离最高的价格越近越好啰。至于出场的效率计算公式是这样的,自己依样画葫芦想想吧!
多单出场
Exit_Efficiency=(Exit_Price-Lowest_Price)/(Highest_Price-Lowest_Price).
空单出场
Exit_Efficiency=(Highest_Price-Exit_Price)/(Highest_Price-Lowest_Price).
TotalEfficiency 交易效能总计
多单交易计算
Total_Efficiency=(Exit_Price-Entry_Price)/(Highest_Price-Lowest_Price),
空单交易计算
Total_Efficiency=(Entry_Price-Exit_Price)/(Highest_Price-Lowest_Price).
这个公式也没啥变化,就是要表示你在这段行情中到底「啃食」了多少行情?进出的价格距离除以此段时间的价格范围。假设市场总共上扬了100点,而你进场交易做多赚了70点,那你这笔的交易效能就是70%。
说完两个主要的报表项目了,最后我会选图表的一些部份解说就结束这个分析报表的解说,因为一般我们常用的大概就这几页了。
现在、我们点取『Graphs』,显示的第一张图应该是『EquityCurve 资产变化曲线』如下图一般。
这张图观察你的系统在这段时间,对你的账户资金做的改变。看这张图的重点有两个;壹、它是否是正的成长,就是它是否让你赚钱,这件事比较简单些。第贰、我们应该观察它虽然努力的往上爬,但问题是它如何的爬?比如说:在第11次交易后我们的资产值创了新高,但是随后到第16次另一个新高之前它向下的回吐资产是不是幅度很大?在我们的例子里似乎这套系统是非常稳定的在运作着。好玩的说法是它让你的心脏非常健康的、有益的跳动着。
接下来我们要看另一个比较重要的图表。点选图表的左上选单,从EquityCurve改变为Drawdown/Run-upGraphs,你会看到下图『Drawdown』的分析图表。
Drawdown表示未平仓前部位产生的最大浮动亏损值。这是对每一次交易逐次检讨的,水平的蓝线代表Drawdown的平均值,这里为147.62。你可以把光标靠近一些点,它会给你详细的数字;本例中标示的是第12的亏损值,也是图上最大的一笔负值。
这张图与数据告诉我们,使用这个交易系统无论每次进出最后的盈亏为何;我们都可能在平仓前承受约147.62的浮动亏损。这代表如果你是以亏损百分比或盘中亏损值来设定停损的人,当你设定在147.62以下的金额时,你有可能『冤死』许多可能获利的部位。
别忘了我们先前数据Averagelosingtrade为180.36;这是平仓实现的亏损平均。这两个数据给我们什么东西呢?当我们的盘中浮动亏损在147.62以内的时候,部位可能还是处于正常的波动值,我们仍可以期待该部位未来开始产生获利。而当亏损扩大到180.36以上时,你对这个部位的获利想法应该修正往比较保守的想法。如果我们的数据分布是趋向稳定的,我们可以尝试设定147.62减一个标准差来设定我们的资金停损点。在这里我们用180当范例来设定,在TS2000i中我们可以用内定函式SetStopLoss(180);来设定亏损资金式的停损。程序可以修改为:
{***************************************
Writtenby:ParksonDow
Name:Vidya_1
****************************************}
Inputs:Length(21),Smooth(5),St_Loss(180);
Value1=SS_Vidya(Length,Smooth);
SetStopLoss(St_Loss);
Condition1=Close[1]>Value1ANDClose>Value1;
Condition2=Close[1]<Value1ANDClose<Value1;
Condition3=CLoseCrossesUnderValue1;
Condition4=CloseCrossesAboveValue1;
IfCondition1Then
Buy("Buy_V")NextBaratHigh+1PointorHigher;
IfCondition2Then
Sell("Sell_V")NextBaratLow-1PointorLower;
IfCondition3Then
ExitLong("Exit_B")ThisBaratCLose;
IfCondition4Then
ExitShort("Exit_S")ThisBaratCLose;
你可以直接把金额填入SetStopLoss后的括符里,我们这里把它弄成输入的变量是呆会有需要的。记住!如果你现在跟我一样改变了这个使用中的讯号函式的一些状态,如我们增加了一个变量的输入。你必须要再去StrategyBuilder报到一次,使用Edit功能修正你的策略内容,不然你的系统就会丢一些你想象不到的报告。
我们这样做之后发现我们的整体表现下降了,也许我们是『误杀』了一些金鸡母也不一定。我们开始来讨论一个热门话题『系统最佳化』或者说系统优化。我本身是对这件事有点感冒的,因为许多人迷信到每日不停的去做这件事。
我认为做最佳化的时机,只在系统设计之时而非上线交易。因为它是标准的事后诸葛亮的动作,历史只会是借镜,就算它重演了也不一定百分百。我们做最佳化只在系统『出厂』前才对。藉以观察我们的变量是不是客观,而不是盲目修正参数去附和最佳化报表。
点选目录的「Format」>AnalysisTechniques>在出现的窗口点我们的Vidya_1>点击右边的Format>在Inputs发现我们的三个输入参数>点其中一个然后点下方的Edit。你应该看到其中一个字段Expression有你的设定值。我们接着点选左下角的Optimize,你会发现Expression不见了被三个新的格子取代了;分别是Start、Stop、Inc。以我们第一个Length为例,原值为21。但我们希望观察它在5到40的表现会如何?我们分别在Start填5(起始值)、Stop填40(终止值)在Inc填1(每次增量值),填完点选OK。你现在会发现你的Length参数从21变为5..40:1。重复上头的动作也一起修改其它两个数据。最后我们点下面的确定键,跳回到AnalysisTechniques,接着点选右上的Optimize进行最佳化运算,耐心等。
运算结束后你可以在View>StrategyOptimizationReport看到所有的运算结果。耐心去寻找左边数字只有一个加了星号的,那组便是最好表现的组合。TS2000i会以这组数字置入你目前的参数中;所以你可以再一次看策略报表,思考这样的改变是否有正面的意义。整篇的系统设计讨论也在这里划下句点,全篇完。