实例讲解EasyLanguage入门

KnowHowEasyLanguagePowerEditor

简介

OmegaResearchTradeStation系列产品是交易者公认最好用的交易工具整合环境。你不只可以拿它来看盘,使用它内建的诸多技术指针协助分析交易,你也可以自行开发属意的指标,只要你想的到的。最重要的你可以用它来开发交易系统协助你进入机械化交易的世界。把交易构想付之实现并量化,你可以给自己交易最重要的东西──信心!

这个开发并实现交易梦想的核心就存在它内含的EasyLanguagePowerEditor当中。它不是一般点选内建指针,再加一些逻辑运算选项的阳春交易系统设计平台。它是透过一个类似Pascal语法的所谓EasyLanguage来书写你的程序代码,然后透过内部的编译器产生执行效率高的机码(这就是让它屹立不摇的卖点)。甚至连它的竞争者如EquisMetaStock等多年来也只能不敢吭声的当老二。

虽然它名为「容易语言」,可是对许多没有程序语言经验的人来说它还真是宛如火星语一般的叫人直呼「不容易」。特别对我们这些非英语系的地区又多一曾障碍可称为最高级的「真不容易」。你的英语能力我没办法帮你改善的,至于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的部份是代表这些数据未来在我们使用该指标时是可以被更改的。如本例可以看到12269就是一般MACD参数。特别说明的是参数FastMA时虽人管你要命什么名,但定一些可性高的名称对你未使用是一件好事的。FastMA快速的移平均线比用abc的叫人意些吧?

初值一般也引用常用代入,如此在使用上你也方便自己多。什么我来参数呢?因它方便你在使用迅速的更改配合当时需要。也你有天想看看以6,13,5算的MACD会长得如何?那好你直接在参数便可。如果你不用Inputs、那抱歉你只有再PowerEditor改新参数,然后重新编译一次才可以使用,当然你要是每到阴天闲的发慌我不阻止你如此干,至少你孩子会对我感激涕零。

Plot1(MACD(Close,FastMA,SlowMA),"MACD");

Plot1 呼叫Plot1函式(函式未来会提,现在你就当自己是皇上吆喝各司其职的小太监上场。有侍衣、侍食、侍寝、、之类的他们有自己的专属工作,只待你一声令下,只是你要叫对人)。函式后面紧跟括符『()』,同样以分号结束叙述。括符内加入函式本身需要的参数或变量。加什么呢?这时手册就派上用场了!每一个函式要加的参数是不一定的,所以手册会帮你找到。你也可以利用在线手册,点选右上像一本书的图示或是选单的ToolsEasyLanguageDictionary

文法Plot1(代入要显示的数据,”示的文字字符串”);同样的各参数间以逗点相隔,以分号结束。这里有一个不同;字符串输入必须包含在“”之间。它藉以区隔特别是数字以文字不被处理而直接表现。比如说”3-2”会表现3-2而不是变成1。

Plot1它有许多兄弟姊姊,排行由1到4。为什么呢?因为TS200i设计成每个指针的显示个数最大为4,无法显示更多。对了这四条线的当然包括你喜欢加在如RSI的超买或超卖的水平线,珍惜物资喔。

这例子中第一个代入的数值变量,我们的MACD数据由另一个函式完成运算。也就是说函式之中另有函式!其实不用大惊小怪,在程序语言这是很正常的事。你叫来服侍你吃饭的小太监当然需要再找御膳房的小太监帮你张罗,不是这样吗?

