iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
SideProject30

從零開始的外匯自動程式交易系列 第 11

DAY11 條件與迴圈:程式語言的關鍵元素

  • 分享至 

  • xImage
  •  

前幾天說完了變數與資料型態,而在普通常見的程式語言中,條件運算子和迴圈運算子已經是非常重要的元素了,在更看中決策與交易策略的全自動EA中,更是不可或缺。它們為我們提供了控制程序流程和執行不同操作的關鍵工具。條件運算子使我們能夠根據特定條件的真偽來做出不同的決策,而迴圈運算子則使我們能夠有效地處理重複性任務。所以今天就來分享一下關於這兩個元素的運用。

(一)條件運算子(Conditional Operators)

條件運算子讓我們能夠創建具有多條分支的邏輯,根據不同情況執行不同的程式碼塊。它們是在制定決策、處理例外情況以及根據不同條件執行不同操作時的重要工具。

1.IF運算子(The if Operator)

用於控制程式的執行流程,根據特定條件的真偽(TRUE/FALSE)來執行不同的程式碼區塊。IF運算子通常與ELSE或ELSE IF一起使用,以創建多條分支的程式邏輯。

語法範例:

if (條件)   
{
    // 如果條件成立,執行這裡的程式碼
}
else if (另一個條件)
{
    // 如果第一個條件不成立,且這個條件成立,執行這裡的程式碼
}
else
{
    // 如果以上所有條件都不成立,執行這裡的程式碼
}

此程式碼中,所有條件皆為Boolean值。

當if運算子內僅有一個運算式時,可以省略括弧,並將其放在同一行中。

bool boolean = true;
if(boolean == true)Print(true);

在MQL5中,此運算子通常用於下列情況:

  • 交易策略中的決策:在MQL5中,交易策略通常使用IF運算子來檢查市場條件,例如價格、指標信號等,然後根據這些條件來執行交易操作。

  • 自定義指標:自定義指標(Custom Indicators)也可以使用IF運算子,以便根據市場數據來繪製自己的指標線或圖形。

  • 錯誤處理:當程式可能遇到錯誤或例外情況時,IF運算子用於檢查錯誤條件,然後執行錯誤處理程式碼。

  • 多條件檢查:可以使用IF和else if來執行多條件檢查,以根據不同情況執行不同的操作。

  • 選擇性執行程式碼:與其他程式語言一樣,IF運算子可以用於僅在特定條件下執行某段程式碼。

2.三元運算子(Ternary Operator)

三元運算子是一種簡潔的條件運算符,用於根據條件的真偽來選擇不同的值或執行不同的操作。他的優勢在於簡潔性和可讀性,特別是在需要將不同的值賦給一個變數時,可以幫助簡化程式碼,不過運用過多反而會降低可讀性。

語法範例:

(條件) ? 值1 : 值2;
// 如果條件成立,則返回值1,否則返回值2。

簡易範例:

int x = 10;
int y = 5;
int result = (x > y) ? x : y; // 如果x大於y,result等於x;否則等於y

在MQL5中,此運算子通常用於下列情況:

  • 設置變數的值
  • 決定函數的返回值
  • 設置訂單參數
  • 條件性的交易操作

實際運用範例:

double openPrice = ...; // 假設有開盤價格
double stopLoss = ...; // 假設有止損價格
double takeProfit = ...; // 假設有止盈價格

if (condition) {
    int ticket = OrderSend(Symbol(), OP_BUY, 1.0, openPrice, 3, stopLoss, takeProfit, "", 0, clrNONE);
    Print((ticket > 0) ? "買單已下單,單號:" + ticket : "買單下單失敗");     //根據OrderSend函數的返回值(訂單號或錯誤碼)來輸出相應的消息。
}

3.交換運算子(Switch Operator)

通常用於簡化多個if-else語句的結構,特別是在需要基於特定值執行不同操作的情況下。這提高了程式碼的可讀性和維護性,特別是當有多個可能的分支。

語法範例:

int day = 2;

