|
經(jīng)常會(huì)看到很多朋友問:幫我寫個(gè)公式怎么樣啊?幫我把某個(gè)公式改成TB的怎么樣啊?
我想出現(xiàn)這種情況的原因有兩種:
一是真的不會(huì),畢竟做期貨的會(huì)編程的不多;
二是自己如果多花點(diǎn)時(shí)間的話是弄的出來,但是有點(diǎn)懶;
我想無論是哪種原因,都應(yīng)該好好的學(xué)習(xí)下TB,因?yàn)檎嬲哪愕慕灰姿悸分挥心阕约翰徘宄?/span>
而且也只有你自己去把你的交易思路用TB表現(xiàn)出來你才能更清楚的知道你的交易思維中有何缺點(diǎn)
但是編程不是一件很容易的事情,當(dāng)然,如果您入門了,你會(huì)發(fā)覺TB編程其實(shí)和泡妞一樣的簡(jiǎn)單,就看你敢不敢下手了
所以本文僅是寫給完全不懂編程的朋友的,僅是最基本的入門資料,如果您是高手,請(qǐng)忽略此文,以免耽誤您的時(shí)間.
我先不說那些專業(yè)術(shù)語,什么變量,函數(shù)和語法的,我們先不管他,以免看的頭暈. 我想先說說在TB中代碼的執(zhí)行順序,也就是說在TB的K線圖(TB把K線叫做Bar)里面你寫的公式或者指標(biāo)是如何得到執(zhí)行的; 我想這個(gè)東西是最重要而且也是最好理解的. 在其他的期貨軟件比如文華飛狐一類,我們是無法知道你寫的公式是如何執(zhí)行的,甚至我們不知道我們寫出來的公式是不是真的 就體現(xiàn)出了我們的思想,因?yàn)槟銓懙墓交蛘咧笜?biāo)是被這些軟件在幕后進(jìn)行處理的,是黑箱操作! 而TB不同,我們能夠清楚的看到你寫的代碼在任意一根K線上是如何得到執(zhí)行的!!!! 好了,先說說在TB里面代碼是如何得到執(zhí)行的.
1,代碼從第一根K線開始執(zhí)行,一直到最后一根K線;
2,在每一根K線上,代碼都是從第一行開始執(zhí)行,一直到最后一行;
明白了吧,是不是很簡(jiǎn)單,我們先看一個(gè)小例子,如果您還不明白,那只能說我完全沒有任何能力寫這文章,您就板磚吧 我們就寫個(gè)輸出每日的收盤價(jià)的例子; 打開TB,在左邊的TB公式里面,點(diǎn)擊新建技術(shù)指標(biāo),新建其他的也沒有關(guān)系,然后在出來的對(duì)話框的簡(jiǎn)稱里面填入名字,記住,這個(gè)名字只能是E文哦 在名字里面填入你喜歡的名字,點(diǎn)確定就OK了啊 然后在出來的公式編輯器里面輸入
Begin
End 注意,除了參數(shù)和變量定義外,所有的代碼都必須包含在Begin和End之間 意思很簡(jiǎn)單 就是Begin后,你的代碼就開始執(zhí)行了,End了,你的代碼就執(zhí)行完畢拉 呵呵 我們?cè)僭?span lang="EN-US" xml:lang="EN-US">Begin和End之間輸入一些代碼,完整的就是:
Begin
FileAppend("c:\\a.log",Text(Year)+"年"+Text(Month)+"月"+Text(Day)+"日的收盤價(jià)等于");
FileAppend("C:\\a.log",Text(Close));
End 我們?cè)僬f說這兩行代碼是什么意思
File就是文件,Append就是添加,現(xiàn)在明白了吧
FileAppend就是添加一個(gè)文件,文件名是什么呢?就是你后面寫的a.log,這個(gè)文件的路徑在哪里呢?就是c:\\a.log里面的C盤,且在這個(gè)文件里面添加一行東西, 這行東西的內(nèi)容就是你后面所寫的Text(Year)+"年"+Text(Month)+"月"+Text(Day)+"日的收盤價(jià)等于" 當(dāng)然,如果這個(gè)文件已經(jīng)存在,他就不會(huì)添加文件了,僅僅在這個(gè)文件的后面添加一行上面你寫的內(nèi)容 好了,再看看Text,Text的意思就是把那些不是字符串的東西如數(shù)字啊,等變成字符串.而Year,Month,Day就代表了 正在執(zhí)行你寫的代碼的那一根K線的年,月,日,年月日是數(shù)字,我們當(dāng)然要用Text把它搞成字符串,不然Windows會(huì)告訴你你犯了錯(cuò)誤的
Close的意思我不說大家也明白了吧,就是代表了當(dāng)前正在執(zhí)行你的代碼的那根K線的收盤價(jià)啊,呵呵,如果代碼執(zhí)行到最后的那根K線 且行情正在走動(dòng)的時(shí)候Close代表的就是現(xiàn)在的最新價(jià)了咯. 好了 我們點(diǎn)公式編輯器上面的工具欄的第五個(gè)按鈕(打勾的那個(gè)東西),校驗(yàn)保存公式,稍微等一下,就OK了 我們?cè)诨氐?span lang="EN-US" xml:lang="EN-US">K線圖里面,TB把K線圖叫做超級(jí)圖表,呵呵,有點(diǎn)不習(xí)慣 在K線圖里面右鍵,選擇商品設(shè)置,然后吧里面的樣本數(shù)由默認(rèn)的300改成5,意思是讓在超級(jí)圖表里面僅僅顯示5條K線,當(dāng)然,你可以搞成任意你喜歡的數(shù)字 你甚至可以從任意一個(gè)你喜歡的時(shí)間開始顯示K線,我們選擇5跟K線僅僅是為了測(cè)試的方便 點(diǎn)確定后,你就看到在K線圖里面只顯示了5跟K線,所以我們的代碼也僅僅只在這5跟K線上執(zhí)行了 當(dāng)然現(xiàn)在代碼還不能被執(zhí)行,因?yàn)槲覀儸F(xiàn)在還需要把我們剛剛所寫的那個(gè)指標(biāo)加到K線圖上面才能被執(zhí)行的
我們?cè)僭诔?jí)圖表里面右鍵,選擇插入技術(shù)分析,在出來的列表里面選擇我們剛剛所寫的技術(shù)指標(biāo),然后確定就OKl餓 暈死,現(xiàn)在怎么在K線圖上沒有任何變化啊? 呵呵 我們上面說了,我們這個(gè)例子僅僅是把每日的收盤價(jià)寫到文件里面去啊,那么我們找一找文件在什么地方咯?
FileAppend("c:\\a.log",很明顯,文件是在c盤的,文件的名字是a.log 好了,我們到c盤找到a.log文件,雙擊打開,我們就會(huì)看到下面的內(nèi)容:
2007年9月24日的收盤價(jià)等于
67280
2007年9月25日的收盤價(jià)等于
67800
2007年9月26日的收盤價(jià)等于
67160
2007年9月27日的收盤價(jià)等于
67300
2007年9月28日的收盤價(jià)等于
68020
我們現(xiàn)在來分析下: 首先你寫的代碼在第一根K線上執(zhí)行,先執(zhí)行第一行代碼:
FileAppend("c:\\a.log",Text(Year)+"年"+Text(Month)+"月"+Text(Day)+"日的收盤價(jià)等于"); 這行代碼就輸出了第一根K線的年,月,日,就在a.log文件里輸出成"2007年9月24日的收盤價(jià)等于" 然后執(zhí)行第二行代碼:
FileAppend("C:\\a.log",Text(Close)); 折行代碼把第一根K線的收盤價(jià)輸出到a.log文件里面,于是就輸出了"67280" 好了,代碼在第一根K線上執(zhí)行完畢,于是再轉(zhuǎn)到第二根K線,再執(zhí)行第一行代碼,再執(zhí)行第二行代碼
......... 好了,現(xiàn)在代碼在第二根,第三根,第四根K線上執(zhí)行完畢,于是轉(zhuǎn)到第五根也就是最后一根K線上執(zhí)行第一行代碼 再執(zhí)行第二行代碼 到此為止,所有的代碼在所有的K線上執(zhí)行完畢了,圓滿的完成了黨和祖國(guó)賦予他的神圣使命,于是也就有了我們上面所看到的結(jié)果:
2007年9月24日的收盤價(jià)等于
67280
2007年9月25日的收盤價(jià)等于
67800
2007年9月26日的收盤價(jià)等于
67160
2007年9月27日的收盤價(jià)等于
67300
2007年9月28日的收盤價(jià)等于
68020
OK,下回繼續(xù)
我一直非常愿意幫助客戶們解答在編程中的難點(diǎn),但是卻不大愿意幫助客戶寫完整的公式策略。這其中有三個(gè)原因:
1、別人寫的交易策略,你難以調(diào)整它。 據(jù)統(tǒng)計(jì),90%以上的交易策略會(huì)在2年半之內(nèi)由于種種原因失效或者效率降低。通常的做法是一個(gè)季度左右,交易員就需要微調(diào)其策略,調(diào)整參數(shù)或改動(dòng)某些條件。如果策略不是自己編寫的,調(diào)整起來就會(huì)有困難。
2、別人寫的交易策略,你很難徹底執(zhí)行它。 系統(tǒng)交易最重要的好處在于它的執(zhí)行能力。它可以使你的交易擺脫人性的弱點(diǎn),擺脫心理因素的干擾。然而這一切的基礎(chǔ),在于自信。人只會(huì)信任自己了解的東西,這是人性。如果一個(gè)交易策略是別人寫的,無論它的測(cè)試報(bào)告是多么天花亂墜,你都不會(huì)信任它,因?yàn)槟悴涣私馑?。一旦市?chǎng)出現(xiàn)了危機(jī)情況,你就會(huì)坐立不安,你就會(huì)總懷疑是不是策略有問題,然后就又把策略扔到一邊,回到憑感覺去操作的老路上去了。
3、最重要的一點(diǎn)在于:編程就是理解,編寫交易策略調(diào)試交易策略的過程其實(shí)就是理解市場(chǎng)的過程。這是一種非常寶貴的積累。大多數(shù)人都是通過在市場(chǎng)中虧錢,靠爆倉來理解市場(chǎng)的。成本高昂,而且難以總結(jié)。使用這種方法來了解市場(chǎng),往往就算你虧了很多錢,交了大把學(xué)費(fèi),你仍然不知道自己到底輸在哪里。你總結(jié)不出來,你就不可能有長(zhǎng)進(jìn),就不可能贏。而通過寫交易策略來了解市場(chǎng)你不需要交什么學(xué)費(fèi),從歷史測(cè)試報(bào)告里很容易分析出來自己到底錯(cuò)在哪里,如此你就很容易改進(jìn)。把編好的交易策略與模擬帳戶交易結(jié)合起來就可以為你帶來足夠逼真的實(shí)戰(zhàn)經(jīng)驗(yàn)。
skywalker 說的非常棒! 編程其實(shí)是一種思想,編程的目的是把你的思想用各種圖形表現(xiàn)出來而已 我們期貨編程的目的是表現(xiàn)我們的交易思想 是為思想而編程,不是為編程而編程!
說起這點(diǎn)我想起了TB的偉大! 不管你用文華還是飛狐,當(dāng)你把指標(biāo)公式寫完后 可能你自己的不是很清楚 你的代碼所表現(xiàn)出來的東西到底是不是就是你的交易思想呢? 因?yàn)樗麄兊拇a是工作在后臺(tái)的 我們?cè)谇懊鏌o法得知這些代碼如何工作 而TB完全不同 你可以在任意時(shí)候知道你的代碼在做什么! 所以你也就非常的清楚你的代碼是不是真的表現(xiàn)了你的意思!
好了 現(xiàn)在開始寫數(shù)據(jù)類型,變量和賦值. 這是些非?;镜母拍?span lang="EN-US" xml:lang="EN-US">,相信您一下就懂的
線說數(shù)據(jù)類型吧 數(shù)據(jù)類型和人的類型差不多 人不是分黃種人,白種人,黑種人么?
TB里面的數(shù)據(jù)也一樣 分字符串類型,數(shù)值型,還有布爾型
字符串類型很簡(jiǎn)單,用分號(hào)""括起來的東西就叫做字符串類型的數(shù)據(jù),如"I love
you",如"3345",..... 數(shù)值型數(shù)據(jù)類型也同樣的簡(jiǎn)單,數(shù)值大家知道吧,如1542啊,1.021啊....這些東西就是數(shù)值型的數(shù)據(jù)類型 當(dāng)然,如果把一個(gè)數(shù)值型的東西用分號(hào)""括起來了那他就不再是數(shù)值型數(shù)據(jù)了,而是字符串類型的數(shù)據(jù) 如1688是數(shù)值型數(shù)據(jù),但是"1688"就是字符串類型的數(shù)據(jù)了啊 還有就是布爾型,當(dāng)然,沒有接觸過編程的朋友可能不明白布爾型的意思 說白點(diǎn),布爾型就是真假型,意思就是布爾類型的數(shù)據(jù)只能取真(True)或假(False)值. 比如2>1,這個(gè)東西就是布爾類型的數(shù)據(jù),因?yàn)?span lang="EN-US" xml:lang="EN-US">2是大于1啊,所以這個(gè)表達(dá)式返回True(真) 那么2<1,大家說這個(gè)表達(dá)式是不是個(gè)布爾類型的數(shù)據(jù)呢? 呵呵,也是的,因?yàn)?span lang="EN-US" xml:lang="EN-US">2大于1啊,所以2<1是錯(cuò)誤的,就返回False(假)咯 大家明白了吧,就這三個(gè)類型,其中最只要的就是數(shù)值型數(shù)據(jù)類型哦 用的最多的也是數(shù)值型數(shù)據(jù)類型 如果明白了,那么請(qǐng)您就記住在TB里面數(shù)值型的E文是Numeric吧
暈死,看下TB的幫助,數(shù)據(jù)類型里面還有個(gè)序列型,如果數(shù)值序列型,字符串序列型,布爾序列型 序列這個(gè)東西看起來很難理解 想個(gè)辦法來理解他吧 比如我們的K線圖上有10跟K線,Close大家知道吧,就是收盤價(jià) 但是這個(gè)Close包含了第一根K線的收盤價(jià),也包含了第二根K線的收盤價(jià).......一直包含到第五根K線的收盤價(jià) 也就是說序列型的數(shù)據(jù)在沒根K線上都有一個(gè)值的
OK了吧?如果不OK也沒有關(guān)系,慢慢的就懂了
再說說變量 顧名思義,變量就是一個(gè)可以改變的東西 現(xiàn)在這個(gè)變量的值是100,但是等下我可以把它改成20,只要您喜歡,你可以隨心所欲的改變這個(gè)值 呵呵,能夠修改他的值的東西就叫做變量了 記住: 在TB里面變量都是要先定義的!而且有著他獨(dú)到的定義方法,而且這個(gè)定義必須放到Begin的前面 如我們定義一個(gè)數(shù)值型變量a.就應(yīng)該這樣
Vars
Numeric a;
Begin
......
End 當(dāng)然你也可以定義兩個(gè)或者多個(gè)變量,如
Vars
Numeric a;
Numeric b;
//.........更多變量定義
Begin
......
End
大家也許想到了 我定義這個(gè)變量a,我要讓他等于2,這個(gè)東西很簡(jiǎn)單 你可以在變量定義的時(shí)候就給他賦初值讓他一開始被定義就等于2,也可以在Begin下面寫.如
Vars
Numeric a(2);
Numeric b;
//.........更多變量定義
Begin
......
End 明白了么|?那么變量b呢?我們沒有用括號(hào)()擴(kuò)個(gè)東西啊,那么這個(gè)時(shí)候b這個(gè)變量等于什么呢? 很簡(jiǎn)單,如果你在定義變量的時(shí)候沒有給他初值,那么b這個(gè)時(shí)候等于0咯 好了 再看在Begin里面怎么修改這個(gè)變量的值
Vars
Numeric a(2);
Numeric b;
//.........更多變量定義
Begin
a = 3;
b = 100;
End 很簡(jiǎn)單的 現(xiàn)在大家應(yīng)該知道了變量是什么東西了吧 對(duì)了,忘記告訴大家了,在Begin下面給變量復(fù)制僅僅只對(duì)當(dāng)前正在執(zhí)行你的代碼的K線有效咯,到下一根K線他就是初始值了啊 寫個(gè)例子吧
Vars
Numeric
a(100);//定義一個(gè)變量,類型是數(shù)值類型,變量名字是a,變量的初始值是100
Begin
if(CurrentBar ==
0)//如果是第一根K線,就把變量a的值變?yōu)?span lang="EN-US" xml:lang="EN-US">1
{
a = 1;
}
FileAppend("C:\\a.Log",Text(a));
End
我們?cè)賮砜纯摧敵鼋Y(jié)果:
1
100
100
100
100 我們?cè)賮砝斫庀逻@個(gè)結(jié)果(當(dāng)然這個(gè)時(shí)候我們的K線圖上面只有5跟K線啊,其實(shí)隨便多少跟K線都一樣) 首先代碼在第一根K線上面執(zhí)行,先執(zhí)行if(CurrentBar == 0)這個(gè)東西,CurrentBar代表正在被執(zhí)行的K線的索引 因?yàn)榇a現(xiàn)在在第一根K線上執(zhí)行,所以索引就是0拉,于是這個(gè)表達(dá)式就成立了啊,既然if(CurrentBar
== 0)這個(gè)表達(dá)式 成立,那么他就會(huì)執(zhí)行{}里面的東西a =
1;把1賦給變量a,也就是說吧變量a的內(nèi)容改成1, 然后執(zhí)行FileAppend("C:\\a.Log",Text(a)); 這個(gè)時(shí)候變量a的值是1,所以當(dāng)然輸出1了啊 代碼執(zhí)行完畢 然后轉(zhuǎn)到第二根K線, 既然是第二根K線,那么這根K線的索引就是1了啊,1肯定不等于0啊 那么表達(dá)式if(CurrentBar == 0)就不成立了啊,既然不成立那么他也就不會(huì)執(zhí)行{}里面的東西a =
1; 于是就直接執(zhí)行FileAppend("C:\\a.Log",Text(a)); 那么這個(gè)時(shí)候a的值是多少呢? 很明顯是100,就是他的初始值,而不是上一根K線執(zhí)行代碼的時(shí)候改變了的a的值!這點(diǎn)千萬注意啊 我相信好多朋友會(huì)在這里犯下錯(cuò)誤的咯
再說給變量賦值 其實(shí)我們上面已經(jīng)說了,記住=和==的區(qū)別吧
=就是把=右邊的東西賦給=左邊的東西 如a =
100; 就是把=右邊的100賦給左邊的變量a 如b =
9; 就是把9賦給變量b 我們?cè)谌粘V幸恢卑?span lang="EN-US" xml:lang="EN-US">=當(dāng)成等于,千萬急著在TB里面=就是賦值!!! 真正的等于的符號(hào)是==
if(a==b)//就是如果a等于b
{
//做某件事情
}
好了 快11點(diǎn)了 睡覺了 下次見
看了,學(xué)了,收獲不少,不斷消化ING。。。 謝謝斑竹!
但是編程不是一件很容易的事情,當(dāng)然,如果您入門了,你會(huì)發(fā)覺TB編程其實(shí)和泡妞一樣的簡(jiǎn)單,就看你敢不敢下手了
如1688是數(shù)值型數(shù)據(jù),但是"1688"就是字符串類型的數(shù)據(jù)了啊
說白點(diǎn),布爾型就是真假型,意思就是布爾類型的數(shù)據(jù)只能取真(True)或假(False)值.
序列這個(gè)東西看起來很難理解 想個(gè)辦法來理解他吧 比如我們的K線圖上有10跟K線,Close大家知道吧,就是收盤價(jià) 但是這個(gè)Close包含了第一根K線的收盤價(jià),也包含了第二根K線的收盤價(jià).......一直包含到第五根K線的收盤價(jià) 也就是說序列型的數(shù)據(jù)在沒根K線上都有一個(gè)值的
在TB里面變量都是要先定義的!而且有著他獨(dú)到的定義方法,而且這個(gè)定義必須放到Begin的前面
那么變量b呢?我們沒有用括號(hào)()擴(kuò)個(gè)東西啊,那么這個(gè)時(shí)候b這個(gè)變量等于什么呢? 很簡(jiǎn)單,如果你在定義變量的時(shí)候沒有給他初值,那么b這個(gè)時(shí)候等于0咯 好了 再看在Begin里面怎么修改這個(gè)變量的值
Vars
Numeric a(2);
Numeric b;
//.........更多變量定義
Begin
a = 3;
b = 100;
End
現(xiàn)在大家應(yīng)該知道了變量是什么東西了吧 對(duì)了,忘記告訴大家了,在Begin下面給變量復(fù)制僅僅只對(duì)當(dāng)前正在執(zhí)行你的代碼的K線有效咯,到下一根K線他就是初始值了啊 寫個(gè)例子吧
Vars
Numeric
a(100);//定義一個(gè)變量,類型是數(shù)值類型,變量名字是a,變量的初始值是100
Begin
if(CurrentBar ==
0)//如果是第一根K線,就把變量a的值變?yōu)?span lang="EN-US" xml:lang="EN-US">1
{
a = 1;
}
FileAppend("C:\\a.Log",Text(a));
End
我們?cè)賮砜纯摧敵鼋Y(jié)果:
1
100
100
100
100 我們?cè)賮砝斫庀逻@個(gè)結(jié)果(當(dāng)然這個(gè)時(shí)候我們的K線圖上面只有5跟K線啊,其實(shí)隨便多少跟K線都一樣) 首先代碼在第一根K線上面執(zhí)行,先執(zhí)行if(CurrentBar == 0)這個(gè)東西,CurrentBar代表正在被執(zhí)行的K線的索引 因?yàn)榇a現(xiàn)在在第一根K線上執(zhí)行,所以索引就是0拉,于是這個(gè)表達(dá)式就成立了啊, 既然if(CurrentBar == 0)這個(gè)表達(dá)式成立,那么他就會(huì)執(zhí)行{}里面的東西a = 1;把1賦給變量a,也就是說吧變量a的內(nèi)容改成1, 然后執(zhí)行FileAppend("C:\\a.Log",Text(a)); 這個(gè)時(shí)候變量a的值是1,所以當(dāng)然輸出1了啊 代碼執(zhí)行完畢
然后轉(zhuǎn)到第二根K線, 既然是第二根K線,那么這根K線的索引就是1了啊,1肯定不等于0啊 那么表達(dá)式if(CurrentBar == 0)就不成立了啊,既然不成立那么他也就不會(huì)執(zhí)行{}里面的東西a =
1; 于是就直接執(zhí)行FileAppend("C:\\a.Log",Text(a)); 那么這個(gè)時(shí)候a的值是多少呢? 很明顯是100,就是他的初始值,而不是上一根K線執(zhí)行代碼的時(shí)候改變了的a的值!這點(diǎn)千萬注意啊 我相信好多朋友會(huì)在這里犯下錯(cuò)誤的咯
再說給變量賦值 其實(shí)我們上面已經(jīng)說了,記住=和==的區(qū)別吧
=就是把=右邊的東西賦給=左邊的東西 如a = 100; 就是把=右邊的100賦給左邊的變量a 如b =
9; 就是把9賦給變量b 我們?cè)谌粘V幸恢卑?span lang="EN-US" xml:lang="EN-US">=當(dāng)成等于,千萬急著在TB里面=就是賦值!!! 真正的等于的符號(hào)是== if(a==b)//就是如果a等于b
{
//做某件事情
}
現(xiàn)在我們說說TB中的流程控制 流程控制就是控制代碼執(zhí)行的流程 還說的明白點(diǎn)就是如果滿足什么陽的條件就做什么事情 或者不滿足什么條件的時(shí)候做什么事情 簡(jiǎn)單說流程控制就是控制語句控制代碼
控制語句中分為邏輯控制語句(就是條件控制語句)和循環(huán)控制語句 條件控制語句中大家記住If這個(gè)關(guān)鍵字,翻譯成中文就是如果 循環(huán)控制語句中大家記住For,就是開始循環(huán)了
先說If. 假設(shè)一個(gè)這樣的條件: 如果(收盤價(jià)>開盤價(jià))
則輸出:今日收紅陽線 我們先把這個(gè)東西翻譯成TB 如果翻譯成If 收盤價(jià)和開盤價(jià)大家都知道會(huì)翻譯成Close和Open 輸出語句就是FileAppend,則翻譯成TB就是:
If(Close>Open)
{
FileAppend("c:\\a.log","今日收紅陽線");
} 是不是很簡(jiǎn)單呢? 大家記住一點(diǎn),凡是if(如果)語句中的代碼,都給我用{}括起來 我們?cè)侔焉厦娴臈l件加上一點(diǎn): 如果(收盤價(jià)>開盤價(jià))
則輸出:今日收紅陽線 否則如果(收盤價(jià)==開盤價(jià))
則輸出:今日收十字線 我們?cè)俜g成TB,把否則翻譯成Else,如果翻譯成If
If(Close>Open)
{
FileAppend("c:\\a.log","今日收紅陽線");
}
Else If(Close==Open)
{
FileAppend("C:\\a.log","今日收十字線");
} 同樣的簡(jiǎn)單,我們可以再把上面的條件再加: 如果(收盤價(jià)>開盤價(jià))
則輸出:今日收紅陽線 否則如果(收盤價(jià)==開盤價(jià))
則輸出:今日收十字線 否則 則輸出:今日收綠陰線
上面的否則大家知道翻譯成Else吧,有兩種翻譯方法,因?yàn)槭毡P價(jià)和開盤價(jià)的比較只存在著三種情況: 收盤價(jià)大于開盤價(jià),收盤價(jià)等于開盤價(jià),收盤價(jià)少于開盤價(jià),我們先這樣翻譯:
If(Close>Open)
{
FileAppend("c:\\a.log","今日收紅陽線");
}
Else If(Close==Open)
{
FileAppend("C:\\a.log","今日收十字線");
}
Else If(Close
{
FileAppend("c:\\a.log","今日收綠陰線");
} 上面的這個(gè)語句是很好理解的 但是大家想到了嗎?開盤價(jià)和收盤價(jià)的比較,如果不滿足Close>Open,也不滿足Close==Open 那么肯定的一點(diǎn)就是:Close所以上面的語句可以寫成:
If(Close>Open)
{
FileAppend("c:\\a.log","今日收紅陽線");
}
Else If(Close==Open)
{
FileAppend("C:\\a.log","今日收十字線");
}
Else
{
FileAppend("c:\\a.log","今日收綠陰線");
}
再說For循環(huán)語句. 先記下For語句的語法格式:
For 循環(huán)變量 = 初始值 To 結(jié)束值
{
TradeBlazer公式語句;
} 也就是(假如變量i已經(jīng)定義,且循環(huán)5次)
For i = 0 To 4
{
TradeBlazer公式語句;
}
for語句的理解稍微復(fù)雜點(diǎn),但是大家不要怕,同樣的很簡(jiǎn)單的,我們先看看For語句是如何執(zhí)行的: 比如上面的例子 首先執(zhí)行i=0,就是給變量i賦值讓i等于0,然后判斷i是不是少于等于4,這里i等于0,所以小于4,于是執(zhí)行{}里面的TradeBlazer公式語句; 執(zhí)行{}里面的TradeBlazer公式語句后,TB系統(tǒng)會(huì)自動(dòng)給變量i加1,這個(gè)時(shí)候i就等于1了(上面剛剛開始的時(shí)候i等于0,加了1就是等于1了) 再判斷i是不是少于等于To后面的4,1當(dāng)然少于4,于是再執(zhí)行{}里面的TradeBlazer公式語句; 執(zhí)行完{}里面的TradeBlazer公式語句后,Tb系統(tǒng)又自動(dòng)給變量i加1,上面i已經(jīng)等于1了,加1,于是這個(gè)時(shí)候i等于2了, 于是再判斷變量i的值2是不是少于To后面的4,當(dāng)然少于拉,于是再執(zhí)行{}里面的TradeBlazer公式語句;
.... 以此執(zhí)行,當(dāng)i等于5的時(shí)候,再與To后面的4進(jìn)行比較,當(dāng)然5>4了,所以不滿足條件了,于是不再執(zhí)行{}里面的TradeBlazer公式語句; 而開始執(zhí)行{}下面的語句拉 明白了么? 應(yīng)該很清楚了 大家再研究下下面的HHV的寫法,就會(huì)很明白了的:
//------------------------------------------------------------------------
// 簡(jiǎn)稱: HHV
// 名稱: 求N周期的最高值
// 類別: 用戶函數(shù)
// 類型: 用戶函數(shù)
// 輸出: 數(shù)值型
//------------------------------------------------------------------------
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);
}
Return highestValue;
End
//------------------------------------------------------------------------
// 編譯版本
GS2004.06.12
// 用戶版本
2007/09/24 08:29
// 版權(quán)所有
pwqzc
// 更改聲明
TradeBlazer
Software保留對(duì)TradeBlazer平臺(tái)
//
每一版本的TrabeBlazer公式修改和重寫的權(quán)利
//------------------------------------------------------------------------
現(xiàn)在說說參數(shù)與函數(shù),說完了這個(gè)東西,就要進(jìn)入實(shí)踐階段了咯,就要準(zhǔn)備開始實(shí)打?qū)嵉莫?dú)立編寫指標(biāo)了 首先我們必須明白,參數(shù)僅僅存在于函數(shù)里面,如果函數(shù)里面存在著參數(shù),那么當(dāng)你調(diào)用這個(gè)函數(shù)的時(shí)候必須要先傳遞參數(shù)給這個(gè)函數(shù)
看起來似乎有點(diǎn)深?yuàn)W和晦澀,那么我們先來明白函數(shù)是什么就很容易明了 函數(shù)就是幫助我們完成某一件事情,并且完成這件事情以后會(huì)返回個(gè)東西給我們的一個(gè)方法. 比如一個(gè)這樣的函數(shù) 請(qǐng)注意,這僅僅是個(gè)假想的函數(shù),僅為了幫助理解函數(shù)是什么):
GetCloseFromTrader 我們就很明白,這個(gè)函數(shù)就是幫助我們到交易所跑一趟,然后把收盤價(jià)返回給我們; 有點(diǎn)明白了吧,但是仔細(xì)一想,這個(gè)東西似乎有點(diǎn)問題,比如返回收盤價(jià),暈死,交易所 那么多的品種,且每個(gè)品種都有那么多的月份,他到底返回的是什么東西的收盤價(jià)啊? 呵呵,那么我們這樣寫:
GetCloseFromTrader(Cu0801) 現(xiàn)在應(yīng)該完全明白了,這個(gè)函數(shù)就是從交易所返回某個(gè)品種的收盤價(jià),到底是什么品種什么月份的收盤價(jià)呢?
Cu0801就是拉. 其實(shí),這里面的Cu0801就是這個(gè)函數(shù)所需要的參數(shù)! 我們于是就可以這樣理解:函數(shù)是幫助用戶完成某一件事情且返回用戶所需要的數(shù)據(jù)的方法; 那么參數(shù)呢?參數(shù)就是參到函數(shù)里面去的數(shù),也就是說必須要傳遞給函數(shù)的數(shù); 我們現(xiàn)在不要求一定能夠自己寫函數(shù),但是必須要懂得的是要看懂這個(gè)函數(shù)是做什么用的,且知道如何去調(diào)用這個(gè)函數(shù)!
我們先看看下面的這個(gè)函數(shù),這個(gè)函數(shù)的名字叫:HHV,是根據(jù)輪回老大的建議改寫的,我們必須要讀懂這個(gè)函數(shù),且知道怎么樣去 調(diào)用這個(gè)函數(shù),如果真懂了,這課就圓滿的完成了!
[Copy to clipboard] [
- ]
CODE:
//------------------------------------------------------------------------
// 簡(jiǎn)稱: HHV
// 名稱: 求N周期的最高值
// 類別: 用戶函數(shù)
// 類型: 用戶函數(shù)
// 輸出: 數(shù)值型
//------------------------------------------------------------------------
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
// 版權(quán)所有
pwqzc
// 更改聲明
TradeBlazer
Software保留對(duì)TradeBlazer平臺(tái)
//
每一版本的TrabeBlazer公式修改和重寫的權(quán)利
//------------------------------------------------------------------------
我們一行一行的讀,一行一行的理解; 首先我們都知道,//后面的代表是注釋,什么是注釋?我狂暈!
通過注釋我們可以粗略的明白這個(gè)函數(shù)是干什么的?代表了什么意思: 這個(gè)函數(shù)的名字HHV,他的作用是求N周期的最高值,并且會(huì)把這個(gè)最高值返回給調(diào)用這個(gè)函數(shù)的用戶 通過此,我們就能夠想到,這個(gè)N是個(gè)參數(shù),比如5個(gè)周期或者10個(gè)周期或者其他周期的最高值, 再仔細(xì)一想,是什么價(jià)格的最高值啊?是收盤價(jià)的最高值還是開盤價(jià)的最高值?或者是最高價(jià)的最高值呢? 于是我們也就想到了這個(gè)函數(shù)的另外個(gè)參數(shù):價(jià)格,比如5個(gè)周期的收盤價(jià)的最高值,或者10個(gè)周期的最高價(jià)的最高值 緊接著,這個(gè)函數(shù)開始定義參數(shù)了,
Params后面定義的就是參數(shù),一個(gè)代表要得到什么價(jià)格的最高值,一個(gè)代表要得到什么周期的最高值; 參數(shù)定義完了,這個(gè)函數(shù)就開始定義變量,對(duì)于函數(shù),我們首先定義一個(gè)變量highestValue,我們這個(gè)函數(shù)必須要把這個(gè)變量返回給用戶的 這個(gè)變量highestValue就代表了你想得到的最高值!其他的兩個(gè)變量我們先不要理睬,緊接著就是Begin了,前面我們說過,Begin后面,我們的代碼就要開始工作拉 我們先想一想,假設(shè)我們求5天的收盤價(jià)的最高值,在第一根K線上,我們希望得到的收盤價(jià)的最高值就是這天的收盤價(jià); 到第二根K線的時(shí)候我們希望得到的收盤價(jià)的最高值是這兩天的收盤價(jià)中價(jià)格最高的那個(gè),第三根就是得到這三根K線里面收盤價(jià)最大的那個(gè)收盤價(jià), 第四天同樣如此,第五天同樣如此,第六天開始就取前面5天的收盤價(jià)的最高價(jià),第七天......第N天同樣如此了; 這個(gè)時(shí)候我們就應(yīng)該想到,如果當(dāng)前K線的索引小于你需要的周期數(shù)的時(shí)候就取當(dāng)前K線的前面幾個(gè)周期的最高值 于是代碼開始寫:
minDay = Min(CurrentBar,Length-1); 這個(gè)大家都很明白吧,如果當(dāng)前K線索引假設(shè)是3,而你要得到的是5個(gè)周期的最高值,因?yàn)闀簳r(shí)還沒有5個(gè)周期,我們我們就取這3個(gè)周期來獲得這三個(gè)周期的最高值 為什么要-1呢?因?yàn)?span lang="EN-US" xml:lang="EN-US">K線的索引是從0開始計(jì)算的,那么前面的minDay呢?就是個(gè)變量,我們用這個(gè)變量來代表周期,于是我們?cè)俚蕉x變量的地方去定義這個(gè)變量:
Numeric minDay;
再看代碼:
[Copy to clipboard] [
- ]
CODE:
for i=0 to minDay
{
highestValue=Max(highestValue,Price[i]);
}
很明顯,這是一個(gè)前面我們所說的For循環(huán),在For循環(huán)里面我們必須要先定義一個(gè)變量i(可以是其他名字),代表從什么基數(shù)開始循環(huán); 于是再到定義變量的地方去定義這個(gè)i變量:
Vars
Numeric highestValue(0);
Numeric minDay;
Numeric
i; 再看這個(gè)For循環(huán), 當(dāng)i是0的時(shí)候,看這個(gè)時(shí)候0是不是小于等于最小周期minDay,如果條件成立,就執(zhí)行:
[Copy to clipboard] [
- ]
CODE:
highestValue=Max(highestValue,Price[i]);
Price[0]代表今天的價(jià)格,先比較今天的價(jià)格和最高值,取最大的那個(gè)保存;再把i+1 于是這個(gè)時(shí)候i為1了,再比較是不是小于等于最小周期minDay,如果條件成立,再執(zhí)行:
[Copy to clipboard] [
- ]
CODE:
highestValue=Max(highestValue,Price[i]);
這個(gè)時(shí)候Price[1]就代表了昨天的價(jià)格,把昨天的價(jià)格和保存的最高值比較,取他們的最高的那個(gè)再次保存; 依次循環(huán),我們是不是就得到了某個(gè)周期某個(gè)價(jià)格的最高值了呢? 呵呵 最后面,我們用代碼:
Return highestValue; 把這個(gè)得到的最高值返回給用戶,Return就是返回拉.
明白了嗎? 調(diào)用這個(gè)函數(shù)的時(shí)候就更簡(jiǎn)單了,比如求10個(gè)周期的收盤價(jià)的最高值:
HHV(Close,10); 求20個(gè)周期的最高價(jià)的最高值:
HHV(High,20); 呵呵 大家在看看和分析這個(gè)文章里面的函數(shù)就會(huì)完全明白了的
http://www./forum/thread-520-1-1.html
我們現(xiàn)在來寫一個(gè)飛狐的DMA函數(shù) 原文出自這里:
QUOTE:
請(qǐng)編飛狐DMA函數(shù).
函數(shù): DMA(X,N)
別名: 動(dòng)態(tài)移動(dòng)平均
參數(shù): X為數(shù)組,N為計(jì)算周期
返回: 返回?cái)?shù)組 說明:
求X的動(dòng)態(tài)移動(dòng)平均。 算法: 若Y=DMA(X,N) 則 Y=N*X+(1-N)*Y',其中Y'表示上一周期Y值,A必須小于1。 示例: DMA(CLOSE,(HIGH-LOW)/CLOSE) 表示求以該周期震幅為平滑因子的平均價(jià)
他上面的描述有點(diǎn)錯(cuò)誤,應(yīng)該是N必須小于1; 且N不是計(jì)算周期,我們還是看看文華的關(guān)于DMA的描述吧,這樣清楚點(diǎn):
[attach]396[/attach]
很簡(jiǎn)單,我們可以看出,如果要寫這個(gè)用戶函數(shù),則我們必須要先定義兩個(gè)參數(shù), 一個(gè)是上面的X,代表價(jià)格,我們用Price來表示,一個(gè)是N,代表動(dòng)態(tài)因子,我們用Length來表示 當(dāng)然,您可以用任意你喜歡的名字來表示; 好的,開始吧! 我們先新建一個(gè)用戶函數(shù),簡(jiǎn)稱寫DMA,名稱寫:求動(dòng)態(tài)移動(dòng)平均,分類選用戶函數(shù),模板任意(我選bool),然后確定; 出來如下東西:
Params
Numeric Num(10);
Vars
Bool Con1;
Begin
Con1 = Close > Num;
Return Con1;
End 我們把那些沒用的東西刪除,僅留下下面的內(nèi)容
Params
Vars
Begin
End 在定義參數(shù)的時(shí)候我們首先考慮下參數(shù)的數(shù)據(jù)類型 我們先看價(jià)格參數(shù),很明顯我們應(yīng)該把它定義為數(shù)值序列型,因?yàn)?span lang="EN-US" xml:lang="EN-US">Close啊,Open...啊,都是數(shù)值序列型的 對(duì)于動(dòng)態(tài)因子,同樣簡(jiǎn)單,應(yīng)該是數(shù)值型,于是,我們?cè)?span lang="EN-US" xml:lang="EN-US">Params關(guān)鍵字后面寫定義參數(shù)的代碼,如下:
Params
NumericSeries
Price(100);
Numeric Length(0.5);
Vars
Begin
End 我們首先應(yīng)該明白,我們寫函數(shù)的目的是要他幫我們做點(diǎn)事情并且返回個(gè)什么東西給我們,所以我們 再定義一個(gè)變量ReturnValue,代表這個(gè)函數(shù)要返回的數(shù)據(jù),到時(shí)候當(dāng)這個(gè)函數(shù)執(zhí)行完的時(shí)候我們就把這個(gè)東西返回給調(diào)用者 于是我們?cè)僭?span lang="EN-US" xml:lang="EN-US">Vars后面定義一個(gè)變量ReturnVlaue,數(shù)據(jù)類型是數(shù)值序列型,因?yàn)槊扛?span lang="EN-US" xml:lang="EN-US">K線上都有的,所以定義成序列型,代碼如下:
Params
NumericSeries
Price(100);
Numeric Length(0.5);
Vars
NumericSeries
ReturnValue(0);
Begin
End 好拉,現(xiàn)在我們開始寫這個(gè)函數(shù)的工作代碼了; 看看這個(gè)函數(shù)的意思,我們就很明白,今日的動(dòng)態(tài)移動(dòng)平均=昨日的動(dòng)態(tài)移動(dòng)平均*(1-動(dòng)態(tài)因子)+今日的價(jià)格*動(dòng)態(tài)因子;然后再把這個(gè)值Return返回就Ok了; 于是我們?cè)?span lang="EN-US" xml:lang="EN-US">Begin后面寫代碼:
Params
NumericSeries
Price(100);
Numeric Length(0.5);
Vars
NumericSeries
ReturnValue(0);
Begin
ReturnValue =
ReturnValue[1]*(1-Length)+Price*Length;
Return ReturnValue;
End
好了,這個(gè)函數(shù)就寫好了啊,是不是very
very 簡(jiǎn)單啊? 呵呵 但是細(xì)心的朋友可能會(huì)發(fā)現(xiàn),這個(gè)函數(shù)還有點(diǎn)小問題,就是如果是第一根K線,那么這根K線的昨日的動(dòng)態(tài)移動(dòng)平均沒有啊? 這樣做是不是會(huì)出錯(cuò)啊? 對(duì),非常對(duì),會(huì)出錯(cuò)的啊,所以我們要先判斷一下這根K線是不是第一根K線,用什么來判斷是不是第一根K線呢?請(qǐng)看這個(gè)函數(shù):
Integer BarStatus() 當(dāng)前公式應(yīng)用商品當(dāng)前Bar的狀態(tài)值,返回值0表示為第一個(gè)Bar,返回值為1表示為中間的普通Bar,返回值為2表示最后一個(gè)Bar。 呵呵,就用BarStatus這個(gè)函數(shù),如果他返回0,就代表第一根K線啊 于是我們?cè)俑膶懲晟粕厦娴拇a為:
//------------------------------------------------------------------------
// 簡(jiǎn)稱: DMA
// 名稱: 求動(dòng)態(tài)移動(dòng)平均
// 類別: 用戶函數(shù)
// 類型: 用戶函數(shù)
// 輸出: 數(shù)值型
//------------------------------------------------------------------------
Params
NumericSeries Price(100);
Numeric Length(0.5);
Vars
NumericSeries ReturnValue(0);
Begin
If(BarStatus==0)
{
ReturnValue = Price;//如果是第一根K線就直接把Price賦值
}
Else
{
ReturnValue =
ReturnValue[1]*(1-Length)+Price*Length;
}
Return ReturnValue;
End
//------------------------------------------------------------------------
// 編譯版本
GS2004.06.12
// 用戶版本
2007/11/03 11:57
// 版權(quán)所有
pwqzc
// 更改聲明
TradeBlazer
Software保留對(duì)TradeBlazer平臺(tái)
//
每一版本的TrabeBlazer公式修改和重寫的權(quán)利
//------------------------------------------------------------------------
在編譯這個(gè)用戶函數(shù)的時(shí)候我碰到了一個(gè)小麻煩,大家都知道,我在上面新建這個(gè)函數(shù)的時(shí)候模板選擇的是布爾型 所以我編譯的時(shí)候老是提示: C0122 Return語句的返回值類型與公式定義的返回值類型不符 非常郁悶,后面我在公式編輯器里面的文件----屬性設(shè)置-----返回類型里面改成數(shù)值型確定后,再編譯通過, 不知道這是不是TB的一個(gè)小Bug,難道模板決定一切?這是個(gè)很郁悶的問題啊
寫這么久了,下次我們就整一個(gè)交易模型出來啊
這段時(shí)間,寒舍裝修了一下,還有這段時(shí)間朋友的電腦出問題特別多,加之其他一些莫名其妙的問題, 讓本文更新的速度極慢,連自己都感覺到很過意不去了,讓我嚴(yán)肅的對(duì)大家說一聲,用洋玩意兒來說一聲:Sorry
這篇文章我將寫一個(gè)簡(jiǎn)單的交易模型,說起交易模型,大家都會(huì)想到在K線上的那些信號(hào)箭頭,但是對(duì)于TB,我似乎不喜歡這樣做. 基于以下兩點(diǎn): 一是如果把K線比喻成多姿多彩的美女,那么這個(gè)信號(hào)箭頭應(yīng)該是這個(gè)美女頭上的一朵花,但是TB的那些箭頭我怎么看都不舒服,就好比妓女的叫床:哦啊快點(diǎn),啊哦快點(diǎn),讓人興奮但又無可奈何,惡心極了; 二是TB支持全自動(dòng)下單,我對(duì)TB的這個(gè)方面還沒有任何研究,且暫時(shí)現(xiàn)在也沒有進(jìn)行全自動(dòng)交易的打算,沒有調(diào)查就沒有發(fā)言權(quán)啊,呵呵
俺不是學(xué)文學(xué)的,俺現(xiàn)在能夠找到的唯一能夠證明俺有那么一把刷子的東西就僅存一個(gè)初中畢業(yè)證了,不好,俺要回家看看才好,不會(huì)被俺小崽拿去折四角板玩吧?如果真是那樣,我可要狠狠的批評(píng)且嚴(yán)肅的警告他:現(xiàn)在你把老子的畢業(yè)證折四角板玩,等你小學(xué)畢業(yè)了,老子要把你的畢業(yè)證拿來卷煙抽!
言歸正題,我比較喜歡而且非常喜歡把交易模型做成變色的K線,紅色代表買,綠色代表賣,非常的簡(jiǎn)單明了,但是一看就又很能明白是什么意思,K線本來就是一位大大的美女,如果把紅色的K線練成一塊,把綠色的K線練成一塊,那是多少爽的一件事情啊!!!
于是我們就要先學(xué)會(huì)畫K線,在文華中畫K線是STICKLINE,在TB中很簡(jiǎn)單,就用PlotNumeric吧. 如果你要畫紅色K線,那么就先輸出High,Low,Close,Open,很好理解吧,大家都知道陽線從上到下是最高,收盤,開盤,最低,我們這個(gè)也一樣,只是先輸出最高最低,再輸出收盤開盤;如果是要畫綠色K線,那么就按照以下順序輸出那四個(gè)價(jià)格:最高,最低,開盤,收盤,呵呵 下面是畫紅色K線的代碼:
PlotNumeric("High",High);
PlotNumeric("Low",Low);
PlotNumeric("Close",Max(Close,Open));
PlotNumeric("Open",Min(Close,Open)); 大家看到了上面有個(gè)Max和Min函數(shù),大家可以想一想為什么咯,呵呵 下面是畫綠色K線的代碼:
PlotNumeric("High",High);
PlotNumeric("Low",Low);
PlotNumeric("Open",Max(Close,Open));
PlotNumeric("Close",Min(Close,Open)); 終于看到有朋友UP了,是多么的感動(dòng)啊! 那么就讓我先來解釋下上面的為什么要用Max和Min函數(shù)吧,還是說明白一點(diǎn)好. 如果我們要把所有K線畫成紅色K線,那么是要先輸出High,和Low,再輸出收盤價(jià)和開盤價(jià).但是如果當(dāng)天Close怎么辦?于是就用Max了咯,當(dāng)然,畫綠色K線的Min原理也一樣. 明白了吧 那么我們先來把前面的150根K線全部畫成紅色,后面的150根K線全部畫成綠色(呵呵,我是假設(shè)超級(jí)圖表中存在300根K線啊) 在右邊的TB公式里面新建個(gè)技術(shù)指標(biāo),名稱為MyKLine,簡(jiǎn)稱隨意,俺寫成哈哈,類型隨意選,模板空,確定,寫下如下代碼:
[Copy to clipboard] [
- ]
CODE:
//------------------------------------------------------------------------
// 簡(jiǎn)稱: MyKLine
// 名稱: 哈哈
// 類別: 技術(shù)指標(biāo)
// 類型: 其它類
// 輸出:
//------------------------------------------------------------------------
Begin
if(CurrentBar>150)
{
//如果是第151根K線畫綠色
PlotNumeric("High",High);
PlotNumeric("Low",Low);
PlotNumeric("Open",Max(Close,Open));
PlotNumeric("Close",Min(Close,Open));
}
Else
{
//如果是151根K線以前的Kurtosis線畫紅色
PlotNumeric("High",High);
PlotNumeric("Low",Low);
PlotNumeric("Close",Max(Close,Open));
PlotNumeric("Open",Min(Close,Open));
}
End
//------------------------------------------------------------------------
// 編譯版本
GS2004.06.12
// 用戶版本
2007/11/14 13:51
// 版權(quán)所有
pwqzc
// 更改聲明
TradeBlazer
Software保留對(duì)TradeBlazer平臺(tái)
//
每一版本的TrabeBlazer公式修改和重寫的權(quán)利
//------------------------------------------------------------------------
然后在文件---屬性設(shè)置----默認(rèn)-----默認(rèn)顯示改成主圖顯示,點(diǎn)編譯按鈕完成編譯,然后再在超級(jí)圖表里面調(diào)用這個(gè)技術(shù)指標(biāo), 娃哈哈,效果出來了咯!! 很爽對(duì)不?呵呵,但是如果你是個(gè)完美主義者,肯定你會(huì)發(fā)覺這中間稍有缺陷?在哪里?就是當(dāng)K線是十字星的時(shí)候K線會(huì)是白色的拉. 怎么辦?我們首先要明白為什么會(huì)出現(xiàn)這樣的現(xiàn)象的原因是收盤價(jià)=開盤價(jià)的時(shí)候會(huì)出現(xiàn)這樣的問題.那么如何去解決這個(gè)問題呢? 有兩種方法:第一種是強(qiáng)烈要求TB修改系統(tǒng)的底層去實(shí)現(xiàn),怕怕. 還有就是自己向辦法實(shí)現(xiàn),nopain老大提供了個(gè)思路,very very good!真的是長(zhǎng)江后浪推前浪,前浪死在沙灘上啊,俺們老了,還是nopain這樣的年輕人腦子反應(yīng)快咯~~~ 下面是按照nopain老大的思路實(shí)現(xiàn)的代碼:
[Copy to clipboard] [
- ]
CODE:
//------------------------------------------------------------------------
// 簡(jiǎn)稱: MyKLine
// 名稱: 哈哈
// 類別: 技術(shù)指標(biāo)
// 類型: 其它類
// 輸出:
//------------------------------------------------------------------------
Vars
Numeric
OpenIsClose;//當(dāng)開盤等于收盤價(jià)的時(shí)候
Begin
if(CurrentBar>150)
{
//如果是第151根K線畫綠色
PlotNumeric("High",High);
PlotNumeric("Low",Low);
if(Open==Close)
{
//如果收盤價(jià)等于開盤價(jià)
OpenIsClose = Close-PriceScale*MinMove;
PlotNumeric("Open",Open);
PlotNumeric("Close",OpenIsClose);
}
Else
{
PlotNumeric("Open",Max(Close,Open));
PlotNumeric("Close",Min(Close,Open));
}
}
Else
{
//如果是151根K線以前的Kurtosis線畫紅色
PlotNumeric("High",High);
PlotNumeric("Low",Low);
if(Open==Close)
{
OpenIsClose = Close+PriceScale*MinMove;
PlotNumeric("Close",OpenIsClose);
PlotNumeric("Open",Open);
}
Else
{
PlotNumeric("Close",Max(Close,Open));
PlotNumeric("Open",Min(Close,Open));
}
}
End
//------------------------------------------------------------------------
// 編譯版本
GS2004.06.12
// 用戶版本
2007/11/14 13:51
// 版權(quán)所有
pwqzc
// 更改聲明
TradeBlazer
Software保留對(duì)TradeBlazer平臺(tái)
//
每一版本的TrabeBlazer公式修改和重寫的權(quán)利
//------------------------------------------------------------------------
上面有兩個(gè)函數(shù)PriceScale和MinMove,他們相乘的結(jié)果得到當(dāng)前品種的最小變動(dòng)價(jià)位,比如銅是10,膠是5......(這兩個(gè)函數(shù)的具體意義以及他們的乘積為什么會(huì)得到這個(gè)結(jié)果請(qǐng)看TB的函數(shù)幫助) 也就是說當(dāng)開盤==收盤的時(shí)候在收盤價(jià)的基礎(chǔ)上上下浮動(dòng)一個(gè)變動(dòng)價(jià)位來畫K線,呵呵大家看下效果,是不是很完美的解決了這個(gè)問題呢?
本想晚上繼續(xù),但是晚上約了個(gè)客戶,完后又上同事家弄電腦,我完全被郁悶死了,那個(gè)討嫌的沒有半點(diǎn)良心的雨過天晴電腦保護(hù)系統(tǒng)可把我害死了!記得我買那個(gè)硬盤的時(shí)候硬盤廠家送了個(gè)雨過天晴保護(hù)系統(tǒng),明明說可以使用一年,但是3個(gè)月后就提示到期了無法使用了,于是只好卸載雨過天晴,在卸載過程中我選擇了回復(fù)電腦到最開始的狀態(tài),當(dāng)重新啟動(dòng)后,我的大腦一片空白!!!!!!天啊,所有的數(shù)據(jù)沒有了!!!!!!花了幾個(gè)小時(shí)才把數(shù)據(jù)找回,到半夜12點(diǎn)才完全弄好,本來俺的睡眠就非常差勁,于是......
不說了,我們有了上面的畫變色K線的基礎(chǔ),現(xiàn)在來做個(gè)簡(jiǎn)單的變色K線系統(tǒng)吧,是非常非常簡(jiǎn)單的; 曾聽說有人用兩條均線打天下,我們就做這個(gè)打天下的變色K線交易模型; 假設(shè)兩條均線是5日均線和10日均線,于是就有兩個(gè)變量,MaFive和MaTen,5日上穿10日買,5日下穿10日賣; 寫成代碼如下:
[Copy to clipboard] [
- ]
CODE:
//------------------------------------------------------------------------
// 簡(jiǎn)稱: MyKLine
// 名稱: 哈哈
// 類別: 技術(shù)指標(biāo)
// 類型: 其它類
// 輸出:
//------------------------------------------------------------------------
Vars
Numeric
OpenIsClose;//當(dāng)開盤等于收盤價(jià)的時(shí)候
NumericSeries
MaFive;//5日均線
NumericSeries
MaTen;//10日均線
Begin
MaFive =
SAverage(Close,5);//5天移動(dòng)平均
MaTen =
SAverage(Close,10);//10天移動(dòng)平均
if(MaFive
{
//如果是第151根K線畫綠色
PlotNumeric("High",High);
PlotNumeric("Low",Low);
if(Open==Close)
{
//如果收盤價(jià)等于開盤價(jià)
OpenIsClose = Close-PriceScale*MinMove;
PlotNumeric("Open",Open);
PlotNumeric("Close",OpenIsClose);
}
Else
{
PlotNumeric("Open",Max(Close,Open));
PlotNumeric("Close",Min(Close,Open));
}
}
Else If(MaFive>MaTen)
{
//如果是151根K線以前的Kurtosis線畫紅色
PlotNumeric("High",High);
PlotNumeric("Low",Low);
if(Open==Close)
{
OpenIsClose = Close+PriceScale*MinMove;
PlotNumeric("Close",OpenIsClose);
PlotNumeric("Open",Open);
}
Else
{
PlotNumeric("Close",Max(Close,Open));
PlotNumeric("Open",Min(Close,Open));
|