MACD()这个函式需要输入三个参数。后两个是我们提过的外部输入的天数参数,就是算12天平滑平均减26天平滑平均。那用什么来算呢?『收盘价』不是吗?所以第一个参数我们置入Close。在EasyLanguageOpenHighLowCloseIFTHEN等被称为保留字(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的指点选FileNewGeneralIndicator生一空白的指公式书写页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』进行,记住!所有新写或改写的程序都必须按一下F3PowerEditor帮你检视并编译才可以使用。当回应你Excellent!你就可拍拍手鼓鼓掌,因了通行证给你。快去TS2000i张图然后按F7看看Indicator有你的大作出?找到My_MACD点选热泪盈眶呀?

接踵到。你的柱状图为啥跟MACD条线呢?嗯、再回到我PowerEditor点选FilePropertiesIndicatorPropertiesMy_MACD窗口下ChartStylePlotsMADiffTypeHistogram得改完按确定后是要按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『操作』!在四则运有什么问题序也依习惯做先乘除后加。在『件式』法中可用逻辑操作数连接几个条件判;如ANDOR等。特的是大于或等于成>=,不可以=>。

拉回下去。如果THEN之后我行的不只是一步,那要如何解道我要一IF~THEN下去?然不必如此!我用一方式行某范作,我BEGINEND界定多个动作。

IF今天下雨?THENBEGIN

就要打

前提醒家人外出也要带伞

查家里的窗户关

END;

上面的条件判断后将执行三个动作。当然你还可以在IF-THEN中再加入另一个IF-THEN,形成所的『巢式』,往后碰到例子再加强说明吧。除上面IF-THEN之外我又看到几常用函式,介一下用法!

CurrentBar是一常常呼叫的函式,不它不必引入参数,它回的是一个数字,这数字跟你算指的起始有效日。在此例中、我始的第9天后才能算出KD的值,所以CurrentBar传为就是第9天。所以我在第9天之后KDCurrentBar>1),如此你就不在第9天之前看到七八糟的指针数据了。

Highest(较数,)这个函式很容易了解因它用High+Est里的High不是指我们说日最高,而是一堆据里的最高值发现。所以我如果Highest(Close,9);将会寻找出去9天中最高的收价。而相Lowest()便是找出入范的最低值。

最后一sKsK[1]sDsD[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』。那向下穿越便是CrossesUnderCrossesBelow!如果我非得用大小于表示的,那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中开启一个图形,插入(F7MACD指标。然后我们在上面的菜单中选择DrawingExpertCommentray便可发现个说明的浮窗口,随着们点选不同日期明也不同;是比杂写作的TS2000i明互文件。

对了,有一个事情你应该知道!TS2000i无法处理双字符的文字;也就是说它看不懂中文,所以我们无法在程序中输入中文字符串,它将会以乱码呈现。当然这包括了我们所谈过的批注或以上的说明运用。

待续


第二章:函式写作

我进入了解EasyLanguage是在TS4的时代,因为在此之前TS的程序写法还是阳春的、跟MetaStock一样。不过我的学习进步的很快,我几乎一夜之间就学会了;因为我有一位好老师。谁呢?就是EasyLanguagePowerEditor本身!它的求助文件提供了方便及迅速的知识支持。最可爱的是它内建的所有链接库,我拿我熟悉的技术指标开始阅读学习;于是语法、技巧与函式建立与呼叫一次搞定。

其实计算机的语言世界,跟我们人类的真实世界语言使用是大同小异的。不同语言间有许多的相似点,只要你掌握变量、运算、条件、循环、程序与函式等这些使用方法,你便几乎已经学会该语言技巧。EasyLanguage是一个衍生自Pascal的语言,所以各位学会EasyLanguage在交易的圈子是特别有用的。因为许多知名的交易开发程序它都不约而同的使用类Pascal的语法。比如你再往WealthLab学习时就会了解我所说的,当然更是容易学会使用AmiBroker等程序。

在进入主题前提一堆这些事是鸡婆,也是希望学习能下点耐心与苦功,相对的学习也是必须花点心让它Smart点,善用程序提供的资源。很多好程序都提供了求助的现上资源,可是很少看到有人会去使用它。

这一章谈的是EasyLanguage一个重要的语法运用-『函式Function』。想象你是个恋MACD癖、使用MACD狂。三餐缺了MACD就食不知味,从指标、PaintBarShowMe到交易策略交易系你都要代入MACD才甘心、才有安全感?那你有有想几次MACD的基本算?因每一个开头你的源永只有高低收几个数据,你都要重新算12天、26天的平滑系平均值,然后相再做9天平均,吧?什么不让这些核心表立成一部份,然后我都可以把它呼叫到程序书写简化的目的?人有手嘛、你也把握每一次候都这个上面立成部份就是我们现在要的函式的使用。

函式里面包括算,可能是简单也可能复。你可以把它看成一包含多表式的黑盒子(BlackBox),它可能有一以上的入端(Inputs)但只能有一个输出端(Outputs)。得我MACD标叙(我改写过的)?

Macd_Now=MACD(Close,FastMA,SlowMA);

Macd_Xavg=XAverage(Macd_Now,MacdMA);

MACDXAverage便是函式,我先前的小太。以MACD函式来说;括符Close,FastMA,SlowMA便是入值(Inputs),是提供MACD函式算的据。我在前使用一个变量空Macd_Now接收MACD出值(Outputs)。函式出值在任何程序言中返回值永只能有一。所以我不可能只函式就把MACDMACD的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逻辑值)与StringText文字),出值也相同;它在你FileNewGeneralFunction的窗口便提示你定回类别ReturnType),在此我希望它回传数值所以勾Numerric

