电竞比分网-中国电竞赛事及体育赛事平台

分享

量化投資

 taozl 2022-09-23 發(fā)布于安徽

第三章:控制循環(huán)語句

第一節(jié):陳述式分組語句

  陳述式的英文叫做Expression或者叫做Instruction。一個陳述式可以理解為一個分號結(jié)束的語句。

1.1 begin...end分組語句

# 語法

Conditions Begin
Instruction1;
Instruction2;
Instruction3;
End;

# 說明

  如果有多條語句,我們可以通過begin...end把它們建立一組,形成多行的陳述式組。每一個begin...后面一定有一個對應(yīng)的end。整個陳述式組中的每個語句都要以分號結(jié)束。在構(gòu)建完成陳述式之后的end也需要加上分號結(jié)尾。

  特別注意的是:如果我們有多個陳述式組,陳述式組和陳述式組之間不需要用分號進(jìn)行分割

# 示例1:把打印語句用begin...end進(jìn)行分組。

begin
    print('1');
    print('2');
    print('3');
end;

# 示例2:陳述式組和陳述式組之間的迭代。

  在下面這個示例中我們可以看到,我們有第一個陳述式組(當(dāng)然這里只有一條語句)Buy next bar market,第二個陳述式組sellshort Next bar market;因此我們迭代這兩個陳述式組之間是不需要用end加分號的。

  begin...end(陳述式組1)  begin...end(陳述式組2);(結(jié)束),這點(diǎn)在編程時容易把人看懵,記住begin...end是陳述式組就比較容易區(qū)分的

If UpTrend Then Begin Buy Next Bar Market;EndElse Begin SellShort Next Bar Market;End;

第二節(jié):條件判斷語句1

  正像其他編程軟件一樣,控制、循環(huán)語句是組織編程語句的兩個及其重要的邏輯。控制語句在EL有兩個,一個是If控制語句和Switch控制語句,可以理解為如果達(dá)到什么條件就會執(zhí)行什么樣的語句。

2.1 switch...case控制語句

# 語法:

復(fù)制代碼

Switch (E1 or String 1)
Begin
case E1 or String 2 :
Instruction1;
Default:
Instruction2;
End;


參數(shù)說明: E1,E2 —— 表達(dá)式,輸出值為數(shù)值;String 1,String 2 —— 表達(dá)式,輸出值為字符串;
Instruction1,Instruction2 —— 執(zhí)行程序。

復(fù)制代碼

# 說明:

   Switch...case和begin...end配合使用形成一個條件判斷順序結(jié)構(gòu)。首先在Switch()中寫入表達(dá)式或者字符串,由于存儲需要判斷的內(nèi)容,一般來說用數(shù)字來表示比較合適,按照語法的定義,除了用表達(dá)式來填充,其他內(nèi)容表示為字符串的形式。配合begin..end是起到對陳述式進(jìn)行分組的作用。其實(shí)Switch...case用的并不是太多。另外default條件是上面的條件都不會執(zhí)行時,會執(zhí)行這條語句,這個是可選的。

  特別注意:Switch...case必須要和begin...end配合使用,當(dāng)然如果你只有一條判斷那就不需要了。一般來說多條判斷,是需要用begin...end對陳述式進(jìn)行分組操作的。

# 示例1:按照編號進(jìn)行打?。▽?shí)際效果是不可能打?。?/p>

復(fù)制代碼
switch('123')
begincase '1','2':
        print('12');case '3':
        print('3');
end;
復(fù)制代碼

# 示例2:添加一個陳述式,當(dāng)前圖表的持倉手?jǐn)?shù)小于等于3,并且大于等于1時,買入開倉;持倉手?jǐn)?shù)為4,并且close上傳10根K線close的均價時,全部平倉。

復(fù)制代碼
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;
復(fù)制代碼

第三節(jié):條件判斷語句2

  If...then...else...條件語句是生產(chǎn)中運(yùn)用最多的條件判斷語句。如果需要判斷多個條件,要結(jié)合begin...end陳述式分組語句一起使用。

3.1 If...then...else...條件語句:

# 語法:語法分為這么幾種分別如下:

復(fù)制代碼
# 如果我們只有一個判斷條件的話那么只需要使用if E then instructon;

# 如果我們有一個除此之外的判斷語句的話需要采用下面的形式
If E Then Instruction1 Else Instruction2;

# 如果上面的陳述式Instruction不只有2個,而是具有一個陳述式組的話,我們就需要采用begin...end的方式對它們進(jìn)行分組操作。當(dāng)然如果只有一個的陳述式的話也是可以。
If E Then 
Begin
    Instruction1;
    Instruction2;
End 
      Else
Begin
    Instruction3;
    Instruction4;
End;   

# 如果不采用除此之外的表達(dá)方式,我們只需要判斷嵌套陳述式時,條件同上,去掉Else,用陳述式進(jìn)行條件迭代即可
If E Then 
Begin
    Instruction1;
    Instruction2;
End 
Begin
    Instruction3;
    Instruction4;
End;   

