認識Powerlanguage

Multicharts 的語法編輯器稱為powerlanguage,是一種用於編寫交易策略的程式語言,讓我們輕易把交易邏輯轉換成程式的語言 並透過MC回測並執行。Powerlanguage 語法簡潔易學,即使沒有程式設計經驗的人也能很快上手。

Powerlanguage 是一種用於編寫交易策略的程式語言,適用在 MultiCharts 交易軟體開發。Powerlanguage 語法簡潔易學,即使沒有程式設計經驗的人也能很快上手。

Powerlanguage 語法由以下幾個基本要素組成:

🔹 關鍵字:Powerlanguage 中內建的函數和指令,用於完成各種操作。
🔹 變數:用於儲存資料的容器。
🔹 運算符號:用於進行數值運算和邏輯判斷。
🔹 控制流程語句:用於控制程式的執行順序。

在 PowerLanguage 中已經建立好常用的內建保留字,方便直接使用:

  • 和交易相關字例如(Buy、Sell、Stop、Limit 等)。
  • 和K棒相關字例如(Open、High、Low、Close等)。
  • 日期時間相關字例如(Year、Month、Date等)。
  • 其他保留字例如(plot、entryprice等)。
  • 內建指標函數例如(Average、BollingerBand等)。

一開始我們會宣告外部變數(Input) ,這是可以從外部調整參數的函數,若我們要參數最佳化,則需要將參數宣告成input

內部的變數稱之為variable或是簡稱vars,在 var 之後給定變數名稱,並以小括號「()」宣告要代入的初始預設值

變數的種類:數值、文字串、布林值

1. 數值

數值包含正數、負數、小數、分數等等,上方的均線程式碼宣告的變數類型就是數值。PowerLanguage也有已經內建好的變數 value1~value99,不用宣告就可直接使用。

2. 文字串

文字串必須要用 “文字” 夾住,預設為淺綠色。因為文字無法進行數學運算,大多使用在訊息傳達。

3. 布林值

布林值為 True 與 False。 判斷 不是 True 就是 False。

和數值一樣也有內建的變數 condition1~condition99,一樣不用宣告可以直接使用。像是判斷收盤價是否有大於均線,就是一個布林值的運用。

在 MultiCharts 當中,K棒價格開高低收就是Open  High  Low  Close。大部分的技術指標也是從K棒的價格加入其他公式演變而來

在寫策略的時候常使用到的判斷條件。時間可細分為年、月、日、分、時。在討論時間相關內建字之前,必須先了解在 MultiCharts PowerLanguage 的架構中,日期與時間的顯示方式。

MultiCharts的買賣指令共四種,分別為多單的買進Buy和多單的平倉Sell;空單的買進SellShort和空單的平倉BuyToCover

market 為市價單,會立即成交
limit 為限價單,當價格來到時才會成交
stop 為觸價單,或稱為停損單

MarketPosition 是顯示部位方向,多單為正1,空單為負1,空手為0; CurrentContracts 是顯示目前持有的口數

這幾個內建保留字用意分別如下

SetStopLoss 固定停損金額 ; SetStopLoss(20000)則表示停損金額為20000元
SetProfitTarget固定停利金額; SetProfitTarget(20000)則表示停利金額為20000元
setdollartrailing 獲利回吐一定金額平倉;setdollartrailing(20000) 表示獲利從最大值回吐20000元(相當於台指期100點) 便立刻平倉
setpercenttrailing 獲利回吐一定百分比平倉;setpercenttrailing(20000,20) 表示當獲利達到20000以上 若拉回20%立即出場
SetBreakEven  獲利達到一定金額 拉回到成本價平倉 ;SetBreakEven(20000)表示當獲利超過20000元則拉會到進場價平倉
SetExitOnClose 收盤價多單或空單都立即平倉

在powerlanguage裡面有幾個常用的基本指令 ,90%以上的流程控制都是用這些指令

這是最常用的指令; 如果下雨了…就要撐傘; 如果遇到紅燈…就要停車.;如果穿越10日均線就買進一口多單…..

範例  if close cross over average(close,10) then buy next bar at market…….

有一個begin 就需要對應一個 end ,需要一起搭配使用 包含一至多行的陳述式 範例如下

if marketposition<>0 and time>1330 then begin
  sell next bar at market
buytocover next bar at market
end;

和 if … then不同的是 switch…case  針對數值或字串比較,if … then針對布林值做比較 範例如下:

switch(bartype)  begin
  case1: plot1(average(c,close10));
case2: plot1(average(c,close20));
case3: plot1(average(c,close60));
end;

從什麼時候開始到什麼時候必須做什麼事情…. 範例:

var0 = 0 ;
for Value1 = 0 to Len – 1
begin
var0 = var0 + PriceValue[Value1] ;
end ;
Summation = var0 ;

[IntrabarOrderGeneration=true]{當根K棒內交易模式 True or False}

input: {用來設定可外部調整的參數}
var: upline(high),downline(low); {自訂變數}

if date<>date[1] then begin
upline=highD(0); {定義每天支撐壓力上下的軌道}
downline=lowD(0);
end;

{用condition設定進場交易的時間以及開盤的漲跌幅當作濾網 }
condition1=openD(0)>=closeD(1);
condition2=openD(0)<=closeD(1)n; condition3=time>=0900 and time<=1300 and marketposition=0 and close>upline;
condition4=time>=0900 and time<=1300 and marketposition=0 and close<downline;

{符合條件時進場作多或做空}
if condition1 and condition3 then buy next bar at market;
if condition2 and condition4 then sellshort next bar at market;

{多單的停損}
if marketposition=1 and close cross under downline then sell next bar at market;

{空單的停損}
if marketposition=-1 and close crosses over upline then buytocover next bar at market;

{設定收盤前最後出場的時間}
if time>1330 then buytocover next bar at market;
if time>1330 then sell next bar at market;

寫好策略之後按F3編譯,確定編譯成功 就可以套用到multicharts的主圖跑跑看回測的績效了。這是一個簡單的順勢突破策略

最後就是編譯完成 套用到Multicharts圖表上,以上為簡單的程式語法範例

分享你的喜愛