變數(Variables)與參數(Inputs)宣告
UID 2 积分 2892817 威望 1396440 布 龙e币 1496377 刀 在线时间 13326 小时 注册时间 2009-12-3 最后登录 2024-12-26
變數(Variables)與參數(Inputs)宣告
在我們這篇「2行程式碼完成均線交叉策略」中,很直觀簡略地用兩行表達均線交叉訊號的程式碼如下:
If average(close,5) cross over average(close,20) then buy next bar at market;
If average(close,5) cross below average(close,20) then sellshort next bar at market;
進一步,我們把參數與變數運用進來,把兩行程式碼升等為正規的程式腳本,完成完整的程式碼如下:
使用參數與變數主要有三項優點,一是增加彈性;二是增加程式腳本可讀性;三是提高程式執行效能。以下分別說明如何運用參數與變數。
變數(Variables)
變數是用來儲存特定值,並在程式中需要時可以方便取用的工具。一樣以上面範例說明,我們設了兩個變數MA1(0)及MA2(0),這兩個變數的功能就是儲存兩個計算移動平均線的值:
MA1=Average(Close, Len1);
MA2=Average(Close, Len2);
所以在後面要寫交易邏輯時,只要呼叫MA1及MA2就可以取代原本攏長的函式,如此使程式腳本更顯簡潔易讀,也提高程式執行時的效能。
除了增加程式腳本可讀性,變數也常運用來達成各種操控程式效果的功能,例如想要達到累計數值效果,可以這樣寫:
Vars:N(0);
N=N+1;
講這個範例前,再複習一次,PowerLanguage的腳本是每根K棒執行一次,而在處理變數值,會從預設值開始,隨後每根完成K棒所存的變數值,會做為下一根K棒的變數的初始值,再重新運算,當然如果後面沒有任何相關運算,N就會一直儲存之前的值(最後一次的運算值)。所以上述累加數值計算在從第一根K棒開始其值的變化就會是:
第1根K棒時:N=0+1=1(此時N以預設值0代入)
第2根K棒時:N=1+1=2(此時N以前值1代入)
第3根K棒時:N=2+1=3
第4根K棒時:N=3+1=3
…..以此類推
再舉一個變數進階運用的例子,我們的簡單均線交叉策略再變形,新的進場訊號為,當均線交叉我們並不立即進場,而是以黃金交叉那根K棒高點當作多單進場價,以死亡交叉那根K棒低點當作空單進場價,此時程式該怎麼寫?
Inputs:Len1(5),Len2(20);
Vars:MA1(0),MA2(0),th(0),HH(0),LL(0);
MA1=average(close,Len1);
MA2=average(close,Len2);
if MA1 cross over MA2 then begin
th=1;
HH=high;
end;
if marketposition<>1 and th=1 then buy next bar at HH Stop;
if MA1 cross under MA2 then begin
th=-1;
LL=Low;
end;
if marketposition<>-1 and th=-1 then sellshort next bar at LL Stop;
要讀懂這個程式碼先掌握幾個要點。第一先了解以下兩個語法表達的差異:
1.MA1 Cross over MA2:是一個動作,只有交叉那根K棒符合條件。
2.MA1 > MA2:黃金交叉後每一根K棒都會符合,直到死亡交叉。
程式碼中th這個變數的用法俗稱「開關」,運用廣泛,範例中的「開關」就是作多與作空模式的切換,如上,Cross over/under僅有當根K符合條件,如果希望交叉後的K棒仍具備進場條件,就可以用開關的方式來表達,這個技巧就是直到新的條件或計算變動前,開關都會維持原狀態「開」或是「關」。
再者,我們以HH及LL去存入符合條件的當根K的高或低,只要後續沒有再有新的均線交叉,HH及LL值就會一直保存住我們要的關鍵K高低點,這樣我們就可以在後面一直盯住這個價當作進場點,亦即之後每一根K棒都丟next bar委託單,直到符合條件成交或是多空條件變動為止。
跟參數的預設值一樣,宣告變數並指定預設值,同時也就定義出該變數的型態,變數一樣有數值、邏輯及文字三總變數型態。
此外,為方便程式撰寫,PowerLanguage也提供內建變數,可以不用宣告,直接使用:
1.數值類型變數:Value0、Value1、Value2、Value3….Value99,共100個數值類型變數。
2.邏輯類型變數:Condition0、Condition1、Condition2、Condition3….Condition99,共100個邏輯類型變數。
例如:
Value1=Average(Close, Len1);
Value2=Average(Close, Len2);
參數(Inputs)
使用參數取代一般常數,如此我們可以在程式腳本之外透過更改參數值的方式來調整(在MultiCharts中的屬性設定),大幅提高使用彈性,同時唯有宣告成為參數,該數值才能執行參數最佳化。
此外,不同於變數,參數一旦指定後在整個腳本運算中上就不會再改變。
一樣使用上面均線範例來方便讀者理解。範例中我們設了兩個參數Len1(5)及Len2(20),括弧中數值為預設值,分別是5及20。於是在計算5MA值及20MA值程式碼由:
Average(Close, 5)
Average(Close,20)
變成
Average(Close, Len1)
Average(Close, Len2)
由參數取代固定數值後,我們就可以在MultiCharts裏直接透過指標或訊號的屬性設定去更改參數,例如我們可以把短均線改成10MA,長均線改成30MA,無須再回到PowerLanguage Editor中去改程式碼。
指定參數的預設值同時也定義出該參數的型態,共有三總參數型態:
1.數值型態:Len(5)
2.邏輯型態:NewHigh(False)
3.文字型態:HighAlert(“”)
快速結論:
對於沒有寫程式基礎的人而言,變數或參數的使用需要比較多時間適應,這篇教學文恐怕也難以完整傳達,唯有透過多作範例觀摩與練習,才可漸漸上手。
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
期货论坛 - 版权/免责声明
1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易 。
2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html