# if判斷語句也可是可以進(jìn)行嵌套操作
If E1 Then 
Begin
    If E2 then Instruction1;
End 
    Else
Begin
    Instruction2;
End;
復(fù)制代碼

# 說明

【嵌套】:所謂嵌套就是在語句中插入其他的判斷語句形成多層的判斷結(jié)構(gòu)。

# 示例1:兩種簡單的條件判斷形式

if Time=0900 then print('right');if Time=0900 then print('right') else print('wrong');

# 示例2:嵌入多個陳述表達(dá)式:

復(fù)制代碼
if Time = 0900 then 
    begin
        print('Lets go!');
        print('Start');
    endelsebegin
        print('wrong');
    end;
復(fù)制代碼

# 示例3:嵌套條件表達(dá)式,下面藍(lán)色表示的位置為在第一組條件表達(dá)式中嵌入了另外一套if判斷體。注意嵌套盡量少嵌套,另外使用多條件判斷是,最好采用行對其和縮進(jìn)的形式。這樣清晰明了,便于查找條件。

復(fù)制代碼
if Time = 0900 then 
    beginif Date = 130401 then 
            begin
                print('You are right');
                print('The first if!');
            end;endelsebegin
        print('wrong');
    end;
復(fù)制代碼

第四節(jié):循環(huán)語句1

  在MC中一個非常重要的循環(huán)語句是For循環(huán)。做為for循環(huán)就是羅列需要循環(huán)判斷的條件,直到所有判斷條件都不滿足,跳出整個循環(huán)。

  在For循環(huán)中,我們要熟悉To和DownTo兩個關(guān)鍵字的用法。從字面意思非常理解,是個是正向計數(shù)(0,1,2,3...)這樣的循環(huán)判斷,另一個是逆向遞減計數(shù)(3,2,1,0...)這樣的循環(huán)判斷。循環(huán)判斷也需要配合Begin...End來一起使用。

4.1 For循環(huán):

# 語法

復(fù)制代碼
# 形式1:遞進(jìn)方式:
For Counter=IValue To FValue Begin
Instruction1;
Instruction2;
End;


# 形式2:遞減方式:
For Counter=IValue DownTo FValue Begin
Instruction1;
Instruction2;
End;

Counter——數(shù)值變量,用來存儲循環(huán)計數(shù)值。
IValue——數(shù)值表達(dá)式,指定起始計數(shù)值。
FValue——數(shù)值表達(dá)式,指定最終計數(shù)值。
Instruction——陳述式
復(fù)制代碼

# 說明

# 示例

復(fù)制代碼
求前 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;
復(fù)制代碼

第五節(jié):循環(huán)語句2

  while也是一種循環(huán)表達(dá)方式。與For的不同之處在于while循環(huán)語句中的布爾表達(dá)式是條件滿足時會一直進(jìn)行循環(huán)操作。

5.1 while循環(huán)語句:

# 語法

復(fù)制代碼
While E Begin
Instruction1;
Instruction2;
Instruction3;
End;

E——布爾表達(dá)式
Instruction——陳述式
復(fù)制代碼

# 說明

  while一個非常重要的點(diǎn)就是,如果布爾表達(dá)式的條件一直為真的話,while的循環(huán)語句是不會停止的(也就是陷入死循環(huán))。因此我們要使得while循環(huán)語句在某種條件下,使其布爾表達(dá)式為假,就會停止循環(huán)。因此我們通常加入一個計數(shù)器來累計循環(huán)的次數(shù),當(dāng)次數(shù)達(dá)到一定程度時,使布爾表達(dá)式為假這樣就會停止循環(huán)。另外MC為了方式死循環(huán)。當(dāng)while循環(huán)執(zhí)行操作5秒仍為停止時,會出現(xiàn)一個執(zhí)行時錯誤,并停止執(zhí)行腳本。

# 示例:加入計數(shù)器來停止while循環(huán)。

復(fù)制代碼
// 求最近十根 K 棒的最高價之和并賦值給變量 HighPriceSum:
Variable: BarBackNo (0), HighPriceSum(0);
BarBackNo= 0;
While BarBackNo<10 Begin
HighPriceSum=HighPriceSum+High[BarBackNo];
BarBackNo=BarBackNo+1;
End;
復(fù)制代碼

第六節(jié):一次表達(dá)語句

  通常來說,腳本中的代碼是根據(jù)bar數(shù)據(jù)進(jìn)行計算的,在實(shí)盤的狀態(tài)下,一般會tick by tick(逐筆)的計算。如果我們要求腳本中的某一段或者某一句代碼只執(zhí)行一次,僅此而已。那么就會用到once一次表達(dá)語句。

6.1 once一次表達(dá)語句

   一次表達(dá)語句就是限制后面的陳述式,在整個程序運(yùn)算中只執(zhí)行一次。

# 語法

復(fù)制代碼
Once Instruction1;
或
Once <(E)> Begin
Instruction2;
End;<>內(nèi)的表達(dá)式是可選的。

