iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

昨天說完了資料型態,今天就來分享在有了基礎後,要如何輸入變數,以及變數輸入位置不同會產生的結果吧。

1.輸入變數(Input Variables)

MQL5的輸入變數是唯一可由使用者更改的東西,包括交易設置、指標設置、停利值等,會在MT5內EA屬性對話框中的「輸入」中顯示

範例

input double MaximumRisk        = 0.02;    
input double DecreaseFactor     = 3;       
input int    MovingPeriod       = 60;      
input int    MovingShift        = 20;        
input int    SecondMovingPeriod = 30;
input int    SecondMovingShift  = 15;

產生效果如圖,其中所有數字都可更改:
https://ithelp.ithome.com.tw/upload/images/20230925/20163114OcBRBKcpJl.png

若要使用列舉,需要先定義輸入變數,在使用列舉時,當用戶試圖改變輸入變數的值時,會顯示出一個包含所有列舉值的下拉清單

範例

enum MonthOfYear
{
  January,
  February,
  March,
  april,
  May,
  June,
  July,
  August,
  September,
  october,
  November,
  December,

};
input MonthOfYear Month = January;

產生效果如圖:
https://ithelp.ithome.com.tw/upload/images/20230925/20163114unNTIUuEGM.png

2.本地變數(Local Variables)

本地變數是在函數內部聲明和使用的變數,它們的作用範圍僅限於包含它們的函數。與全域變數不同,本地變數只在函數執行期間存在,當函數執行完畢時,本地變數將被銷毀,不再佔用內存。

特點:

  1. 作用範圍: 本地變數的作用範圍僅限於聲明它們的函數內部。它們無法在函數之外訪問。

  2. 生命週期: 本地變數的生命週期僅限於函數的執行期間。一旦函數執行完畢,本地變數將被銷毀。

  3. 初始化: 本地變數可以在聲明時初始化,也可以在後續的程式碼中初始化。

範例:

void MyFunction()
{
    int localVar = 5; // 聲明並初始化本地變數

    // 在後續的程式碼中使用本地變數
    int result = localVar * 2;
    
    Print("本地變數: ", localVar);
    Print("結果: ", result);

//OUTPUT:本地變數: 5
//OUTPUT:結果: 10
}

在範例中,一旦函數執行完畢,localVar 和 result 都將被銷毀。所以如果要在其他地方再使用一次函數,則需要再聲明一次localVar,也代表著可以在不同函數使用同名的本地變數。

本地變數通常用於在函數內部存儲臨時數據或執行特定任務。它們對於在函數內部管理和追蹤數據非常有用。

3.全域變數(Global Variables)

全域變數是可以在整個程式中訪問的變數,其作用範圍不限於特定的函數或程式碼塊。全域變數在程式開始執行時被建立,並在程式結束時銷毀,因此它們的生命週期跟隨整個程式的執行。

特點:

  1. 作用範圍: 全域變數的作用範圍包括整個程式,可以在程式的任何地方訪問和修改它們。

  2. 生命週期: 全域變數在程式開始執行時建立,並在程式結束時銷毀。它們的值在程式的多個函數呼叫之間保持不變。

  3. 初始化: 全域變數可以在聲明時初始化,也可以在後續的程式碼中初始化。

範例:

int globalVar = 10;

void MyFunction()
{
    // 在函數內部使用全域變數
    int result = globalVar * 2;
    
    Print("全域變數: ", globalVar);
    Print("結果: ", result);
}

int OnInit()
{
    MyFunction(); // 呼叫函數
    return(INIT_SUCCEEDED);
}

// 在另一個函數中修改全域變數的值
void AnotherFunction()
{
    globalVar = 20;
    Print("全域變數已修改為: ", globalVar);
}
//OUTPUT:全域變數: 10
//OUTPUT:結果: 20
//OUTPUT:全域變數已修改為: 20

全域變數通常用於在整個程式中共享數據,以便多個函數可以訪問和修改相同的值。但也因為它們具有全域作用範圍,可能會導致程式碼的複雜性增加和不必要的副作用。

4.靜態變數(Static Variables)

具有持久性和作用域控制的特點。在MQL5中,靜態變數用來保持變數的值在函數呼叫之間保持不變,並且靜態變數的作用範圍僅限於定義它們的函數內部。

特點:

  1. 持久性: 靜態變數的值在函數呼叫之間保持不變,即使函數退出後再次呼叫該函數,靜態變數的值也會保持。

  2. 作用範圍: 靜態變數的作用範圍僅限於定義它們的函數內部,不能在函數外部訪問。

  3. 初始化: 靜態變數只在第一次函數呼叫時進行初始化,之後不再初始化。這可以用於存儲需要持久保留的數據,如歷史記錄或狀態信息。

範例:

void MyFunction()
{
    static int count = 0; // 定義一個靜態整數變數並初始化為0

    // 在每次呼叫函數時增加count的值
    count++;
    
    Print("Count: ", count);
}

// 在呼叫函數多次時,靜態變數的值會保持不變
MyFunction(); // 輸出:Count: 1
MyFunction(); // 輸出:Count: 2
MyFunction(); // 輸出:Count: 3

在範例中,count 是一個靜態變數,它在每次呼叫 MyFunction() 函數時遞增。由於它是靜態變數,它的值在函數呼叫之間保持不變,因此每次呼叫函數時,count 的值都會自動遞增。

靜態變數在MQL5中通常用於存儲需要在函數呼叫之間保持狀態的信息,例如追蹤某個條件的發生次數或存儲歷史數據,可以更有效地管理數據和狀態。

5.預定義的變數(Predefined Variables)

預定義變數用於存儲有關當前市場狀態、交易活動和交易帳戶的信息。以下是一些常見的MQL5預定義變數以及他們的作用:

  • _Symbol: 存儲當前圖表上的交易符號(貨幣對)的名稱。
  • _Period: 存儲當前圖表的時間周期(例如,M1、H1、D1等)。
  • _Digits: 存儲當前交易符號的小數位數。
  • _Point: 存儲當前交易符號的最小價格變動。
  • Bars: 存儲當前圖表上的歷史數據條數(蠟燭數量)。
  • Volume: 存儲當前蠟燭的成交量。
  • TimeCurrent(): 存儲當前服務器時間。
  • AccountBalance: 存儲當前交易帳戶的餘額。
  • AccountEquity: 存儲當前交易帳戶的淨值。
  • AccountFreeMarginCheck(): 存儲當前交易帳戶的可用保證金。
  • OrderSend() 和 OrderSendAsync() 函數的返回值: 存儲最後一次成功或失敗的訂單發送操作的結果。
  • OrderType: 存儲當前持有訂單的類型(買入或賣出)。
  • OrderLots: 存儲當前持有訂單的手數。
  • OrderOpenPrice: 存儲當前持有訂單的開倉價格。
  • OrderStopLoss 和 OrderTakeProfit: 存儲當前持有訂單的止損和目標價格。
  • OrderTicket: 存儲當前訂單的唯一標識號。
  • PositionGetInteger() 和 PositionGetString(): 存儲當前持倉交易的不同屬性,如魔術號、方向、開倉時間等。

上一篇
DAY9 MQL5的資料類型與應用
下一篇
DAY11 條件與迴圈:程式語言的關鍵元素
系列文
從零開始的外匯自動程式交易30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言