MACD=XAverage(Price,FastMA)-XAverage(Price,SlowMA);

MACD函式中只有可怜的一行就解了。不过这一行要注意的可也不少喔!首先你会发现等式左MACD』在此什么有用Vars宣告呢?因在此的MACD是有特殊意的,忘了这个函式名就叫做『MACD』!定回值它就是使用函式名,所以不必再使用量宣告手续脱裤子哺哺了。而且函式中不得再使用MACD其它量使用,回传动作也只一次。所以我不能把上式成了:

MACD=XAverage(Price,FastMA);

MACD=MACDXaverage(Price,SlowMA);

如此将导MACD值被次,致非期的不确定性。如果你是非得把简单变性,我建你改成如下:

Vars:MACD_Temp(0);

MACD_Temp=XAverage(Price,FastMA);

MACD_Temp=MACD_TempXaverage(Price,SlowMA);

MACD=MACD_Temp;(唯一的一次回)

或者成:

Vars:MACD_Temp(0);

MACD_Temp=XAverage(Price,FastMA);

MACD=MACD_TempXaverage(Price,SlowMA);(唯一的一次回)

住、无论的是什么,函式到指ShowMe、交易讯号等,完都需要按一下F3编译后才可以TS2000i使用。再继续看下去!

MACD函数之2

{*******************************************************************

Description:ExponentialAverage

ProvidedBy:OmegaResearch,Inc.(c)Copyright1999

********************************************************************}

先复习一下这个函式的运算;平滑系数平均数。我们必须先由天数参数求得我们称为的『平滑因子』,它是如此得到的:平滑因子(FFactor)=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;

白话文解释上头程序就是:

宣告使用两个变量TotalCount

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=0sum=0+Close[0](就是今天的收Close[0]=Close

count=1sum=Close[0]+Close[1]sum在上一行已代入Close[0]

count=2sum=(Close[0]+Close[1])+Close[2]

count=3sum=(Close[0]+Close[1]+Close[2])+Close[3]

、、、一直到count=5循环结束。

它称为循环(Loop)的原因就是因为它会让程序在此产生一个回路、一个停留。一直等待循环条件满足它才会放行让程序执行下一个部份。现在我们介绍的是单纯的向上计数的循环,它也有往下数越算越小的,也有跳着数的;这些比较特别的运用你可以翻手册找找。下一章我们开始要谈最兴奋的话题──交易系统程序语法。


第三章:交易讯号介绍

没有了这一部份,TS2000i充其量不过是一套所谓还不错的实时软件罢了。所以你花的两千多美金绝大部份是买在它拥有的交易系统开发设计能力。不然几百块美金或万把块台币你就可以买第二首选的MetaStock啦。所以你一定要用心的把开发写作技巧学起来,才对得起自己的银子。

交易系统是实现你机械化交易的能力。看看你有没有办法把自己的交易构想白纸黑字化(量化、数据化)?你在做这件事的时候你是没有办法用灰色地带表达交易过程的,所以你对自己做了坦白、交易者最忌欺骗自己的。第二、你很懒我知道,因为我也不怎么勤快!当我们建立起一套交易系统的时候绝对是非常沾沾自喜的。感觉世界就在你脚下,抱着螺丝起子大喊我是世界之王!但、等等你今天吃蔬菜了吗?不是啦!是你的系统有做过历史数据测试(Back-Testing)吗?不同的商品市场不同的时间单位?不要告诉我你有啦,没有人会用手工去做那些事。现在给你介绍世界级的交易系统泼冷水大师TS2000i!短短的几秒它就把你世界之王的你打到波斯市在街乞食的乞丐,原天堂到地是眨眼的功夫。可是、相信我它是了你好。不要用它没点头说好的系在真世界交易,不然恶梦成真。最后我你在TS2000i所提供的系效能告里的一些有用据,你的系早日得它的首肯,真正的自己成世界之王。

TS4TS2000i之间是OMEGA对交易系统设计上做了最大的改良。TS4是把交易讯号跟交易系统混合一个部份完成,方便但它被锁在程序代码长度64K的梦魇。64K就相是一间两个褟褟米大的小套房,你很快就会有窒息感的,随便放个冰箱、电视呀什么的。EasyLanguage的变量根本就是个败家子,当你想呼叫昨天的收盘价用Close[1]是不是觉得很方便呀?在许多正统的程序语言里〔〕代表的是数组(Array)的意思。也就是说TS2000i里所有的变量(内建与使用者自建Vars:)都是宣告数组的方式在进行。所以不像正统的Pascal它宣告一个实数的变量只占两个BytesTS2000i每宣告一个变量就切割一乘上你据天数为个数数组。所以以前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公司把这段程序写的有点心不在焉。所以我改写如下:

NameMACDBullishSignal

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不只)BuySellExitLongExitShort,再加买卖条件指令(如MarketLimit等后面会说)就可以包括所有我一切交易作所需。

