量化投資_EasyLanguage/PowerLanguage教學課程__【第一篇基礎】__【第三章條件判斷與迴圈語句】
第三章:控制迴圈語句
第一節:陳述式分組語句
陳述式的英文叫做Expression或者叫做Instruction。一個陳述式可以理解為一個分號結束的語句。
1.1 begin...end分組語句
# 語法:
Conditions Begin
Instruction1;
Instruction2;
Instruction3;
End;
# 說明:
如果有多條語句,我們可以通過begin...end把它們建立一組,形成多行的陳述式組。每一個begin...後面一定有一個對應的end。整個陳述式組中的每個語句都要以分號結束。在構建完成陳述式之後的end也需要加上分號結尾。
特別注意的是:如果我們有多個陳述式組,陳述式組和陳述式組之間不需要用分號進行分割
# 示例1:把列印語句用begin...end進行分組。
begin print("1"); print("2"); print("3"); end;
# 示例2:陳述式組和陳述式組之間的迭代。
在下面這個示例中我們可以看到,我們有第一個陳述式組(當然這裡只有一條語句)Buy next bar market,第二個陳述式組sellshort Next bar market;因此我們迭代這兩個陳述式組之間是不需要用end加分號的。
begin...end(陳述式組1) begin...end(陳述式組2);(結束),這點在程式設計時容易把人看懵,記住begin...end是陳述式組就比較容易區分的
If UpTrend Then Begin Buy Next Bar Market;
End
Else Begin SellShort Next Bar Market;
End;
第二節:條件判斷語句1
正像其他程式設計軟體一樣,控制、迴圈語句是組織程式設計語句的兩個及其重要的邏輯。控制語句在EL有兩個,一個是If控制語句和Switch控制語句,可以理解為如果達到什麼條件就會執行什麼樣的語句。
2.1 switch...case控制語句
# 語法:
Switch (E1 or String 1)
Begin
case E1 or String 2 :
Instruction1;
Default:
End;
引數說明: E1,E2 —— 表示式,輸出值為數值;String 1,String 2 —— 表示式,輸出值為字串;
Instruction1,Instruction2 —— 執行程式。
# 說明:
Switch...case和begin...end配合使用形成一個條件判斷順序結構。首先在Switch()中寫入表示式或者字串,由於儲存需要判斷的內容,一般來說用數字來表示比較合適,按照語法的定義,除了用表示式來填充,其他內容表示為字串的形式。配合begin..end是起到對陳述式進行分組的作用。其實Switch...case用的並不是太多。另外default條件是上面的條件都不會執行時,會執行這條語句,這個是可選的。
特別注意:Switch...case必須要和begin...end配合使用,當然如果你只有一條判斷那就不需要了。一般來說多條判斷,是需要用begin...end對陳述式進行分組操作的。
# 示例1:按照編號進行列印(實際效果是不可能列印)
switch("123") begin case "1","2": print("12"); case "3": print("3"); end;
# 示例2:新增一個陳述式,當前圖表的持倉手數小於等於3,並且大於等於1時,買入開倉;持倉手數為4,並且close上傳10根K線close的均價時,全部平倉。
Switch(CurrentContracts) Begin Case 1,2,3:// 此處也可以用 Case 1 to 3: Buy(“B4”) Next Bar At Market; Case 4: If Close Cross Over Average(C[1],10) Then Sell Next Bar At Market; End;
第三節:條件判斷語句2
If...then...else...條件語句是生產中運用最多的條件判斷語句。如果需要判斷多個條件,要結合begin...end陳述式分組語句一起使用。
3.1If...then...else...條件語句:
# 語法:語法分為這麼幾種分別如下:
# 如果我們只有一個判斷條件的話那麼只需要使用 if E then instructon; # 如果我們有一個除此之外的判斷語句的話需要採用下面的形式 If E Then Instruction1 Else Instruction2; # 如果上面的陳述式Instruction不只有2個,而是具有一個陳述式組的話,我們就需要採用begin...end的方式對它們進行分組操作。當然如果只有一個的陳述式的話也是可以。 If E Then Begin Instruction1; Instruction2; End Else Begin Instruction3; Instruction4; End; # 如果不採用除此之外的表達方式,我們只需要判斷巢狀陳述式時,條件同上,去掉Else,用陳述式進行條件迭代即可 If E Then Begin Instruction1; Instruction2; End Begin Instruction3; Instruction4; End; # if判斷語句也可是可以進行巢狀操作 If E1 Then Begin If E2 then Instruction1; End Else Begin Instruction2; End;
# 說明:
【巢狀】:所謂巢狀就是在語句中插入其他的判斷語句形成多層的判斷結構。
# 示例1:兩種簡單的條件判斷形式
if Time=0900 then print("right"); if Time=0900 then print("right") else print("wrong");
# 示例2:嵌入多個陳述表示式:
if Time = 0900 then begin print("Lets go!"); print("Start"); end else begin print("wrong"); end;
# 示例3:巢狀條件表示式,下面藍色表示的位置為在第一組條件表示式中嵌入了另外一套if判斷體。注意巢狀儘量少巢狀,另外使用多條件判斷是,最好採用行對其和縮排的形式。這樣清晰明瞭,便於查詢條件。
if Time = 0900 then begin if Date = 130401 then begin print("You are right"); print("The first if!"); end; end else begin print("wrong"); end;
第四節:迴圈語句1
在MC中一個非常重要的迴圈語句是For迴圈。做為for迴圈就是羅列需要迴圈判斷的條件,直到所有判斷條件都不滿足,跳出整個迴圈。
在For迴圈中,我們要熟悉To和DownTo兩個關鍵字的用法。從字面意思非常理解,是個是正向計數(0,1,2,3...)這樣的迴圈判斷,另一個是逆向遞減計數(3,2,1,0...)這樣的迴圈判斷。迴圈判斷也需要配合Begin...End來一起使用。
4.1 For迴圈:
# 語法:
# 形式1:遞進方式: For Counter=IValue To FValue Begin Instruction1; Instruction2; End; # 形式2:遞減方式: For Counter=IValue DownTo FValue Begin Instruction1; Instruction2; End; Counter——數值變數,用來儲存迴圈計數值。 IValue——數值表示式,指定起始計數值。 FValue——數值表示式,指定最終計數值。 Instruction——陳述式
# 說明:
# 示例:
求前 10 根 Bar 的最高價之和並賦給變數 HighPriceSum: Variable: BarBackNo(0), HighPriceSum(0); For BarBackNo=0 To 9 Begin HighPriceSum=HighPriceSum+High[BarBackNo]; End; 求前 10 根 Bar 的最高價之和並賦給變數 HighPriceSum: Variable: BarBackNo(0), HighPriceSum(0); For BarBackNo=9 DownTo 0 Begin HighPriceSum=HighPriceSum+High[BarBackNo]; End;
第五節:迴圈語句2
while也是一種迴圈表達方式。與For的不同之處在於while迴圈語句中的布林表示式是條件滿足時會一直進行迴圈操作。
5.1 while迴圈語句:
# 語法:
While E Begin
Instruction1;
Instruction2;
Instruction3;
End;
E——布林表示式
Instruction——陳述式
# 說明:
while一個非常重要的點就是,如果布林表示式的條件一直為真的話,while的迴圈語句是不會停止的(也就是陷入死迴圈)。因此我們要使得while迴圈語句在某種條件下,使其布林表示式為假,就會停止迴圈。因此我們通常加入一個計數器來累計迴圈的次數,當次數達到一定程度時,使布林表示式為假這樣就會停止迴圈。另外MC為了方式死迴圈。當while迴圈執行操作5秒仍為停止時,會出現一個執行時錯誤,並停止執行指令碼。
# 示例:加入計數器來停止while迴圈。
// 求最近十根 K 棒的最高價之和並賦值給變數 HighPriceSum: Variable: BarBackNo (0), HighPriceSum(0); BarBackNo= 0; While BarBackNo<10 Begin HighPriceSum=HighPriceSum+High[BarBackNo]; BarBackNo=BarBackNo+1; End;
第六節:一次表達語句
通常來說,指令碼中的程式碼是根據bar資料進行計算的,在實盤的狀態下,一般會tick by tick(逐筆)的計算。如果我們要求指令碼中的某一段或者某一句程式碼只執行一次,僅此而已。那麼就會用到once一次表達語句。
6.1 once一次表達語句:
一次表達語句就是限制後面的陳述式,在整個程式運算中只執行一次。
# 語法:
Once Instruction1; 或 Once <(E)> Begin Instruction2; End; <>內的表示式是可選的。 E——邏輯表示式,True/False 型別。 Instruction——陳述式。
# 說明:
一般once語句,是當做初始化的語句計算語句來使用的。
# 示例:
在程式第一次執行時,把當根 Bar 的開盤價賦給變數 Value1: Once Value1=Open; 等同於:If CurrentBar=1 Then Value1=Open; 當第一次滿足 close<open 時,把當時 Bar 的開盤價賦給變數 Value1: Once (Close<Open) Begin Value1=Open; End;
第七節:布林運算子和邏輯運算子
布林運算子是非真既假的語句,既False和True,在前面的E布林表示式中使用就是這個原理,其布林表示式返回值要麼是False,要麼是True,對應的數字是0和1。
邏輯運算子分And、Or、Not,分別表示邏輯與、邏輯或和邏輯非。
所謂邏輯與:就是And連線的條件,全部為True時,整個條件為真,否則為假。
所謂邏輯或:就是Or連線的條件,如果有一個條件為True,整個條件為真,否則為假。
所謂邏輯非:就是把條件為True的變為條件為假,條件為假的變為條件為真。
6.1 False 和 True:
# 示例:
下面的邏輯判斷式返回值為 False: False And True 下面的邏輯判斷式返回值為 False: 2=1 宣告一個初始值為 false 的邏輯變數 LogicalVar: Variable:LogicalVar(False); 宣告一個預設值為 false 的邏輯 input 型變數 Overnight: Input:Overnight(False);
# 示例2:
下面的邏輯表示式的返回值為 True: True Or False 下面的邏輯表示式的返回值為 True: 2=2 宣告一個初始值為 true 的變數 LogicalVar: Variable:LogicalVar(True); 宣告一個初始值為 true 的 input 型變數 Overnight: Input:Overnight(True);
6.2 邏輯判斷:
# 示例:
2=1 And 2=2 返回值為 False True And True And True 返回值為 True 下面的邏輯運算返回值為 False: 2=1 Or 2>2 下面的邏輯運算返回值為 True: True Or False Or False 將 Condition1 取反後賦值給 Condition2: Condition1 = True; Condition2 = Not Condition1;
第八節:跳躍語句
在MC的語句中有連個跳躍語句分別是Break和Continue,這兩個語句是需要配合其他語句來使用的,其中Break是退出迴圈,跳出整個迴圈語句,Continue表示為結束當前迴圈,再跳到迴圈開頭繼續執行,一般都配合if條件判斷語句來使用。
# 示例1:如果當close等於open價格的時候跳出迴圈,然後列印結果:
For Value1 = 0 To 10 Begin If (close[Value1] = open[Value1]) Then Break; End; If Value1 <= 10 Then print("Open = Close ", "equal value");
# 示例2:列印如果值等於3,返回到迴圈開頭繼續列印:
For Value1 = 0 To 10 begin if value1 <> 3 then print(value1) else continue; end; 輸出結果:遇到3時將不列印,返回到迴圈開頭繼續迴圈 0.00 1.00 2.00 4.00 5.00 6.00 7.00 8.00 9.00 10.00 0.00 ....
第九節:擴充套件內容:交叉判斷表示式
如果在當前 K 棒,數值表示式 A 的畫線和數值表示式 B 的畫 線按指定方向交叉,則返回 True。 Above,Over,Below,Under 參量用來指定交叉的方向。Above 和 Over 可替換,用來表示向上的方向(值從小到大),Below 和 Under 可替換,用來表示向下的方向(值從大到小)。 畫線 A 向上交叉穿過畫線 B 的定義如下:當前 K 棒的 A 值大 於 B 值且滿足下面的其中一個條件: 1、前一根 K 棒中 A 值小於 B 值。 2、前一根或前幾根 K 棒的 A 值等於 B 值,再之前的 K 棒 A 值小於 B 值。 畫線 A 向下交叉穿過畫線 B 的定義如下:當前 K 棒 A 值小於 B 值且滿足下面的其中一個條件: 1、前一根 K 棒中 A 值大於 B 值。 2、前一根或前幾根 K 棒的 A 值等於 B 值,再之前的 K 棒 A 值大於 B 值。,
因此Above與Over是一對,Below與Under是一對
# 示例:
當收盤價上穿 1350.00 時,發出警報: Plot1(Close); If Plot1 Cross Above 1350.50 Then Alert("Price has crossed above 1350.00");
=================================================
之前的文章感謝大家的轉載,希望轉載時請註明出處,本人轉自其它網站的圖表一併感謝,謝謝~!
https://www.cnblogs.com/noah0532/