: | : | :期货程序化 | :期货程序化研究 | :期货量化学习 | :期货量化 |
返回列表 发帖

變數(Variables)與參數(Inputs)宣告

變數(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;

進一步,我們把參數與變數運用進來,把兩行程式碼升等為正規的程式腳本,完成完整的程式碼如下:
微信截图_20181123144547.png
2018-11-23 14:48


使用參數與變數主要有三項優點,一是增加彈性;二是增加程式腳本可讀性;三是提高程式執行效能。以下分別說明如何運用參數與變數。

變數(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委託單,直到符合條件成交或是多空條件變動為止。

微信截图_20181123144648.png
2018-11-23 14:49


跟參數的預設值一樣,宣告變數並指定預設值,同時也就定義出該變數的型態,變數一樣有數值、邏輯及文字三總變數型態。

此外,為方便程式撰寫,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中去改程式碼。

微信截图_20181123144742.png
2018-11-23 14:49


指定參數的預設值同時也定義出該參數的型態,共有三總參數型態:

1.數值型態:Len(5)
2.邏輯型態:NewHigh(False)
3.文字型態:HighAlert(“”)



快速結論:
對於沒有寫程式基礎的人而言,變數或參數的使用需要比較多時間適應,這篇教學文恐怕也難以完整傳達,唯有透過多作範例觀摩與練習,才可漸漸上手。

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易
  2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
  3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
  4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

返回列表