MultiCharts | PowerLanguage語法教學 | CH4:分支(Branch)

分支(Branch)

if-elseswitch分支語法,讓程式可以決定執行方向,當滿足某些條件時,執行某些指令,否則執行其他指令。

這裡分成兩個步驟:
第一個步驟,是將要判斷(滿足)的條件,利用andor邏輯運算子(Logical Operator)組成邏輯陳述句(Logical Expression)。
第二個步驟,是將邏輯陳述句(Logical Expression)搭配 if-elseswitch語法決定要執行的方向。

邏輯運算子(Logical Operator)

PowerLanguage提供了以下的邏輯運算子組成邏輯陳述句

邏輯運算子意義
and
or
not否定
>大於
<小於
>=大於等於
<=小於等於
=等於
<>不等於
cross above/cross over向上穿越,cross above等於cross over,兩者可替換
cross below/cross under向下穿越,cross below等於cross under,兩者可替換

除了cross abovecross below外,其他邏輯運算子的意義都和數學的邏輯意義相同。

A cross above B,A向上穿越B的定義如下:

  • 在當根K棒,A的值大於B的值,且在前一根K棒,A的值小於B的值。
  • 在當根K棒,A的值大於B的值,但是前一根或多根K棒,A的值等於B的值,則在這些等於的K棒前,A的值需小於B的值。

A cross below B,A向下穿越B的定義如下:

  • 在當根K棒,A的值小於B的值,且在前一根K棒,A的值大於B的值。
  • 在當根K棒,A的值小於B的值,但是前一根或多根K棒,A的值等於B的值,則在這些等於的K棒前,A的值需大於B的值。

邏輯陳述句 (Logical Expression)

邏輯陳述句是回傳值為真假值型別的陳述句。
例如:
5<3: 為邏輯陳述句,5小於3,回傳值為false
8<>9: 為邏輯陳述句,8不等於9,回傳值為true
8<>9 and 5<3: 為邏輯陳述句, 8不等於9 且 5小於3,回傳值為false

if-else

if-else讓程式可以根據邏輯陳述句(Logical_Expression)的結果,選擇要執行哪一條路。
如果邏輯陳述句(Logical_Expression)的結果為true,則執行True_Instruction的指令,如果是false,則執行False_Instruction

if-else分成單行指令語法多行指令語法

if-else 單行指令語法

True_InstructionFalse_Instruction只能有一行, 不用加begin/end

[]表示非必要,else條件如果不需要,可以刪除。

if Logical_Expression then True_Instruction 
[else False_Instruction];

if-else 多行指令語法

True_InstructionFalse_Instruction可以是一行也可以是多行,必須要加begin/end將它們包起來。

[]表示非必要,else條件如果不需要,可以刪除。

最後一個end需要加分號(;),其餘的end並不需要加分號(;)。

if Logical_Expression then begin 
  True_Instruction_1;
  True_Instruction_2;
  ...
end
[else begin
  False_Instruction_1;
  False_Instruction_2;
  ...
end];

else if 語法

if-else除了決定要執行true指令或是false指令的兩路語法,還可以搭配使用else if,判斷多個邏輯陳述句,決定要執行哪一路的多路語法。

最後一個end需要加分號(;),其餘的end並不需要加分號(;)。

[]表示非必要,else條件如果不需要,可以刪除。

if Logical_Expression_1 then begin 
  True_Instruction_1;
  ...
end
else if Logical_Expression_2 then begin
  True_Instruction_2;
  ...
end
.
.
.
else if Logical_Expression_N then begin
  True_Instruction_N;
  ...
end
[else begin
  Instruction_For_All_False;
  ...
end];

Example

If UpTrend = False Then Sell Next Bar Market;
If UpTrend = True Then Begin
  Buy Next Bar Market;
End
Else Begin
   SellShort Next Bar Market;
End;
Variables:
	EMA(0);
EMA = XAverage(Close, 20);
if Close > EMA then begin
	Print("Close is above the EMA");
end else if (Close < EMA) then begin
	Print("Close is below the EMA");
end else 
	Print("Close is equal to the EMA");

switch

switch指令透過陳述句(Expression)的回傳值來決定要執行的指令,陳述句的回傳值是數值、字串或真假值型別。

switch 語法

當程式執行到switch時,會執行以下動作:
1. 將Expression的回傳值和每一個Case_Expression比對,如果滿足Case_Expression的條件,則執行Case_Instructions
2. 如果所有的Case_Expression都沒有滿足,則執行defaultDefault_Instructions
[]表示非必要,default情況如果不需要,可以刪除。

PowerLanguage與其他程式語言不同,並不需要額外加break來跳到switchend;
程式在執行完Case_Instructions後,會自動跳到的end;結束switch

switch ( Expression )
begin
    case Case_Expression:  Case_Instructions;
    [default: Default_Instructions;]
end;

Case_Expression

Case_Expression型別必須和陳述句回傳值的型別一致,

Case_Expression可以是一個值多個值一個範圍或是和邏輯運算子一起使用

Example

Switchvar1的值為8,滿足Case 4 to 8,因此執行Print("if 4 to 8");

var: var1(5+3);
Switch(var1) 
Begin
   Case 1, 2, 3: //多個值: 1, 2, 3
	Print("if 1, 2, 3");

   Case 4 to 8: //一個範圍: 4到8
	Print("if 4 to 8");

   Case 9 to 15, 20: //9到15或是20
	Print("if 9 to 10, 20");

   Case is > 40: //大於40,is是skip word,增加可讀性,可省略
	Print("if is > 40");

   Default:
	Print("if default");
End;

Switchstr1的值為"I",滿足Case "H", is >= "I",因此執行Print("if H, is >= I");

var: str1("I");
Switch(str1) 
Begin
   Case "A", "B", "C": //多個值: A, B, C
	Print("if A or B or C");

   Case "D" to "G": //一個範圍: D到G
	Print("if D to G");

   Case "H", is >= "I": //H或大於等於I
	Print("if H, is >= I");

   Default:
	Print("if default");
End;

Reference

https://www.multicharts.com/trading-software/index.php?title=Category:Comparisons_and_Loops

https://www.multicharts.com/trading-software/index.php?title=Above

https://www.multicharts.com/trading-software/index.php?title=Below

https://www.multicharts.com/trading-software/index.php?title=If

https://www.multicharts.com/trading-software/index.php?title=Switch

發佈留言