|
第三章:控制循環(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控制語句 # 語法: Switch (E1 or String 1) 參數(shù)說明: E1,E2 —— 表達(dá)式,輸出值為數(shù)值;String 1,String 2 —— 表達(dá)式,輸出值為字符串; # 說明: 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> # 示例2:添加一個陳述式,當(dāng)前圖表的持倉手?jǐn)?shù)小于等于3,并且大于等于1時,買入開倉;持倉手?jǐn)?shù)為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; 第三節(jié):條件判斷語句2 If...then...else...條件語句是生產(chǎn)中運(yùn)用最多的條件判斷語句。如果需要判斷多個條件,要結(jié)合begin...end陳述式分組語句一起使用。 3.1 If...then...else...條件語句: # 語法:語法分為這么幾種分別如下: # 如果我們只有一個判斷條件的話那么只需要使用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; # 說明: 【嵌套】:所謂嵌套就是在語句中插入其他的判斷語句形成多層的判斷結(jié)構(gòu)。 # 示例1:兩種簡單的條件判斷形式 if Time=0900 then print('right');if Time=0900 then print('right') else print('wrong');# 示例2:嵌入多個陳述表達(dá)式: # 示例3:嵌套條件表達(dá)式,下面藍(lán)色表示的位置為在第一組條件表達(dá)式中嵌入了另外一套if判斷體。注意嵌套盡量少嵌套,另外使用多條件判斷是,最好采用行對其和縮進(jìn)的形式。這樣清晰明了,便于查找條件。 if Time = 0900 then
beginif Date = 130401 then
begin
print('You are right');
print('The first if!');
end;endelsebegin
print('wrong');
end;第四節(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): # 語法: # 形式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——陳述式 # 說明: # 示例: 求前 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; 第五節(jié):循環(huán)語句2 while也是一種循環(huán)表達(dá)方式。與For的不同之處在于while循環(huán)語句中的布爾表達(dá)式是條件滿足時會一直進(jìn)行循環(huán)操作。 5.1 while循環(huán)語句: # 語法: # 說明: 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)。 // 求最近十根 K 棒的最高價之和并賦值給變量 HighPriceSum: Variable: BarBackNo (0), HighPriceSum(0); BarBackNo= 0; While BarBackNo<10 Begin HighPriceSum=HighPriceSum+High[BarBackNo]; BarBackNo=BarBackNo+1; End; 第六節(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í)行一次。 # 語法: Once Instruction1; 或 Once <(E)> Begin Instruction2; End;<>內(nèi)的表達(dá)式是可選的。 E——邏輯表達(dá)式,True/False 類型。 Instruction——陳述式。 # 說明: 一般once語句,是當(dāng)做初始化的語句計算語句來使用的。 # 示例: 在程序第一次執(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; 第七節(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: # 示例: 下面的邏輯判斷式返回值為 False: False And True 下面的邏輯判斷式返回值為 False:2=1聲明一個初始值為 false 的邏輯變量 LogicalVar: Variable:LogicalVar(False); 聲明一個默認(rèn)值為 false 的邏輯 input 型變量 Overnight: Input:Overnight(False); # 示例2: 下面的邏輯表達(dá)式的返回值為 True: True Or False 下面的邏輯表達(dá)式的返回值為 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 下面的邏輯運(yùn)算返回值為 False:2=1 Or 2>2下面的邏輯運(yùn)算返回值為 True: True Or False Or False 將 Condition1 取反后賦值給 Condition2: Condition1 = True; Condition2 = Not Condition1; 第八節(jié):跳躍語句 在MC的語句中有連個跳躍語句分別是Break和Continue,這兩個語句是需要配合其他語句來使用的,其中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> 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.... 第九節(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'); |
|
|