【Trading View 基本使用教學】
2014年我們便開始開辦程式交易課程,當時主要教授的是Amibroker,其後再增加有關Multichart的教學。近年始越來越多學員喜歡用Trading View,故此我們的教學內容也逐漸以Trading View的教學替代Amibroker,而且在Patreon也會定期提供一些Trading View的pine script(version 5)教學,希望會對大家有幫助。
學習pine scrip最好的方法就是參考別人已寫出來的例子,筆者會嘗試先用一些簡單的策略,每句語法給大家講解,多看這些例子後就會很容易上手。
首先,若有用Trading View的會員應該也知道,付了年費使用Trading View後,它所提供的是延時數據,所以只能用作backtest,若要用Trading View做autotrade,則需要申請實持數據,目前若要申請美股包括槓桿ETF如SQQQ及TQQQ等的實時數據大約是每月9.95美元,約77.6港元,其實算是十分便宜。但請留意這不包括標普、納指期貨的,若是想autotrade 美期,則需要額外申請,大約是5美元一個月,約39港元。
不過,筆者提提大家,若已付了Trading View的年費也先不用急著申請實時數據,因為若你本身已有申請interactive Broker的數據的話,其實可導入Trading View使用的。在下期課程也會教大家如何將Trading View連接interactive broker做autotrade(舊學員同時是Patreon會員也可免費重讀這部份的)。
故此,要做autotrade除了可選富途,interactive broker也可以。當然,若你想炒幣,選擇會更多,但筆者沒有教這方面的內容。
若果你完全是新手,也可先下載Trading View,會有一個月免費使用,先講解一下圖表的選擇,在「indicator」中可選不同的技術指標,一些較冷門的技術指標也有提供,如筆者已教過的Fisher Transform、可用以判斷即市中好、淡雙方力量的Vortex Indicator (VI)及判斷即市轉勢位的william fractal 等等也有提供。
圖表的選擇也有很多,如Heikin Ashi、Renko、kagi、Point&figure Chart等,當中Point&figure Chart就是OX圖,筆者覺得觀察OX圖的Intraday 圖表會對短炒有一定幫助
這些選擇圖表及指標的功能應不太困難,任何新手下載Trading View後也可自行嘗試。而Trading View最重要的是「Pine Editor」,就是可以在這裏寫交易策略做back test及autotrade,Trading View用的語法名為pine script,當寫好後可直接按「Strategy Tester」便會有backtest結果。
Trading View的backtest report其實內容十分清晰,在「overview」的部份便可看到資金變化,越平穩向上便越好,代表交易策略賺錢十分穩定。而在圖表上部份也顯示了虧損的情況,虧損不能完全沒出現的,但這部份顯示的形態越「平」越好,代表不會突然出現很大的虧損,若上落很大也代表交易策略在真實執行時會很困難。
另外,在「Performance Summary」則會顯示詳細的back test report,這部份很多完全新手常問筆者,「Total Closed Trade」是什麼,這其實代表你的交易策略在某段時間裏的「總交易次數」,report 也有顯示sharp ratio、profit factor等常見的數據。而「list of Trades」則會顯示每宗交易的詳細資料,基本上Multicharts及Amibroker等有提供的數據,Trading View也有提供,但Trading View不用再自行輸入數據,所以較為方便。
至於「Trading Panel」則是用作連接autotrade及導入外部數據用的,這個會逐步再教大家。
不過,要在Trading View寫策略就必需學習Pine Script,這套語法其實並不困難,但大家要留意,目前大家在Youtube或其他網頁看到的教學,絕大部份都是教 Version 4的版本,但Pine Script其實已更新至version 5,更改也頗多,例如要寫10日平均線在Vesrsion 4可以寫成 sma10=sma(close,10),但在version 5則要加上ta.,要寫成sma10=ta.sma(close,10)。
所以若大家用ChatGPT來幫自己寫Trading View的策略時會發現,ChatGPT的答案大部份都錯的,因為ChatGPT的數據是舊的,它給你的答案也是用version 4寫的。
不過,筆者知道有些學員其實已學過version 4 Pine Script的,又或大家可能在網上看到一些用version 4寫的sample,又很想直接使用,其實也有更方便的做法。在Pine Editor寫策略時先加上 //@version=4,然後按右上角的「...」便會見到「Convert code to v5….」,Trading View可協助將version 4的策略直接改為version 5的。
________________________________________________________________________________________________________________________________
【新手學pine script語法必需懂的格式】
有關Trading View的pine script ,其實Multicharts 的power language有點相似,若你是完全新手,可能早兩天的例子仍有些不明白,那今天筆者告訴大家一個寫策略的最基本「格式」,最初便跟著這個格式去寫,到習慣了就會很容易上手。看完這篇應該大家都理解pine script的基本寫法吧!
「
//@version=5
strategy(“My strategy”, overlay=true, margin_long=100, margin_short=100)
第一步驟:
設定變數
設定變數
例如: rsi_Length=input(9)
第二步驟:
計算過程(包括技術指標的計算)
例如: rs=ta.rsi(close,rsi_Length)
第三步驟:
設定入市條件
例如:
LongCondition= rs<=30 and rs>10
ShortCondition=rs>=70 and rs<90
第四步驟
設定入市及離場準則
」
可以想像成你想寫英文書信一樣,也會有一定的「格式」要求,要這樣寫Trading View才會明白你想表達什麼。
//@version=5
strategy(“My strategy”, overlay=true, margin_long=100, margin_short=100)
而以上兩句是一定要有的,version5代表了要告訴Trading View你用的pine script版本,若沒有寫策略就會不能compile,用不到的。
至於strategy 就是告訴Trading View你要寫的是交易策略,Trading View常用的有兩種格式,一種是寫交易策略就是要寫明是strategy,另一種是寫指標,就是沒有入市訊號,只是想自己設計一個技術指標在圖表上觀看,那便要用上indicatior的字眼。
如以下的寫法便是寫指標的最開頭部份:
//@version=5
indicator(“My script”)
另外,寫strategy時大家見到overlay=true, margin_long=100, margin_short=100,因為大家寫好策略後,策略中可能包括了把某些指標顯示在圖表上的,overlay=true就代表你想這些指標顯示在「主圖」上,若想在走勢圖之下顯示,那就寫成overlay=false。
而margin_long=100, margin_short=100 是設定長、短倉的入市比例,有時候大家也會看到有些炒家會在這部份加上以下部份,是因為要為backtest做一些設定。在amibroker或multicharts我們會有另外一個頁面做設定的,但Trading View就直接在這裏寫出來便可以。
commission_type=strategy.commission.percent, 這代表用百份比來計算佣金
commission_value=0.2, 佣金百份比是0.2%
initial_capital=10000 最初的本金為10000元
slippage= 1, 滑格設定為1個最小價格變動
currency=currency.USD 設定用美元來做backstest的單位
例如你想寫以下的策略:
RSI(9)跌至30以下但高於10便造好
RSI(9)跌至10或升至高於50便平好倉
RSI(9)升至70以上但低於90便造淡
RSI(9)升至90或跌至低於50便不淡倉
這個策略十分簡單,第一個步驟是要看看有那些是有「數字」的,這些數字由於我們想將來可以更容易更改,所以要先將其設定為變數。其實所有技術指標的參數都會是變數,而這個策略中,RSI便需要先設定一個變數。
大家在網上找例子會看到很多設定變數的寫法,如看到
var int , var float 等,這些筆者之後再講解,最先大家可以先記著這個準則,你先給變數一個名字,然後寫 = input(數字)。
以上的例子筆者給RSI的變數名字為rsi_Length,那寫法就是:
rsi_Length=input(9)
然後第二個步驟是計算過程,某些指標如Zero Lag MACD並沒有內置function的,那就要自己「加減乘除」去計,有些指標是有內置function的,例如RSI便可直接寫。
所有寫技術指標的方法都要先加「ta.」在開頭,例如RSI,便是
ta.rsi(列明用那一種數據去計算, 計算的長度)
如ta.rsi(close, rsi_Length)
就是用收市價去計算,計算日子長度是9日,因為我們在設定參數,已將rsi_Length設定為9。另外你也可以試試用最高價、最低價,成交量,甚至其他技術指標的數值去計算,在Trading View的社群便有些炒家愛計算MACD快線的RSI,寫法就是先計算MACD快線的值,再用以下寫法:
ta.rsi(MACD快線值, rsi_Length)
最後我們給這個rsi一個名稱,方便寫策略之後的部份可以使用,例如筆者給它名稱為rs
寫法就是:
rs=ta.rsi(close,rsi_Length)
然後第三個步驟就是設定入市條件,最初大家可以用以下的寫法會較簡單:
先給四個名稱,包括longCondition , shortCondition, longCloseCondition, shortCloseCondition
我們的入市條件是這樣:
RSI(9)跌至30以下但高於10便造好
RSI(9)跌至10或升至高於50便平好倉
RSI(9)升至70以上但低於90便造淡
RSI(9)升至90或跌至低於50便不淡倉
LongCondition= rs<=30 and rs>10
ShortCondition=rs>=70 and rs<90
LongCloseCondition=rs<=10 or rs>50
ShortCloseCondition=rs>=90 or rs<50
這些過程中會經常用了 「> 」、「<」、「>= 」、「<=」這些符號,代表了大於、小於、大於或等於、小於或等於。也會用很多and 及or 把策略組織起來。另「!=」代表不等如
最後是第四個步驟:
第四個步驟你需要用上「if….」、strategy.entry 及strategy.close
strategy.entry的寫法,造好及造淡是不同的,
造好: strategy.entry(“名稱”, strategy.long)
造淡: strategy.entry(“名稱”, strategy.short)
而strategy.close 在之後的括弧( ) 內要加上好倉或淡倉的名稱,這才能對應到是要平好倉還是要平淡倉。
寫法如下:
if LongCondition
strategy.entry(“BUY”,strategy.long)
if LongCloseCondition
strategy.close(“BUY”)
這例子中”BUY”是我給好倉的名稱,在strategy.entry中給予名稱,並要用上” “ 這個符號,然後在strategy.close也把名稱再寫一次。
再寫平淡倉的部份如下:
if ShortCondition
strategy.entry(“SHORT”,strategy.long)
if ShortCloseCondition
strategy.close(“SHORT”)
另大家看其他炒家寫的例子,平倉還可以用strategy.exit、strategy.close_all() 等等的,這些之後筆者再逐一講解。
以下是整個策略完整的寫法:
//@version=5
strategy(“My strategy”, overlay=true, margin_long=100, margin_short=100)
rsi_Length=input(9)
rs=ta.rsi(close,rsi_Length)
LongCondition= rs<=30 and rs>10
ShortCondition=rs>=70 and rs<90
LongCloseCondition=rs<=10 or rs>50
ShortCloseCondition=rs>=90 or rs<50
if LongCondition
strategy.entry(“BUY”,strategy.long)
if LongCloseCondition
strategy.close(“BUY”)
if ShortCondition
strategy.entry(“SHORT”,strategy.long)
if ShortCloseCondition
strategy.close(“SHORT”)
不過,大家若將文章中的寫法直接copy到Trading View的pine editor中又會看到顯示有錯誤的,當大家在pine editor寫策略時,看到有「紅色」的部份就是有錯了。
一般來說會有幾點是常會出錯的:
1) “ “ 的格式與Trading View的要求不對,把它再打一次便可以
2) if , strategy 等要全部細楷的,有時在文章中若寫了If也就會有不同
3) if 之後再寫下一句要在第五個字完開始,把句子移右一點便會變成正確,一般在寫完if的句子後按「enter」,trading view會自動告訴你下一句應該在那個位置開始寫的。
4) 自已給的名稱有大細楷分的,例如ShortCloseCondition,當中S, C, 都是大楷,當再寫時大細楷要完全一樣的。
這些都是最初常會遇到的問題,改正後便可以。若是完全新手,先記好這個「格式」,在Trading View上先寫幾次,應該不會感到太困難,有了基本概念後再慢慢學其他的寫法,累積經驗後便能逐步寫很多不同的策略。
___________________________________________________________________________________________________________
【新手學習用pine script 寫運用MACD的交易策略】
學了pine script的基本格式後,大家便可以試試寫一些簡單的策略做backtest。例如以下的例子:
//@version=5
strategy(“MACD Strategy”, overlay=true)
fastLength = input(12)
slowlength = input(26)
MACDLength = input(9)
MACD = ta.ema(close, fastLength) – ta.ema(close, slowlength)
aMACD = ta.ema(MACD, MACDLength)
delta = MACD – aMACD
if (ta.crossover(delta, 0))
strategy.entry(“MacdLE”, strategy.long, comment=”MacdLE”)
if (ta.crossunder(delta, 0))
strategy.entry(“MacdSE”, strategy.short, comment=”MacdSE”)
//plot(strategy.equity, title=”equity”, color=color.red, linewidth=2, style=plot.style_areabr)
大部份的策略都涉及使用技術指標,那就要每個指標的參數都設定一個變數,例如macd的參數是12, 26,9,那三個數字都要設定為變數,這樣做是為了日後使用可以隨時更改。
在Trading View中寫很多的指標都是以ta. 為開始的,例如你要寫普通的平均線就是ta.sma( ) ,若要寫EMA 指數平滑移動平均線就要寫ta.ema( )
而( ) 內需要有兩個數值,第一個是用什麼來計算,例如你想用收市價、最高價、最低價,還是成交量等等。而另一個數值就是長度。假設你要計算一條用成交量來計算的10日平均線,那寫法就是ta.sma(成交量, 10)。甚至你要計10日內的RSI平均值也可以,寫法就是ta.sma(rsi數值, 10)。
以上的策略可以看到,原創者所謂的MACD、aMACD及Delta是他自行去設定計算方式的。
首先他計MACD的方法是MACD = ta.ema(close, fastLength) – ta.ema(close, slowlength)
fastLength在最初已設定為12,那ta.ema(close,fastLength)就是計算以收市價計,12日的EMA。而slowlength最初也設定為26,那就是計算以收市價計,16日的EMA,然後前者減去後者就是原創者所指的MACD。
而aMACD = ta.ema(MACD, MACDLength)代表了,首先我們計算出MACD的答案,再用這個答案來計算平均數,而MACDLength最初已設定為9,那就是代表了aMACD是以MACD的值來計算9日的EMA。
這樣就有了MACD及aMACD的數值,將MACD – aMACD就會得到delta的答案。
即使是完全新手應該也覺得十分容易吧? 再來我們要學一些基本的,在Trading View中我們要寫「升穿」或「跌穿」就是ta.crossover ( ) 以及ta.crossunder( )。
而( ) 之內在ta.crossover代表前面的值升穿後面的值,若在ta.crossunder則代表前面的值跌穿後面的值。例如ta.crossover( A, B) 就代表A升穿B,若是ta.crossunder(A,B)就代表A跌穿B。
然後我們再看以下幾句:
if (ta.crossover(delta, 0))
strategy.entry(“MacdLE”, strategy.long, comment=”MacdLE”)
if (ta.crossunder(delta, 0))
strategy.entry(“MacdSE”, strategy.short, comment=”MacdSE”)
//plot(strategy.equity, title=”equity”, color=color.red, linewidth=2, style=plot.style_areabr)
在Trading View中寫交易策略,請記得是必需要有strategy.entry( ) ,這代表要告訴Trading View要入市的時刻。而( ) 內要寫的就一般有三個部份,第一個部份是名稱,要寫成”MacdLE”,這個名稱很重要,若你的策略有分注平倉,要讓Trading View知道你要將那一個已入市的倉位平倉,寫平倉時要列明這個名稱的。
寫了名稱後就是要告訴Trading View你是造好還是造淡,造好的寫法是strategy.long,造淡的寫法是strategy.short,其實有了名稱及已表明是造好還是造淡後已足夠,但有些用家想在圖表上標示一些註解,那就用comment=,以上的策略就是想在圖表上看到MacdLE及MacdSE,他才會加上comment。
而最基本寫策略就是 if ………………. 然後strategy.entry( ………)
以上的策略就是Delta由零以下升至零以上就買入,Delta由零以上跌至零以下就造淡。
這樣整個簡單的策略便寫完,但若你想在圖表上畫上一些線標示買入及賣出的訊號。那便加上plot (……………………)
Plot的最基本用法是( ) 內加上: 要畫那一個數值, 名稱, 顏色, 線的寬度, 線的形狀。
以上的策略就是要畫strategy.equity代表資金的變化,然後給予名稱時要用title= “ “ ,之後是顏色,寫法是color=color.什麼顏色,例如color=color.blue,之後是線的寬度及形狀。plot.style_area代表將線條繪製成區域圖形,這個功能在version 4或以上版本才有的。
另大家要留意在pine script 中加上// 大多是註解,加了//後即使你寫一些中文也不會有影響的,不會令策略有變化。原創者在寫plot 時加了// 代表這句只是給大家參考,若把// 冊除才會有plot的功能出現。
即使大家是Trading View的全新手也會覺得十分簡單吧! 筆者會定期將一些在社群中看到的例子解釋給大家看,透過這個過程去學習,即使是全新手應也不會覺得太困難。
_____________________________________________________________________________________________________________
【如何用Trading View自制不同的技術指標】
教授pine script 時最多新手問的就是一些主要的技術指標如何去寫,當你最初練習pine script時就先用一些常用的技術指標來試試寫策略,到熟習後,即使一些未見過的技術指標,只要你在google找到指標的公式,也能自行寫出來。
例如,MACD是內置的指標,第一步是記得trading view的內置指標是要加上「ta.」的,寫法如下:
[macdLine,signalLine,_]=ta.macd(close,12,26,9)
再要把MACD的快線在圖表上顯示,就用plot這個功能,寫法如下:
plot(macdLine,title=”MACDLINE”,color=color.red,linewidth=1)
不過,有些指標可能並非內置的,又或即使是內置,但你習慣了自行寫出來,假設大家不懂得什麼是bollinger’s band,然後在網上找到它的公式就是通道的頂部是20日平均線加上兩個標準差,而底部是20日平均線減去兩個準差,那我們就可以自己寫出來。
例如平均線是SMA,要寫出來就要加上「ta.」,先想一個名稱給你每個要計算的答案,什麼名稱都可以,但名稱不可以用數字開頭。例如你想叫平均線的名稱做SMA20,就用以下的寫法:
sma20=ta.sma(close,20)
然後又給標準差一個名稱,假設你叫它為ST,那寫法如下:
st=ta.stdev(close,20)
然後再分別給多通道的頂部及底部名稱,假設叫做upper及lower
upper = sma20+ 2*st
lower = sma20 – 2*st
寫法就是這樣簡單,然後upper及lower就可以用作其他計算的部份,例如你的入市策略是最高價升穿bollinger’s band 達5%,那寫法如下:
先給你的入市條件一個名稱,假設名為buyCondition,也給upper高5%的情況一個名稱,假設是upperhigh
uppperhigh=upper*1.05
buyCondition=ta.crossover(high,upperhigh)
此外,其他我們常見的技術指標如RSI, ATR等也是內置的,寫法同樣是先給它們一個名稱,例如你想叫它們做rs及atrValue,寫法如下:
rs=ta.rsi(close,14)
atrValue=atr(14)
其他有些主要常用的技術指標也要自行計算的,如Stochastic,寫法如下:
//@version=5
indicator(“stochastic”)
stcLength=input(14)
periodK=input(3)
periodD=input(3)
fastSTC=ta.stoch(close,high,low,stcLength)
slowK=ta.sma(fastSTC,periodK)
slowD=ta.sma(slowK,periodD)
plot(slowK,title=”slowK”,color=color.red,linewidth=1)
plot(slowD,title=”slowD”,color=color.blue,linewidth=1)
我們再試試寫Rate of change這個指標,先在網上找到它的公式如下:
然後大家可自行先用Trading View 先試試寫出來才看答案,若沒有寫錯,那寫指標這部份的學習便沒有問題了。
Rate of change寫法答案:
length = input.int(9)
source = input(close)
roc_smooth = input(5)
roc = ta.sma((100 * (source – source[length])/source[length]),roc_smooth)
最後我們看看super Trend這個指標的寫法,有些時候我們希望指標的參數是可以寫好後直接在圖表上更改的,又或有幾個指標的參數也是一樣的,我們會重覆使用,那就先給參數一個名稱,例如叫做length,可以參考以下superTrend這個指標的寫法:
//@version=5
indicator(“SuperTrend”, overlay=true)
length = (10)
multiplier = (3)
atr = ta.atr(1)
basis = ta.highest(high, length) + ta.lowest(low, length)
basis := basis / 2
upperBand = basis + (multiplier * atr)
lowerBand = basis – (multiplier * atr)
trendUp = close > upperBand[1] ? true : close[1] > upperBand[1] ? true : false
trendDown = close < lowerBand[1] ? true : close[1] < lowerBand[1] ? true : false
plot(trendUp ? upperBand : lowerBand, color=color.blue, linewidth=2, title=”SuperTrend”)
這裏用了「? :」這種寫法,?前是條件,?後是若符合條件要怎樣,而:後則是若不符合條件要怎樣,若大家看其他Tradind View用家寫的策略,這是十分常見的寫法。
trendDown = close < lowerBand[1] ? true : close[1] < lowerBand[1] ? true : false
這個的意思就是trendDown是名稱,然後看看收市價是否小於上一支陰陽燭的supertrend的底部,若符合條件就是true,否則就再看看上一支陰陽燭的收市價是否低於上一支陰陽燭的supertrend的底部,若符合條件,也是true,但兩個條件也不符合就是false。
________________________________________________________________________________________________________
【如何用Trading View寫運用多種timeframe的策略】
Pinescript的功能其實十分之多,可以寫到不同的指標之餘,甚至可以將一些統計學的概念應用在交易策略之上。
例如我們在facebook介紹的Predicted_price MACD是將Linear Regression 的計算融入MACD中,相信大家現在應不難明白。
影片中有兩個例子,分別是看SQQQ及Apple的5分鐘圖,你會發現指標的入市訊號比傳統的MACD更準確,甚至你會看到MACD根本就是顯示市況向好,但Predicted_price MACD卻顯示造淡訊號。事實上,Linear Regression確實很有用,只要與價格有線性關係的數據都可以作分析,會對股價的變化有預測作用。除了Predicted_price MACD,其他我們研發的與Linear Regression相關的交易策略都會陸續介紹給大家。
這篇文章的的題目是如何用Trading View寫運用多種timeframe的策略,這也是最多人會問的問題之一,因為很多人都會喜歡多種時間間隔的策略,例如同時運用5分鐘圖及1分鐘圖表,又或同時用小時圖與5分圖表等。
要寫這樣策略就要用上request.security這個function,用法例如子如下:
[macdLine,signalLine,_]=ta.macd(close,12,26,9)
signal5min=request.security(syminfo.tickerid,”5″,signalLine)
macdhourly=request.security(syminfo.tickerid,”60″,macdLine)
request.security的( ) 內要寫上的有三個部份,包括「要取那一個symbol的資料」、「要什麼時間間隔」、「要取那一個數據」。
「要取那一個symbol的資料」的部份若填上syminfo.tickerid就是要取目前你在Trading View畫面上顯示的數據,例如你圖表上是在看Apple(US:AAPL),若填上syminfo.tickerid就會最Apple(US:AAPL)的數據。
但大家可能會覺得奇怪,為什麼要多填一次,本身不就是想要Apple不同時間間隔的數據嗎? 因為request.security除了可以拿取不同時間間隔圖表的數據外,也可以拿取不同symbol的數據,例如你想看蔚來(US:NIO)的走勢來炒Tesla(US:TSLA),你在這個部份便不能再寫上syminfo.tickerid,你要在主圖上開啟Tesla的圖表,然後在request.security的( )填上蔚來的symbol,那就可以寫到看蔚來的數據炒Tesla的策略。
而「要什麼時間間隔」就很簡單是要取什麼時間間隔的數據,若只寫數字就是代表多少分鐘,例如”5″就代表5分鐘,”60″就代表60分鐘,”D”則代表日線圖的數據,”W”則代表周線圖的數據。
例如你本身的策略是運用1分鐘圖表的,就在主圖表上開啟1分鐘圖,然後加上這句:
dailyhigh=request.security(syminfo.tickerid,”D”,high[1])
就可以拿到上一個交易日裏日線圖的最高價,dailyhigh是自已給的名稱,方便大家在計算時再使用。例如你再寫dailyhigh> dailyhigh[1]就代表你的策略中要求上一個交易日的最高價比再上一日的最高價更高。
留意,本身daiyhigh這個數據要自行設定是要取「上一個交易日」的最高價,若在這個名稱再加上[1],便是由上一個交易日開始再倒數一個交易日。
最後是request.security的( ) 內「要取那一個數據」的部份,這部份不一定只能使用最高價、最低價、開市價、收市價等的數據的,也可以是不同指標的數據,甚至是你自行經過計算的答案。
假設你在主圖表上開啟一個1分鐘圖表,你的策略也包括了MACD的運用,先用[macdLine,signalLine,_]=ta.macd(close,12,26,9) 定義了MACD的快線及慢線為macdLine及signalLine。
signal5min=request.security(syminfo.tickerid,”5″,signalLine)
macdhourly=request.security(syminfo.tickerid,”60″,macdLine)
然後我們把5分鐘MACD慢線的數據及小時圖MACD快線的數據命名為signal5min及macdhourly,然後用上request.security,在( )內分別填上signalLine及macdLine便可以。
再加上plot便可以把5分鐘MACD慢線的數據畫出來,然後加一個1分的MACD便能將兩者作比較。
另外,筆者發現很多新手都比較抗拒使用plot這個功能,大家都會只集中去留意backtest的結果,而且有了backtest的結果後圖表上根本便有入市訊號的位置,那大家自然會想,若不是要寫一個自己的技術指標,那plot這個功能實沒多大用處。
但筆者的習慣是,每次寫自己的交易策略時,每寫一部份都會先用plot來看看寫出來的是否真的是自己想要的,因為用程式語言去寫交易策略,與大家用目測是完全不同的,很多時候用程式寫出來的未必就是你想要的。你的交易策略可以很複雜,到你寫好後再做backtest,才發現根本不是你想要的,那再重寫就反而會更麻煩。
_______________________________________________________________________________________________
【如何用Trading View寫每天只交易一次的策略】
最記得以前有學員曾說過,他過去試過很多的交易策略,最後在實戰時的成績都不太好,然後「嬲嬲地」就每天只看到MACD的第一個訊號便入市,開市後見MACD的快線升穿慢線便買入,相反,若MACD的快線跌穿慢線便造淡,然後見MACD的快線繼續上升便平好倉,造淡時則見MACD的快線繼續下跌就平淡倉,就是這樣簡單! 但效果反而比很多複雜的策略更好。
這個只是他的意見,最後成績如何他沒有告訴我,但筆者自己研究過很多的Daytrade策略也都是每天只交易一次的,因為交易次數太多,交易成本就會增加,而且長時間交易會覺得更亂,特別是遇上連續虧損的時候,而每天只交易一次就是讓自己有足夠時間冷靜下來。
不過,若要用pine script寫這類每天只交易一次的策略,又應怎樣寫?
以下是一個很簡單運用Zero Lag MACD的交易策略,就是快線升穿慢線便買入,當買入後看到連續三支陰陽燭的時間內MACD的快線都在上升,那就平倉離場。
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © markchunwaipaul
//@version=5
strategy(“zero lag MACD交易例子”, margin_long=100, margin_short=100, initial_capital =1000,default_qty_type = strategy.percent_of_equity,default_qty_value = 100)
SN=input(12)
LP=input(26)
M=input(9)
ema1=ta.ema(close,SN)
ema2=ta.ema(ema1,SN)
ema3=ta.ema(close,LP)
ema4=ta.ema(ema3,LP)
ZerolagMACDLine=(2*ema1-ema2)-(2*ema3-ema4)
ema5=ta.ema(ZerolagMACDLine,M)
ema6=ta.ema(ema5,M)
ZerolagSignalLine=2*ema5-ema6
Histogram=ZerolagMACDLine-ZerolagSignalLine
var bool traded =false
closeCond=ta.rising(ZerolagMACDLine,3)
noposition=strategy.position_size==0
buyCond=ta.crossover(ZerolagMACDLine,ZerolagSignalLine)
if buyCond and noposition
strategy.entry(“BUY”,strategy.long)
if closeCond and not noposition
strategy.close(“BUY”)
plot(ZerolagMACDLine,title=”MACDLine”,color=color.yellow ,linewidth=2)
plot(ZerolagSignalLine,title=”SignalLine”,color=color.green,linewidth=2)
plot(Histogram, color=color.black, style=plot.style_histogram,linewidth=2)
以上策略的Backtest report:
可以看到這樣寫每天的交易次數肯定不只一次,交易了1023次,獲利交易只有514次,勝率約50.24%,一年的虧損約37.45%。
另以下是同一個策略但每日只交易一次的寫法:
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © markchunwaipaul
//@version=5
strategy(“用zero lag MACD每日只交易一次例子”, margin_long=100, margin_short=100, initial_capital =1000,default_qty_type = strategy.percent_of_equity,default_qty_value = 100)
SN=input(12)
LP=input(26)
M=input(9)
ema1=ta.ema(close,SN)
ema2=ta.ema(ema1,SN)
ema3=ta.ema(close,LP)
ema4=ta.ema(ema3,LP)
ZerolagMACDLine=(2*ema1-ema2)-(2*ema3-ema4)
ema5=ta.ema(ZerolagMACDLine,M)
ema6=ta.ema(ema5,M)
ZerolagSignalLine=2*ema5-ema6
Histogram=ZerolagMACDLine-ZerolagSignalLine
var bool traded =false
closeCond=ta.rising(ZerolagMACDLine,3)
noposition=strategy.position_size==0
buyCond=ta.crossover(ZerolagMACDLine,ZerolagSignalLine)
if buyCond and not traded and noposition
strategy.entry(“BUY”,strategy.long)
traded:=true
if closeCond and not noposition
strategy.close(“BUY”)
if ta.change(time(“D”))!=0
traded:=false
plot(ZerolagMACDLine,title=”MACDLine”,color=color.yellow ,linewidth=2)
plot(ZerolagSignalLine,title=”SignalLine”,color=color.green,linewidth=2)
plot(Histogram, color=color.black, style=plot.style_histogram,linewidth=2)
留意克體的部份就是加上後令策略變成「每天只交易一次」。
先設定traded為false,然後當買入後便設定為true,由於入市條件加上了not traded,代表要traded 必需為false時才會入市,這樣交易一次後就不會再交易,最後加上ta.change(time(“D”))!=0,代表要轉為第二個交易日,traded才會再轉變為false,然後第二日當ZerolagMACD的快線升穿慢線時就會符合入市條件。
策略的backtest report:
同一樣的交易策略,只是將其改變為「每天只交易一次」,可以看到結果也是虧損,不過,虧損幅度卻由37.45%大幅下降至10.75%。另外要留意,筆者寫這兩個策略是沒有計算「佣金」及「滑價」的,而第一個策略在一年裏交易了1023次,但加上「每天只交易一次」這個條件後,一年裏只交易了258次,交易成本會相差很遠,不過勝率就未見有大幅改善,獲利的次數只有132次,勝率只輕微由50.24%提高至51.16%。
交易策略當然不可能這樣簡單,但只要將以上兩個策略作比較便可看到,每天只交易一次的Daytrade策略確實能提高成效。
_______________________________________________________________________________________
【如何提高保歷加通道交易策略的勝算】
我們已學習了一些pine script的基本語法,相信大家經練習後已能逐漸掌握。這篇則會講解一些比較深入的分析技巧。
有一種策略是很多新手都經常問我的,若要寫股價跌穿保歷加通道底部便買入,升穿保歷加通道頂部便造淡,應該怎樣用pine script 寫出來?
以下的入市準則是,收市價低於保歷加通道底部便買入,然後待收市價跌穿保歷加通道中軸便平倉,相反,收市價高於保歷加通道頂部則造淡,然後待收市價升穿保歷加通道中軸平倉。
//@version=5
strategy(“升穿bollinger’s band錯誤用法”, overlay=true, margin_long=100, margin_short=100)
sma20=ta.sma(close,20)
mult=ta.stdev(close,20)
upper=sma20+2*mult
lower=sma20-2*mult
noposition=strategy.position_size==0
var bool traded =false
buyCond=close<lower and close<sma20
shortCond=close>upper and close>sma20
buycloseCond=ta.crossover(close,sma20)
shortcloseCond=ta.crossunder(close,sma20)
if buyCond and noposition and not traded
strategy.entry(“BUY”,strategy.long)
traded:=true
if buycloseCond and not noposition
strategy.close(“BUY”)
if shortCond and noposition and not traded
strategy.entry(“SHORT”,strategy.short)
traded:=true
if shortcloseCond and not noposition
strategy.close(“SHORT”)
if ta.change(time(“D”))!=0
traded:=false
這是最簡單的寫法,但大家應會想到,若收市價低於保歷加通道底部便買入,那以下情況可能會出現「連續多次買入」,所以在策略中已設定了每天只交易一次,而且入市情況需要「沒有持倉」才會入市。
可以看到這類交易策略,交易一年後仍然要虧損,數據是用了Tesla(US:TSLA)的5分鐘數據,而這個策略在一年裏交易了259次,獲利的有151次,勝率大約是58.3%。
若要修改這類運用保歷加通道頂部及底部的策略,其實比較好的處理方法是,當股價升穿保歷加通道頂部後,等待股價再回落至保歷加通道之內才入市造淡,同樣地,若股價跌穿保歷加通道底部,也是等待股價回升至保歷加通道之內才入市造好。
寫這類策略的方法是運用ta.crossover 及ta.crossunder,
若寫成ta.crossover(close,lower),就是代表了股價由保歷加通道底部以下,升穿保歷加通道底部之時便會入市買入。
可以想想,要出現這種情況必然是股價之前已經跌穿了保歷加通道底部才會發生,那便既符合跌穿保歷加通道底部的要求,同時又符合了股價再回升至保歷加通道內的要求。
而升穿保歷加通道頂部後再待股價回落至通道之內的寫法應大家現在也懂得怎樣寫,那便是ta.crossunder(close,upper)。
以下是整個策略的完整寫法:
//@version=5
strategy(“升穿bollinger’s band及跌穿bollinger’s band策略”, overlay=true, margin_long=100, margin_short=100)
sma20=ta.sma(close,20)
mult=ta.stdev(close,20)
upper=sma20+2*mult
lower=sma20-2*mult
noposition=strategy.position_size==0
var bool traded =false
buyCond=ta.crossover(close,lower) and close<sma20
shortCond=ta.crossunder(close,upper) and close>sma20
buycloseCond=ta.crossover(close,sma20)
shortcloseCond=ta.crossunder(close,sma20)
if buyCond and noposition and not traded
strategy.entry(“BUY”,strategy.long)
traded:=true
if buycloseCond and not noposition
strategy.close(“BUY”)
if shortCond and noposition and not traded
strategy.entry(“SHORT”,strategy.short)
traded:=true
if shortcloseCond and not noposition
strategy.close(“SHORT”)
if ta.change(time(“D”))!=0
traded:=false
從backtest report可以看到勝率會較第一個的策略為高,一年裏交易了258次,獲利的有167次,勝率提高至64.73%,但最重要的是原本是虧損的策略已變成輕微獲利。
不過,獲利確實不多,那又有沒有方法可以改得更好? 最常見的做法是觀察圖表上的入市訊號,特別是留意出現裂口高開或裂口低開的情況,因為不少人都會認為出現裂口高開或裂口低開會引發上日持倉過夜的炒家的平倉盤,但這並不代表當日即市的走勢,只會在開市初段產生短暫影響。
而我們在圖表上觀察這個策略的入市訊號時,又確實發現有些日子的造淡的訊號會因為當日出現裂口高開,因而升穿了保歷加通道頂部,其後股價重返保歷加通道之內便入市造淡,不過最後卻出現虧損。
那若我們剔除因裂口高開而出現的入市造淡訊號又會怎樣? 但這種修改方法又很可能把原本能獲利的訊號也剔除的,結果是交易表現可能更差。
筆者就建議可以試試與平均線配合作修改,例如運用「Hull Moving Average,HMA」,這是一種了特別重視最近價格變動的加權移動平均線,有點像「Weighted Moving Average,WMA」,但HMA的滯後情況會較WMA少。
我們試試加上一些新的條件,買入時必需HMA比上一支陰陽燭的HMA為高,造淡時則必需HMA比上一支陰陽燭的HMA為低。
以下便是修改後的版本,在主圖上的紅線便是HMA。
//@version=5
strategy(“升穿bollinger’s band 改良版”, overlay=true, margin_long=100, margin_short=100)
sma20=ta.sma(close,20)
mult=ta.stdev(close,20)
upper=sma20+2*mult
lower=sma20-2*mult
noposition=strategy.position_size==0
var bool traded =false
hmaValue=ta.hma(close,10)
buyCond=ta.crossover(close,lower) and close<sma20
shortCond=ta.crossunder(close,upper) and close>sma20
buycloseCond=ta.crossover(close,sma20)
shortcloseCond=ta.crossunder(close,sma20)
buyCond2=hmaValue>hmaValue[1]
shortCond2=hmaValue<hmaValue[1]
if buyCond and noposition and not traded and buyCond2
strategy.entry(“BUY”,strategy.long)
traded:=true
if buycloseCond and not noposition
strategy.close(“BUY”)
if shortCond and noposition and not traded and shortCond2
strategy.entry(“SHORT”,strategy.short)
traded:=true
if shortcloseCond and not noposition
strategy.close(“SHORT”)
if ta.change(time(“D”))!=0
traded:=false
plot(hmaValue,title=”HMA”,color=color.red,linewidth=1)
結果可以看到訊號大幅減少,但勝率再提升至75%,但看最大獲利的最大虧損的比例達到3:1,這類策略即使遇上最壞的情況也是虧損有限。但問題就是交易次數真的真的太小的,一年只有8次入市機會,雖然獲利的次數有6次,但交易次數太小也會令最終的回報有限。
但大家可以想想,若你把「10個」本來只有六成中的交易策略,修改至七成中以上,而且Maximum Drawdown不大,盈虧比更大幅提升至3比1,那麼你獲利的機會根本便很大。
然後我們這10個策略同時執行,那你的交易次數就不會少了,而回報也會因而增加。若為了達到有足夠多交易次數的目的而勉強去運用一些勝率較低,盈虧比又較低的交易策略,那最終的回報反而不會太好。
___________________________________________________________________________________________________
【用pine script寫機構投資者管理倉位的方法】
若看回過去的文章又或筆者的個人書籍也會看到,一直也強調交易不是容易事情,同一樣的交易方法只要不同的人去用,結果也會不同,因為每個人承受壓力的能力及執行力也不同。
不過有一種交易方法筆者都幾肯定,只要有人肯用,最後的結果都會十分接近,最後每個人都會破產,絕無例外。那就是用突破買入的方法配合不斷加注。最著名的有傑西李佛摩及海龜,但強如傑西李佛摩最後也要「輸身家」,海龜的創辦人Richard Dennis 因為有止蝕才能保命,但退休前也輸了一半身家。其他成員有自稱是最成功的海龜成員之一的Curtis Faith最後也是破產。
但海龜的成員其實很有趣,他們也知道Richard Dennis教的交易策略勝率本很低,10次中平均只有3次是獲利的,獲利時又要不幾加注,但最初他們接受訓練時,由於資金是Richard Dennis給他們的,那就唯有照做,剛好遇上幾年大單邊升市或跌市,那就能獲利,重點是當時若輸了,最多也只是失業,錢也是Richard Dennis的。
但到海龜的訓練結束後,部份人確實有繼續用Richard Dennis教的策略,不過其實大部份也有改良的,既然明知道策略的勝率很低,要令自己做交易時做得「舒服」一點,同時又讓自己有更大機會「保命」,在資金管理上他們其實想過很多不同的準則。
入市策略他們仍然採用突破買入的方法,例如當股價升穿保歷加通道頂部後便買入,然後一直持有,直至股價回落,並跌穿保歷加通道中軸才離場。這樣做是希望賺時能賺盡整個升浪,但個過程中他們「剔除」了不斷加注這一部份,壓力就會減少。
不過,這還不是重點,入市的倉位也要因應市況改變,昨日我們學習了一些因應市場波幅改變倉位的策略,其實昨日提及的改變倉位方法就是海龜成員最常用的一種,筆者就認為海龜的交易策略雖然很出名,但真正值得參考的就只有這個管理倉位的部份。
但要控制倉位並不只有這種方法, 以下的方法大家也可參考一下,而且有很多基金確實是現在也在用類近的方法管理倉位,而且計算也很簡單。
annvol = 100*math.sqrt(365)*stdev/close
先將收益波幅轉為年度化收益波幅。
第二部份的investpercent則由個人決定的。
Investpercent=input(15)
shares = (strategy.initial_capital * (investpercent/annvol)) / close
計算應交易多少股份,再確定是否有足夠資金買入,這裏是假設了沒有槓桿:
levage=input(1)
maxcapital = strategy.initial_capital+strategy.netprofit
if ((shares*close) > levage *maxcapital)
shares := levage *maxcapital/close
以上的語法中,strategy.initial_capital代表了本金,strategy.netprofit代表了已錄得的盈利。
其實這種方法還可以因應資金的變化再改變,因為總資金會隨著連續盈利而增加,又或隨著連續虧損而減少的,以上只是是筆者簡化了的過程,大家也可以先試試把這個管理倉位的方法應用在交易策略上看看效果如何,筆者未來也會講解更多更深入的資金管理方法。
________________________________________________________________________________________
【用pinescript寫綜合Renko圖與陰陽燭圖的交易策略】
Renko圖相信大家也聽過,就是市場上其中一種可以剔除「雜訊」的圖表類型。例如你覺得即市走勢中價格上落很少的時間根本沒有趨勢可言,這時候你若選擇入市,就很大機會出現「左一巴右一巴」的情況,就是買升又要止蝕,反手買跌又再止蝕,因為市場根本沒有趨勢,很多的技術指標在這時候其入市訊號都會出錯。
而Renko圖的畫法是,價格要變動至一定程度才會更新,在圖表上看Renko圖可以看到很多不同的「磚塊」,使用前要先設定每個「磚塊」的大小。
假設你把每個磚塊的大小設置為2元,價格每變動2元才會畫一個新的磚塊,若現在的價格是在52元至54元的範圍,其後要畫新磚塊的條件有兩個,股價升穿56元,又或股價跌穿50元,若沒有出現這種情況,新磚塊不會形成。只有當價格升至 56 美元以上,例如 57 美元,新磚塊就會畫在56美元。畫法是每個塊都與前一個磚塊成 45 度角(向上或向下)。
但其實每個磚塊的大小可以設定為多少美元外,也可以設置為多少個「開市價、最高價、最低價與收市價的平均數」,但也可以設定為多少個ATR。最常見的就是用ATR,因為不同價格的股票也可方便做比較。
很久之前其實筆者已在我們網頁www.quants.hk介紹過如何用amibroker自製Renko圖,若大家習慣了用amibroker也可參考一下:
Analysis -> Formula Editor
2) 在AmiBroker輸入下面的languages (sources from Amibroker.com)
// Brick size is dependant on what you want, if too small will not produce a chart due to insufficient x-axis bars
//Brick = LastValue( ATR(100) );
//Brick = LastValue( Max(0.02*C, 0.05) );
Brick = Param( “Brick Size”, 5, 5, 20, 1);
reverse = 2;
// Convert the closing price to rising and falling rounded bricks
CF = ceil(C/Brick);
CR = floor(C/Brick);
// initialize first element
j = 0;
RKC[j] = CF[0];
RKO[j] = CF[0] + 1;
down[j] = 1; // By default the first bar is a down bar.
up[j] = 0;
// Loop to produce the Renko values in number of bricks
for( i=1; i<BarCount-1; i++ )
{
if( CF[i] <= RKC[j] – 1 && down[j] ) // Continue down
{
num = RKC[j] – CF[i];
for( x=1; x<=num; x++ )
{
j++;
up[j] = 0;
down[j] = 1;
RKC[j] = RKC[j-1] – 1;
RKO[j] = RKC[j] + 1;
}
}
else
{
if( CR[i] >= RKC[j] + Reverse && down[j] ) // Change down to up
{
num = CR[i] – RKC[j];
j++;
up[j] = 1;
down[j] = 0;
RKC[j] = RKC[j-1] + 2;
RKO[j] = RKC[j] – 1;
for( x=2; x<=num; x++ )
{
j++;
up[j] = 1;
down[j] = 0;
RKC[j] = RKC[j-1] + 1;
RKO[j] = RKC[j] – 1;
}
}
else
{
if( CR[i] >= RKC[j] + 1 && up[j] ) // Continue Up
{
num = CR[i] – RKC[j];
for( x=1; x<=num; x++ )
{
j++;
Up[j] = 1;
Down[j] = 0;
RKC[j] = RKC[j-1] + 1;
RKO[j] = RKC[j] – 1;
}
}
else
{
if( CF[i] <= RKC[j] – Reverse && up[j] ) // Change up to down
{
num = RKC[j] – CF[i];
j++;
Up[j] = 0;
Down[j] = 1;
RKC[j] = RKC[j-1] – 2;
RKO[j] = RKC[j] + 1;
for( x=2; x<=num; x++ )
{
j++;
up[j] = 0;
down[j] = 1;
RKC[j] = RKC[j-1] – 1;
RKO[j] = RKC[j] + 1;
}
}
}
}
}
}
// move the chart to right end of chart space, ie last brick on last bar position
delta = BarCount-1 – j;
RKC = Ref( RKC, -delta );
RKO = Ref( RKO, -delta );
Up = Ref( Up, -delta );
Down = Ref( Down, -delta );
/*
rC = RKC * Brick;// + (Up-down)*Brick/2;
rO = RC – (Up-down)*Brick;
rH = Max(rC,rO);
rL = Min(rC,rO);
*/
C = RKC * Brick;// + (Up-down)*Brick/2;
O = C – (Up-down)*Brick;
H = Max(C,O);
L = Min(C,O);
Plot( C, “”, colorGrey50,styleCandle);
// plot chart
//plotOHLC( rO, rH, rL, rC, “Renko Price ” , colorBlack, styleCandle);
GraphXSpace=5;
Title = Name() + ” – {{INTERVAL}} {{DATE}} – Renko Chart : Last Value = ” + RKC * Brick + “, Brick Size = ” + Brick;
3) File -> Save As -> 輸入檔案名稱(例如renko_indicator)-> 存檔 -> 關閉Formula Editor 視窗
4) 打開Chart 視窗-> Custom Indicator -> 右點擊renko_indicator(剛剛儲存的檔案名稱)-> Insert-> OK
5) Renko 圖便出功出現在圖表上。
不過,若是初學寫程式,應該看到以上的例子就覺得很難學,不過要用Trading View 寫出來就簡單很多。
首先Trading View根本便可以直接在圖表上顯示Renko 圖,根本不用自行製作,不同timeframe的Renko圖也可選擇,甚至你想看Renko圖的秒圖也可以。
那既然Trading View已經內置了Renko圖,那還為什麼要自己寫?
其實要寫的就是利用Renko圖的數值變化來設計交易策略。例如在一個5分鐘陰陽燭的圖表上,我想加上Renko圖的變化來作入市訊號,要在Trading View 寫出來也非常簡單。
首先我們要運用ticker.renko( ) 這個function,要用這個function,( ) 內就要寫明Renko圖的變化是用ATR來計算,這也是最常用的一種,然後你要用的Renko圖究竟要幾化多少個ATR才會代表由升轉跌,或由跌轉升。
例如你想現時的價格上升三個ATR便再多畫一個代表上升的Renko,相反,若現時的價格下跌達三個ATR就畫一個代表下跌的Renko,那參數便設定為3。
以下便是例子:
renkoLength=input(3,title=”RenkoLength”)
renkoValue=ticker.renko(syminfo.tickerid,’ATR’,renkoLength)
這樣renkoValue便代表了Renko圖的數值。
然後我想要每個renko的開市價及收市價,就可以運用request.security這個function。
renkoclose=request.security(renkoValue,timeframe.period,close)
renkoopen=request.security(renkoValue,timeframe.period,open)
大家可以記回筆者已教過的,我們要在15分鐘圖找出MACD 的1分鐘圖的數值。那我們第一個步驟自然要先用MACD的function找出MACD的數值。
[MacdLine, MacdSignalLine, MacdHistogram]=ta.macd(close,12,26,9)
這個步驟與我們用renko的內置function找出renko圖的數值十分近似。
然後我們要找出MACD的各項數值,例如快線、慢線等的數值也是要用request.security這個function。
而我們要找出Renko圖的開市價及收市價也是用request.security這個function,過程也十分近似。
明白了這兩個步驟後,之後要計算便十分容易。
然後筆者想把Renko圖的收市價高於開市價或收市價低於開市價這兩種情況分辨出來,寫法如下:
var float renkoValuecal = na
if renkoclose>renkoopen
renkoValuecal:=1
else if renkoclose<renkoopen
renkoValuecal:=-1
這代表了收市價比開市價高給它數值為1,相反,若收市價比開市價低就給它數值為負1,可以想像成Renko圖出現「陽燭」就代表是 +1 ,相反,若出來陰燭就代表了 -1 。
這樣做是方便之後寫交易策略時較容易去計算,因為筆者想寫的入市準則是Renko圖由陰燭變成陽燭時便買入,若Renko圖由陽燭變成陰燭時就造淡。由於Renko圖已剔除了很多市場的「雜訊」,若由陰燭變成陽燭可能代表了一個新升浪的開始,或由陽燭變成陰燭則代表了一個新跌浪的開始。
不過,筆者再加上一些準則,買入時必需沒有任何倉位,而且RSI(9)的數值要低於50,入市後當RSI(9)的數值升至70便平倉。而造淡時也必需沒有任何倉位,而且必需RSI(9)的數值高於50,入市後RSI(9)的數值跌至30便平倉。
整個完整的策略如下:
//@version=5
strategy(“RenKo chart strategy”, overlay=true, margin_long=100, margin_short=100)
renkoLength=input(3,title=”RenkoLength”)
renkoValue=ticker.renko(syminfo.tickerid,’ATR’,renkoLength)
renkoclose=request.security(renkoValue,timeframe.period,close)
renkoopen=request.security(renkoValue,timeframe.period,open)
rs=ta.rsi(close,9)
noposition=strategy.position_size==0
var float renkoValuecal = na
if renkoclose>renkoopen
renkoValuecal:=1
else if renkoclose<renkoopen
renkoValuecal:=-1
buyCond=renkoValuecal[1] <0 and renkoValuecal>0 and noposition
buyCond2=rs<50
buyCloseCond=rs>70
shortCond=renkoValuecal[1] >0 and renkoValuecal<0
shortCond2=rs>50
shortCloseCond=rs<30
if buyCond
strategy.entry(“BUY”,strategy.long)
if shortCond
strategy.entry(“SHORT”,strategy.short)
col=renkoclose>renkoopen?color.red:color.blue
plot(renkoopen,title=”Renko Open”,style = plot.style_line,linewidth=2,color=col)
最後的部份是想將Renko圖的變化同步顯示在主圖表上的陰陽燭圖中。
大家可以看到,Renko圖在即市交易時會有一定參考價值,會看到Renko圖由陰燭變成陽燭,又或由陽燭變成陰燭時,確實有機會是即市中的新升浪或跌浪出現的時間。
但問題是有些Renko圖的訊號仍然存在「雜訊」,在遇上上落市時,Renko圖的訊號出現過多。
但以上的策略只是給大家去學習如何把Renko圖的變化融入交易策略中,大家也可以試試作更多的修改。
例如:
1) 每天只交易一次會否更好?
2) 每天只在上半段或下半段時段做交易又會否更好?
3) 加上其他的指標多重確認升勢或跌勢時才運用Renko圖的變化入市?
4) 當日裂口高開或低開會否影響Renko圖入市訊號的準確程度?
5) Renko圖在以上例子中設定了轉變三個ATR才會轉變,將三個ATR改為更多或更少會否影響結果?
以上這些現在大家應已懂得自行寫出來做backtest,Renko圖在即市交易中其實很有用的,特別是交易期指或一些槓桿ETF等,由於每天的走勢存在大量的「雜訊」,用Renko圖把這個「雜訊」剔走後,便變得更容易去分析。