1. 程式人生 > 實用技巧 >量化投資_EasyLanguage/PowerLanguage教學課程__【第一篇基礎】__【第三章條件判斷與迴圈語句】

量化投資_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:

Instruction2;
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的語句中有連個跳躍語句分別是BreakContinue,這兩個語句是需要配合其他語句來使用的,其中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/