迴圈

  • 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

第一個指標

點擊 「新」-> 自訂指標 -> Next
名稱:會是檔案的名稱,放在Indicators資料夾。
作者、連接 可以先用預設值,掛載指標時會顯示這些資訊。
先不要有參數
預設值 -> Next
這裡新增兩條線 Line high、 Line low,還有預設顏色。
可以在右側導航面板打開Indicators,裡面就有剛才新增的指標,可以滑鼠左鍵雙擊開啟。
剛才設定的繪製有兩條線,詳細參數都定義在#property裡面。
然後我們最主要的任務就是在陣列 highBuffer[]、lowBuffer[] 裡面設定數值,這樣線圖就會畫出來。
新增的指標目前只有兩個函式:
OnInit() 初始化函式,載入指標時會執行一次。
OnCalculate() 有新的價格時執行。

可以按「編寫」,下方會有資訊,如果沒有錯誤的話,程式就建立完成可以載入。
先簡單加個Log印出幾個參數
rates_total、prev_calculated、time[0]、close[0]
回到MT4介面 -> 導航 -> Indicators -> 第一個指標(滑鼠左鍵雙擊)
顏色頁籤可以修改兩條線的參數,然後按OK。
EA交易頁籤就會輸出剛才我們加入的Log資訊

(1)prev_calculated = 0 已經處理過的資料0筆,rates_total = 10730 目前收到的資料有幾筆。
所以當 prev_calculated = 0 時,我們需要將目前所有資料 rates_total = 10730 做處理。
time[0] = 15:45:00 目前K棒時間

(2)rates_total = 10730, prev_calculated = 10730 所有資料跟處理過的資料都一樣,此時更新10730這筆資料就可以了。
(3)
.
.
.
(11)time[0] = 15:46:00 此時K棒才有更新,時間就不一樣。
rates_total = 10731, prev_calculated = 10730 ,所有資料10731 比 處理過的資料多一個,此時處理10731這筆資料就可以了。
依照剛才說明的邏輯新增程式
ArraySetAsSeries() 是內建函式,設true時,存取陣列[0]是最新資料。
這裡設成false,存取陣列[0]是最舊資料。

然後將 highBuffer 設定成最高價,lowBuffer設定成最低價,一個簡單的指標就完成。
柱狀圖的效果
陰陽燭的效果
折線圖的效果

提供程式碼讓大家研究,將程式碼放在Indicators資料夾,就可以載入了。
第一個指標.mq4

範本

每個人都會有自己想看的技術指標跟線圖樣式顏色,這時候可以儲存範本。下次開啟新的商品時可以直接載入範本,非常方便。

可以在圖形上面按滑鼠右鍵,範本->然後會看到好幾個內建範本,這裡示範開啟Popular
就會看到線圖下方有三個指標。

滑鼠右鍵->技術指標列表

就可以看到目前有哪幾個指標。
滑鼠左鍵雙擊,還可以看到指標的參數。

範本可以儲存
指標、EA、網格、成交量、K棒大小、自動滾動、圖表平移、屬性裡面的設定、手動畫的圖…等等…,應該只有週期沒辦法儲存吧!

屬性->顏色

屬性->常規

提供我自己設定的範本給大家玩玩,檔案要放在templates資料夾裡面。
alan_MACD.tpl