陣列

陣列有很多內建函式可以使用,打上Arr就會跳出很多關於陣列可以使用的函數。

不同的資料型態都可以定義成陣列,一連串的資料,變數名稱後加上中括號[],看資料大小是多少填在中括號裡面,如果中括號沒有數值,但是有設定初始值這樣也可以,看你有幾個數值,陣列就是多大。

以下範例定義整數陣列,存取陣列都是從0開始,大小5的話,只能索引0到4。

如果存取超過陣列大小,會發生嚴重的錯誤,之後的程式碼就不會在執行,要非常小心,
ArraySize()可以知道陣列大小,最多存取 ArraySize() – 1的資料。

array out of range in ……

動態陣列

一開始陣列大小為0,直到設定陣列大小ArrayResize()之後,陣列才有大小,只有動態陣列才可以使用ArrayResize()。SetIndexBuffer()指標陣列不能使用ArrayResize(),系統會自行控制陣列大小。

設定陣列資料為 i + 5,並且印出數值。

也可以再次呼叫ArraySize() 改變陣列大小。

不使用動態陣列時記得釋放記憶體

時間序列

預定義變數

MT4程式交易支援一組預先定義的變數,反映當前價格的狀態,這些變數都是常量無法被修改。

輸入Ask然後在變數上面按F1說明,可以很快的跳到說明 The predefined Variables,裡面有所有的預定義變數。

比較常用到的一些變數,最新的收盤價=現價,每次收到的數值都不一樣喔。

買賣價跟最小跳動點的搭配,在程式下單的時候非常重要。

提供程式讓大家研究,需放在Scripts資料夾。
預定義變數.mq4

迴圈

  • for 通常叫做計數迴圈
  • while

一個簡單的for迴圈範例,for 裡面可以放三個表達式,通常會這樣放
for (初始化 ; 條件 ; 遞增),當然也可以不用照這個邏輯放。

只要中間的表達式為true,程式就會執行下去,執行順序為:
1 只會執行一次
2 條件成立才會往下執行
3
4

回到 2 然後往下順序 3, 4

輸出 0 到 9

for表達式裡定義的變數有效範圍就只有在for迴圈裡面,不然會出現錯誤訊息 undeclared identifier

while(條件),只要條件成立就會一直跑,要小心不要變成無窮迴圈,cpu就會拉高畫面卡住。

控制流程

  • continue 繼續
  • break 結束

continue 繼續,不是繼續執行下面程式的意思,是跳過接下來的程式碼,開始新的循環。
迴圈裡的Print(“continue”),一次都沒有印出來。

break 結束迴圈,之後的循環 i=1, i=2, ….. 都不會執行了。

搭配 if

i == 5 時 continue,之後的程式碼不執行,5就沒有印出來。

i == 5 時 break,跳出for迴圈,5, 6, 7, ….都不會印出來。

無窮迴圈

只要把迴圈裡面的 break 拿掉,程式就會一直印出Log 永不停止。

for & while 迴圈都可以互相取代,看使用的場景哪一個比較方便,之後會使用到輪詢訂單就會再討論到 for迴圈。

以下提供程式給大家研究,需要放在scripts資料夾。
迴圈.mq4

條件判斷

程式交易,就是一連串的判斷。
關於程式交易非常重要的部分,但也沒有這麼複雜。

  • 達到條件,買進 or 賣出。
  • 虧損特定點數,停損 or 凹單。
  • 獲利特定點數,停利 or 加碼。

if 條件判斷在非零值,會執行下面區段的程式碼。

在輸出的log裏面,false0 就沒有執行。

字元 A 也是非零值,以下程式就會被執行,當有多行程式碼需要執行時,需要用{ }包成區段,在這裡面的程式碼就都會執行。

關係運算 + if-else

  • > 大於
  • < 小於
  • == 等於
  • != 不等於

以下示範透過兩個變數條件判斷

A大於B的情況,A也不等於B。

改變A變數,A小於B,A也不等於B。

改變A變數讓兩者相等
if-else 條件判斷會依序執行,if (A > B) 不成立,換下一個 else if ( A < B )不成立,最後就執行else。

等於跟不等於是相反的,可以用if-else改寫,等於判斷如果為false那就是不等於會走else區段。

變成賦值操作

如果只有一個 會變成賦值操作,放在if判斷裡面也是可以,但是會跟預期結果不一樣,可能會花很多時間找這個小小的錯誤。

編譯結果雖然沒有error,但是有warnings警告 expression not boolean 表達式非布林值,正視並修正每一個warnings,程式可以執行不代表沒有邏輯上的錯誤。

原本 X=3, Y=5 在做等於判斷的時候不會成立,因為少打一個變成賦值操作,跟預期結果不一樣,然後X變數也被賦值成5。

在if判斷式賦值之後會變成判斷 if ( X ),因為X為非零值所以會執行以下的程式碼。

邏輯運算

  • || OR (其中一個成立為True)
  • && AND (兩個都成立才為True)

OR 最小化計算

OR前後在做真假值判斷時,如果前面為True,此時最終結果就是True,後面的部分也就沒有必要求值。
=賦值優先權比較低,用( )可以讓他優先執行避免語法錯誤,為了驗證OR的最小化計算才在If裡面使用,這是錯誤的示範,請一定不能在if判斷裡面做賦值

  • >= 大於或是等於
  • <= 小於或是等於

A=3, B=5 的情況

A=5, B=5 的情況

A=9, B=5 的情況

提供程式讓大家研究,需放在Scripts資料夾。
條件判斷.mq4

參數、變數

變數

  • 整數
  • 浮點數
  • 布林值

變數的定義
型態 名稱=預設值;
整數沒有小數位
浮點數有小數位
布林值只有 ture是、false否

變數的作用域
在函式外面的最上面定義是全域變數,所有的地方都可以存取,在Start、Fun()都是存取全域變數。OnStart() 裡面又定義一個同名的區域變數,此時之後的操作 -> 直到 }之前,都是存取區域變數,這裡在編譯的時候會有警告訊息 declaration of ‘testI’ hides global variable ,全域變數被隱藏。

MT4下方終端 -> EA交易的頁籤。

避免作用域混淆,最好的方式就是變數名稱不要重複,如果全域變數定義的時候就加個前綴g,在使用變數的時候會更好理解。


例如:
int gTestI = 0; 全域
int TestI = 0; 區域

參數


#property show_inputs 這樣才會顯示輸入參數的對話視窗
在變數前面加上 input,載入程式時就可以改變這些數值(輸入的參數)。

在腳本的地方點擊載入 參數_變數,就會出現輸入參數的對話視窗,剛才的變數名稱就會顯示在裡面。
前綴i (當作輸入參數的區別)

如果在參數後面增加註解的話,會直接變成對話視窗變數的名稱,對於使用者來說非常的直觀。

也可以自定義列舉enum,裏面有兩個數值(也可以更多),將列舉定義為input就可以讓使用者當成參數使用了。

在輸入參數的對話視窗,因為在列舉跟定義input的後面都有新增註解,所以在這裡都是中文顯示非常直觀。

這裡提供片段程式碼僅供參考,請放在腳本的資料夾 Scripts。
參數_變數.mq4