BuySell望文生意就是我出。ExitLong是平指令,就是你手上的部位是多头时出部位对冲(或Cover);然如果你手上部位或者不是多部位,这个指令就算件被足了也不行。到部位方向我就需要再介好用的部函式『MarketPosition』它的回值是0=部位、1=多部位(Long)、跟-1=空部位(Short)。以下两个叙述的意是相同的:

IfMarketPosition=1ANDClose>Close[1]ThenSellThisBarAtClose;

IfClose>Close[1]ThenExitLongThisBarAtClose;

是不是用ExitLong比较容易了解并且精简呢,这就是ExitLongSell的使用不同点。对了!ExitShort不必我再提一次了吧?接下来我们谈接在BuyExitLong之后可以放什么?我们可以用括符代入字符串如(”MACD_Buy”)。这有什么好处呢?未来在TS2000i上执行交易策略时它会在进出场时间的那跟在线标示向上(BuyExitShort)与向下(SellExitLong)的箭头,如果你的讯号不只一组;比如像BillWilliams的『鳄鱼』交易系统,除了你知道图上长满痘痘外根本分不清那一个进场讯号是谁发的?AOAC?所以我可以加这样识别标签来方便我示功能是选项要加不加你高。到此我知道了两个东西这样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.5At720.5Stop或限价停损为At720.5StopLimit。再如果、720.5是你算出的停损点,你在是做空,商品最小跳动点1/4美分或0.25美分。所以你停损应该720.5加一720.75,那你如何

ExitShortNextBarAt720.5+1PointStop;

只要1PointTS2000i自己去找对应的商品信息,自己你加上一最小跳动点值。叫最小最小跳动点值(TickVaule),对应的叫一大值用BigPointValue表示。以小麦为Point=0.25美分,而BigPointValue=1美分。如果你想损点在突破三日最高价被突破成:

ExitShortNextBarAtHighest(High,3)+1PointStop;

大概就是这样啰,其实还有清明上河那么长还没讲。以后吧!以后慢慢,反正写这系列我就有漫的打算;在先充大家的基本技要。交易讯号写编译OK之后我就要用到策略架构功能(StrategyBuilder),准看看我的成果。选单GOTradeStationStrategyBuilderNewName填入My_SystemNote自己掰>下一步>Add>勾两个讯号MACDBullishMACDBearish,你会发现讯号增加进来LongEntryShortEntry点选,而Exit部份空没错!我是只进场讯号>下一步>!看到一堆我们设定的Inputs参数,确认无误后>下一步>Pyramiding金字塔交易,到埃及去然不是啦!是指你有有要做加的策略?有不要它直接到下一,如果有话请你的加码讯号是可以允许来自相同的讯号组吗?>下一步(真到底要走几步呀?)>第一格预设50指最大的开仓数,第二格65000定最大部位建立口或股票股。下面打勾的是进场时要不要通知TS2000i的大掌柜TrackingCneter知道,如此你可以在那里看到你的实时损益,>下一步>讯号计算的最大起始值50于按完成。又回到始的窗口,我可以发现My_System在合格可使用策略名了。

