分支(Branch)
if-else和switch分支語法,讓程式可以決定執行方向,當滿足某些條件時,執行某些指令,否則執行其他指令。
這裡分成兩個步驟:
第一個步驟,是將要判斷(滿足)的條件,利用and、or等邏輯運算子(Logical Operator)組成邏輯陳述句(Logical Expression)。
第二個步驟,是將邏輯陳述句(Logical Expression)搭配 if-else、switch語法決定要執行的方向。
邏輯運算子(Logical Operator)
PowerLanguage提供了以下的邏輯運算子組成邏輯陳述句
邏輯運算子 | 意義 |
and | 且 |
or | 或 |
not | 否定 |
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
= | 等於 |
<> | 不等於 |
cross above/ | 向上穿越,cross above 等於cross over ,兩者可替換 |
cross below/cross under | 向下穿越,cross below 等於cross under ,兩者可替換 |
除了cross above和cross 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_Instruction或False_Instruction只能有一行, 不用加begin/end。
[]
表示非必要,else條件如果不需要,可以刪除。
if Logical_Expression then True_Instruction
[else False_Instruction];
if-else 多行指令語法
True_Instruction或False_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都沒有滿足,則執行default的Default_Instructions
。[]
表示非必要,default情況如果不需要,可以刪除。
PowerLanguage與其他程式語言不同,並不需要額外加break來跳到switch的end;。
程式在執行完Case_Instructions後,會自動跳到的end;結束switch。
switch ( Expression )
begin
case Case_Expression: Case_Instructions;
[default: Default_Instructions;]
end;
Case_Expression
Case_Expression的型別必須和陳述句回傳值的型別一致,
Case_Expression可以是一個值、多個值、一個範圍或是和邏輯運算子一起使用。
Example
Switch
的var1
的值為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;
Switch
的str1
的值為"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