switch (day) {
    case 1:
        // 如果day等於1,執行這裡的程式碼
        break;
    case 2:
        // 如果day等於2,執行這裡的程式碼
        break;
    case 3:
        // 如果day等於3,執行這裡的程式碼
        break;
    default:
        // 如果day不等於上述任何一個值,執行這裡的程式碼
}

在MQL5中,此運算子通常用於下列情況:

  • 交易策略中的多條件判斷:需要根據不同的市場條件來執行不同的交易操作時,switch語句可以非常有用。可以根據不同的技術指標信號來執行不同的交易策略。

  • 處理多種交易指令:在自動交易中,可能需要處理多種不同的交易指令,如買入、賣出、修改訂單等。switch可以根據接收到的指令來執行相應的操作。

  • 多個操作的選擇:當需要根據特定條件從多個操作中進行選擇時,switch可以實現這種多分支邏輯,提高代碼的可讀性。

  • 處理不同的時間框架或周期:在某些交易策略中,根據不同的時間框架或周期執行不同的操作可能很常見。可以用於根據時間框架來調整策略行為。

(二)迴圈運算子(Loop Operators)

迴圈運算子用於多次執行相同或類似的操作,並允許在達到特定條件後終止。

1.While迴圈(The while operator)

又稱前測式迴圈,是MQL5中最簡單的一個迴圈。while迴圈首先檢查條件是否成立。如果條件成立,則執行迴圈內的程式碼區塊,然後再次檢查條件。只要條件持續成立,迴圈就會繼續執行。當條件不再成立時,迴圈停止執行並繼續執行迴圈後的程式碼。

語法範例:

int count = 0;

while (count < 5)
{
    Print("迴圈迭代次數:" + IntegerToString(count));
    count++; // 增加計數器的值,以便退出迴圈
}

while 迴圈通常用於不確定迭代次數的情況,因為它在每次迭代前檢查條件是否成立。需要謹慎使用,以避免無限迴圈,確保條件能夠在某個時間點變為false,否則迴圈將永遠不會停止。

在MQL5中,此運算子通常用於下列情況:

  • 監控市場條件:當需要持續監控市場條件,直到某個特定條件成立或達到目標。
  • 實現持續運行的自動交易策略:在自動交易中,while迴圈可以用於持續監控市場,執行交易操作,並根據交易策略的邏輯持續更新。
  • 執行非同步操作:當需要執行一個非同步操作,例如等待用戶輸入或等待某個條件達成。

2.do-while迴圈(The do-while operator)

又稱後側式迴圈,與while幾乎一樣,差別只在於while是先判斷條件再執行迴圈,而do-while是先執行迴圈再判斷。也因為他會先執行一次,所以通常用於需要至少執行一次的情況

語法範例:

int count = 0;

do
{
    Print("迴圈迭代次數:" + IntegerToString(count));
    count++; // 增加計數器的值
}
while (count < 5);

此範例與while迴圈之範例相同,同樣要避免無限迴圈。而在MQL5中使用的情況與While相同。

3.for迴圈

用於執行特定的程式碼區塊,並在每次迭代時進行計數或遞增/遞減操作。通常用於已知迭代次數的情況,此運算子包含三個由分號分隔的運算式。

  • 初始化變數:用於逐一查看迴圈
  • 迴圈條件:通常是關聯運算式,為TRUE時執行,FALSE時退出
  • 每個迴圈結束後執行的算式,通常是遞增反覆運算的數學運算式

語法範例:

for (int i = 0; i < 5; i++)
{
    // 這段程式碼將執行5次,i的值從0到4
    Print("迴圈迭代次數:" + IntegerToString(i));
}

4.break和continue

break可以立即跳出最近的迴圈(switch亦可),而continue類似於break,但不算完全退出迴圈,而是退出當次迴圈進到下一輪迴圈。
若迴圈如前幾個範例,在count==3時,break會讓最終輸出為0,1,2
而在count==3時,continue則會輸出0,1,2,4


上一篇
DAY10 變數的介紹
下一篇
DAY12 函數定義及運用
系列文
從零開始的外匯自動程式交易30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言