开启TS2000i在工作表上商品。按F7加入MACD(方便我们对讯号)。再一次F7Strategy部份点选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』(LotusExcelMetaStock都有)文法如下:

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两个验证专用工具,PaintBarShowMe。是的、我一开头就告诉过你,篇文章是模一步步开发的。一般我用什么手段『取得』指公式,我都必须严厉测试它的成效与特性。开启你的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逻辑变量,也就是它只存放真值(TRUEFALSE)。Condition英文做『件』的解,所以在使用上后面放上它的件判。所以我Condition1是判是否大于VIDYACondition2是判是否是在VIDYA之下。

If Condition1 OR Condition2 Then Begin

这条读成:如果条件一或条件二其中一个成立的话,我们就、、。我们在EasyLanguage会常用到两个逻辑判断,ANDOR。如果我要所有的件都真才作,我就必把每一个条件用AND接起;它代表无论你是否建立上百上千的件判,只要中有一个条件不真(TRUE都不被成立。相反的不管你是否有上千上百的件,而你用OR接它果是只要其中一个条真,个条件判成立。

Condition在使用上,我须写IFCondition1Then、、,而无须注明ConditionTRUE。如果你要使用FALSE)值算,可以用IFCondition1<>TRUEThen表示。如果你不用TRUEFALSE的保留字,那么告你外人的TRUE值是-1、FALSE1,不要写错怪我跟你。就像外人上绿色表,下跌是色,如果你还没去修正TS2000i定而且没觉得很奇怪,快去改正吧,不然你不得奇怪什么你的K线绿线带领的?

上段的程序当收盘大于或小于都会被带进来处理,例外的便是收盘等于VIDYA的日子。接下来的Value2Value3是设定你到时要画的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编译,然后我们在原来的图上再按F7PaintBar功能,点选我们的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的连环船Condition1Condition2就是在写上述规则,相信现在的你们应该都可以自己试着读出,不必我再解释。不过其中陌生的应该是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尽情的乱画搞的我们眼花。如果你不信就把Condition1Condition2的后面Value4=0的判断去掉,编译看看出来的麻子像什么。这是一个程序书写技巧,我称它为『旗标』(Flag)。就像我们写一个交通警察进去帮我们管制交通。最后一行我们开启为绿灯(设Value4=0),于是让Condition1Condition2得以执行(我们的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)。

在第一段我的目的只是要承先前的努力与研究,把PaintBarShowMe所得的心得做完整的移。所以我买进讯号会是跟ShowMe相同,而持时间会PaintBar的,你的平仓会标示在PaintBar转换间没问题编译看看成果吧!身一下、辛辣的就快上菜了。

待续


第四部份:不要再背离科学盲目交易下去了

你认为到上头的箭头出现你的工作就大功告成了?错!痛苦的事才刚刚开始呢。我们学习交易的人,摸着良心说;有几个人做过我上一章说的『白纸黑字』呢?还有、有几个人真正的逐笔逐笔的核对过讯号的进出呢?更徨论在不同的数个市场的历史价格中一笔笔的计算记录呢?这些难道不重要吗?你是怎么放心的去用你的系统交易的呀?

今天、TS2000i帮你迅速的完成上面那些不可能的任务。它帮你一笔一笔的标上进出的讯号时机,最重要的它帮你计算盈亏还有做你想象不到的策略分析与风险控管。现在我们就是要开始介绍这部份,另一个TS2000i的宝藏。保持你的TS2000i停在上面最近的一张图上头;点选ViewStrategyPerformanceReport看到像这样的一新窗口,我交易系策略效能

 这个评表是非常复与「大」的,不下于你在阅读上市公司的财报。基本上你要不俱某种程度的统计学,我保葛亮表的最后那一句『临表涕泣,不知所云』。在里我只选择性的介一些我们这统计的『』可以理解与重要的做解。先看最上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美元的利;系AGrossProfitUSD$25,000GrossLossUSD$5000。系BGrossProfitUSD$60,000GrossLossUSD$40,000。我A多一,因A生的交易变动会小,就是脏会动过日子。交易次应该B多,干嘛便宜了期公司?