E——邏輯表達(dá)式,True/False 類型。
Instruction——陳述式。
復(fù)制代碼

# 說明

  一般once語句,是當(dāng)做初始化的語句計算語句來使用的。

# 示例

復(fù)制代碼
在程序第一次執(zhí)行時,把當(dāng)根 Bar 的開盤價賦給變量 Value1:
Once Value1=Open;
等同于:If CurrentBar=1 Then Value1=Open;
當(dāng)?shù)谝淮螡M足 close<open 時,把當(dāng)時 Bar 的開盤價賦給變量
Value1:
Once (Close<Open) Begin
Value1=Open;
End;
復(fù)制代碼

第七節(jié):布爾運(yùn)算符和邏輯運(yùn)算符

  布爾運(yùn)算符是非真既假的語句,既False和True,在前面的E布爾表達(dá)式中使用就是這個原理,其布爾表達(dá)式返回值要么是False,要么是True,對應(yīng)的數(shù)字是0和1。

  邏輯運(yùn)算符分And、Or、Not,分別表示邏輯與、邏輯或和邏輯非。

  所謂邏輯與:就是And連接的條件,全部為True時,整個條件為真,否則為假。

  所謂邏輯或:就是Or連接的條件,如果有一個條件為True,整個條件為真,否則為假。

  所謂邏輯非:就是把條件為True的變?yōu)闂l件為假,條件為假的變?yōu)闂l件為真。

6.1 False 和 True

 # 示例

復(fù)制代碼
下面的邏輯判斷式返回值為 False:
False And True
下面的邏輯判斷式返回值為 False:2=1聲明一個初始值為 false 的邏輯變量 LogicalVar:
Variable:LogicalVar(False);
聲明一個默認(rèn)值為 false 的邏輯 input 型變量 Overnight:
Input:Overnight(False);
復(fù)制代碼

# 示例2

復(fù)制代碼
下面的邏輯表達(dá)式的返回值為 True:
True Or False
下面的邏輯表達(dá)式的返回值為 True:2=2聲明一個初始值為 true 的變量 LogicalVar:
Variable:LogicalVar(True);
聲明一個初始值為 true 的 input 型變量 Overnight:
Input:Overnight(True);
復(fù)制代碼

6.2 邏輯判斷:

# 示例

復(fù)制代碼
2=1 And 2=2 返回值為 False
True And True And True 返回值為 True

下面的邏輯運(yùn)算返回值為 False:2=1 Or 2>2下面的邏輯運(yùn)算返回值為 True:
True Or False Or False

將 Condition1 取反后賦值給 Condition2:
Condition1 = True;
Condition2 = Not Condition1;
復(fù)制代碼

第八節(jié):跳躍語句

  在MC的語句中有連個跳躍語句分別是BreakContinue,這兩個語句是需要配合其他語句來使用的,其中Break是退出循環(huán),跳出整個循環(huán)語句,Continue表示為結(jié)束當(dāng)前循環(huán),再跳到循環(huán)開頭繼續(xù)執(zhí)行,一般都配合if條件判斷語句來使用。

# 示例1:如果當(dāng)close等于open價格的時候跳出循環(huán),然后打印結(jié)果:

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,返回到循環(huán)開頭繼續(xù)打?。?/p>

復(fù)制代碼
For Value1 = 0 To 10 
    beginif value1 <> 3 then print(value1) else continue;
    end;

輸出結(jié)果:遇到3時將不打印,返回到循環(huán)開頭繼續(xù)循環(huán)0.00
   1.00
   2.00
   4.00
   5.00
   6.00
   7.00
   8.00
   9.00
  10.00
   0.00....
復(fù)制代碼

第九節(jié):擴(kuò)展內(nèi)容:交叉判斷表達(dá)式

  如果在當(dāng)前 K 棒,數(shù)值表達(dá)式 A 的畫線和數(shù)值表達(dá)式 B 的畫 線按指定方向交叉,則返回 True。 Above,Over,Below,Under 參量用來指定交叉的方向。Above 和 Over 可替換,用來表示向上的方向(值從小到大),Below 和 Under 可替換,用來表示向下的方向(值從大到?。?畫線 A 向上交叉穿過畫線 B 的定義如下:當(dāng)前 K 棒的 A 值大 于 B 值且滿足下面的其中一個條件: 1、前一根 K 棒中 A 值小于 B 值。 2、前一根或前幾根 K 棒的 A 值等于 B 值,再之前的 K 棒 A 值小于 B 值。 畫線 A 向下交叉穿過畫線 B 的定義如下:當(dāng)前 K 棒 A 值小于 B 值且滿足下面的其中一個條件: 1、前一根 K 棒中 A 值大于 B 值。 2、前一根或前幾根 K 棒的 A 值等于 B 值,再之前的 K 棒 A 值大于 B 值。,

  因此Above與Over是一對,Below與Under是一對

# 示例

當(dāng)收盤價上穿 1350.00 時,發(fā)出警報:
Plot1(Close);
If Plot1 Cross Above 1350.50 Then
Alert('Price has crossed above 1350.00');

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多