OpenpositionP/L 未平仓损

如果你尚有未平的部位,会显示它目前算的盈

Total#oftrades 时间围内总共交易次

Percentprofitable 系统获胜百分比

Numberwinningtrades 利(成功)交易次

Numberlosingtrades 亏损(失)交易次

是有连带关系的。它明你的系定的时间内总进场交易几次?而这个进场数产生了几次的利交易与亏损交易次。最后利与亏损的比率何。再一次告你不要又拿利百分比不健康的看系。也你的系20%的次数获胜比,但是可能它的一次利可以抵20次的亏损,你要不要?看表就是要学会综估的要,如果一个数据就可以定那TS2000i弄出一堆据是冲着玩笑的

Largestwinningtrade 最大一的交易

Largestlosingtrade 最大一的交易亏损

列出的是我的交易系在交易程,生的一最大的利金与最大的一笔亏损里我希望利的金额远大于亏损这样代表我的系多少是健康与优秀一的。

Averagewinningtrade 平均每笔获利金

Averagelosingtrade 平均每笔亏损

AveragewinningtradeGrossProfit/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,000Maxintradaydrawdown(此例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-upDrawdown是相反的名词。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以下的金额时,你有可能『冤死』多可能利的部位。

忘了我先前Averagelosingtrade180.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了被三新的格子取代了;分StartStopInc。以我第一Length例,原值21。但我希望察它在540的表现会如何?我Start5(起始值)、Stop40止值)在Inc1(每次增量值),填完点选OK。你会发现你的Length参数从21变为5..40:1。重复上作也一起修改其它两个数据。最后我们点下面的确定,跳回到AnalysisTechniques,接着点选右上的Optimize行最佳化算,耐心等。

束后你可以在ViewStrategyOptimizationReport看到所有的果。耐心去找左边数字只有一加了星的,那便是最好表合。TS2000i这组数字置入你目前的参数中;所以你可以再一次看策略表,思考这样的改是否有正面的意。整篇的系统设计讨论也在里划下句,全篇完。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在VSCode中配置易语言的开发环境,可以按照以下步骤进行操作: 1. 安装VSCode:首先确保你已经安装了Visual Studio Code编辑器。你可以从官方网站上下载并安装:https://code.visualstudio.com/ 2. 安装EasyLanguage扩展:在VSCode中,点击左侧的扩展图标,搜索并安装EasyLanguage扩展。这个扩展将提供易语言的语法高亮、代码片段和其他功能。 3. 配置EasyLanguage编译器:在VSCode中,按下`Ctrl + Shift + P`(或者`Cmd + Shift + P`)打开命令面板,输入“Preferences: Open Workspace Settings”并选择该选项。在打开的设置窗口中,选择“Extensions”和“EasyLanguage”,在右侧的输入框中添加EasyLanguage编译器的路径。通常情况下,该路径为易语言安装目录下的`Bin`文件夹中的`ELang.exe`文件。 4. 创建或打开易语言项目:在VSCode中,点击左侧的资源管理器图标,选择一个文件夹作为你的项目目录。然后,点击左上角的“文件”菜单,选择“新建文件”或“打开文件夹”,选择你的易语言源代码文件。 5. 编写和调试代码:在VSCode中,你可以使用EasyLanguage扩展提供的语法高亮、代码片段等功能来编写易语言代码。你还可以使用VSCode的调试功能来调试你的代码。点击左侧的调试图标,然后点击顶部的“创建配置文件”按钮,选择“EasyLanguage”作为你的调试环境。在打开的`launch.json`文件中,你可以配置调试器的参数和启动命令。 这样,你就可以在VSCode中配置和使用易语言的开发环境了。希望对你有帮助!如果有任何问题,请随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_38220914

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值