MQL4 Low函數終極指南:一篇搞懂MT4 K棒最低點的程式交易語法

最近更新: 2025/11/17  |  CashbackIsland

mql4-low-function-guide

想在 MT4 中開發自己的交易指標或 EA,卻總是卡在如何抓取 K 棒的最低價格嗎?MQL4 Low函數是實現這個功能的關鍵,但其用法與 `iLow()` 常常讓初學者感到困惑。這篇文章將帶你從零開始,徹底解析獲取 MT4 K棒最低點的核心語法,並提供實用範例,讓你輕鬆掌握這項必備的 MT4程式交易語法技巧,踏出自動化交易的第一步。

 

什麼是MQL4 Low函數?掌握MT4 K棒最低點的核心

在 MQL4 語言中,`Low` 並不是一個傳統意義上的「函數」,而是一個預定義的時間序列陣列 (Time Series Array)。可以把它想像成一個裝滿了歷史價格資料的容器,專門用來存放每一根 K 棒的最低價格。這個陣列是 MQL4 內建的,無需額外宣告就能直接在你的指標 (Indicator)、EA (Expert Advisor) 或腳本 (Script) 中使用。

 

Low[]:預定義時間序列陣列的定義與語法

`Low[]` 陣列的語法非常直觀。它透過一個索引值(index)來存取特定 K 棒的最低價。這個索引值從 0 開始,代表著不同的時間點:

  • `Low[0]`:當前(最新)正在形成的 K 棒的最低價。
  • `Low[1]`:前一根已經收盤的 K 棒的最低價。
  • `Low[2]`:往前數第二根 K 棒的最低價。
  • `Low[n]`:往前數第 n 根 K 棒的最低價。

這個陣列儲存的是 `double` 類型的價格數據。例如,如果你想宣告一個變數來儲存前一根 K 棒的最低價,可以這樣寫:

double previousBarLow = Low[1];

理解這個索引規則是學習 MQL4 程式交易語法的基礎,因為 `Open[]`, `High[]`, `Close[]`, `Volume[]` 等其他時間序列陣列都遵循同樣的邏輯。

 

如何讀取不同K棒的最低價?(當前、前一根、N根前)

存取不同 K 棒的最低價非常簡單,只需要改變中括號 `[]` 內的索引值即可。以下是幾個常見的例子:

  • 讀取當前 K 棒的即時最低價:
    `double currentLow = Low[0];`
    注意:這個價格會隨著市場報價即時變動,直到這根 K 棒收盤為止。
  • 讀取前一根 K 棒的固定最低價:
    `double lastClosedLow = Low[1];`
    這個價格是固定的,因為 K 棒已經收盤,不會再改變。
  • 使用迴圈讀取過去 10 根 K 棒的最低價:
    for(int i = 1; i <= 10; i++)
    {
      Print("第 ", i, " 根前的K棒最低價是: ", Low[i]);
    }

    這段程式碼會依序印出從最近收盤的那一根 K 棒開始,往前 10 根的最低價格。

 

MQL4 Low函數的實際應用範例與程式碼

理論講完了,讓我們來點實際的!了解 MT4 最低價指標的語法後,你可以將它應用在許多交易策略中。下面提供幾個實用的範例,幫助你更好地理解如何在實戰中運用 `Low` 陣列。

 

範例一:在圖表上標示出過去20根K棒的最低點

這個簡單的指標可以在每根 K 棒的最低價位置畫一個小箭頭,讓你直觀地看到近期價格的支撐位。這對於觀察價格行為或尋找潛在的進場點非常有幫助。

//+------------------------------------------------------------------+
//|                                            MarkLowestPoints.mq4 |
//|                        Copyright 2025, CashbackIsland           |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, CashbackIsland"
#property link      ""
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1  clrGold

//---- indicator buffers
extrn int LookbackPeriod = 20; // 設定要標示的 K 棒數量
double ArrowBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---- indicator buffers mapping
   SetIndexBuffer(0, ArrowBuffer);
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 2);
   SetIndexArrow(0, 233); // 設定箭頭樣式
   SetIndexLabel(0, "Lowest Point");

//---- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//----
   int limit = rates_total - prev_calculated;
   if(prev_calculated > 0) limit++;

   for(int i = 0; i < limit && i < LookbackPeriod; i++)
     {
      ArrowBuffer[i] = Low[i]; // 將箭頭設定在 K 棒的最低價位置
     }
//---- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 

範例二:編寫一個簡單的「突破最低價」提醒指標

許多交易策略都基於價格突破,例如當價格跌破前一根 K 棒的最低點時,可能是一個看空的信號。以下程式碼會在價格跌破前低時,發出一個彈窗提醒。

// 簡易突破提醒 EA 範例 (放在 OnTick() 函數中)
void OnTick()
{
   // 使用 static 變數確保提醒只發送一次
   static datetime lastAlertTime = 0;

   // 獲取當前價格和前一根 K 棒的最低價
   double currentPrice = Bid;
   double previousLow = Low[1];

   // 檢查條件:當前價格跌破前低,且距離上次提醒超過一根 K 棒的時間
   if(currentPrice < previousLow && Time[0] != lastAlertTime)
   {
      Alert("價格警報: ", Symbol(), " 當前價格 ", currentPrice, " 已跌破前低 ", previousLow, "!");
      lastAlertTime = Time[0]; // 更新提醒時間,避免重複觸發
   }
}

 

結合其他MQL4語法:計算K棒實體與影線長度

掌握了 `Low[]`,再結合 `High[]`, `Open[]`, `Close[]`,你就能對 K 棒進行更深入的分析。例如,計算下影線的長度,這在判斷市場買盤支撐力道時非常有用。

  • K 棒實體 (Body) 長度: `MathAbs(Open[i] – Close[i])`
  • 上影線 (Upper Wick) 長度: `High[i] – MathMax(Open[i], Close[i])`
  • 下影線 (Lower Wick) 長度: `MathMin(Open[i], Close[i]) – Low[i]`

透過分析這些數值,你可以開發出更複雜的交易邏輯,例如「當出現長下影線的錘子線時進場做多」的策略。想了解更多關於 MQL4 的入門知識,可以參考相關的教學指南。

 

進階技巧:Low[] vs. iLow() 函數比較與應用

當你對 MQL4 Low函數 有了基本了解後,很快就會遇到它的「兄弟」—— `iLow()` 函數。雖然兩者都能獲取最低價,但它們的應用場景和功能有著天壤之別。搞懂它們的差異,是從新手邁向進階開發者的重要一步。

 

功能差異:當前圖表 vs. 指定商品與週期

兩者最核心的區別在於數據來源的靈活性:

  • `Low[]` 陣列:
    • 優點:簡單、快速、直觀。
    • 限制:只能讀取當前圖表的商品和時間週期的數據。例如,如果你的指標放在 EURUSD 的 H1 圖表上,`Low[]` 就只能抓到 EURUSD H1 的最低價,無法得知其他商品或時間週期的資訊。
  • `iLow()` 函數:
    • 優點:功能強大、極具彈性。
    • 語法: `double iLow(string symbol, int timeframe, int shift);`
    • 功能:可以讀取任何指定商品任何時間週期的最低價。例如,即使你身在 EURUSD H1 圖表,也可以透過 `iLow(“GBPUSD”, PERIOD_D1, 1)` 來獲取英鎊兌美元日線圖上前一根 K 棒的最低價。

 

使用時機與場景分析:我該用哪一個?

選擇使用 `Low[]` 還是 `iLow()`,完全取決於你的策略需求:

你應該使用 `Low[]` 的情況:

  • 你的策略只分析單一圖表,不涉及多商品或多週期分析。
  • 你需要最快速的數據存取效能(`Low[]` 是預先載入的,速度比 `iLow()` 略快)。
  • 程式碼追求簡潔易讀,例如編寫一個簡單的移動平均線指標。

你應該使用 `iLow()` 的情況:

  • 你需要開發多貨幣對沖的 EA,例如同時監控 EURUSD 和 USDCHF 的價格走勢。
  • 你的策略是多時間週期分析,例如在 H1 圖表上參考 D1 圖表的支撐位(`iLow(Symbol(), PERIOD_D1, 1)`)。
  • 你需要獲取非標準圖表(如 H2、M10)的數據。

總結來說,`Low[]` 解決「當下」的問題,而 `iLow()` 解決「任何」的問題。對於剛起步的開發者,先精通 `Low[]` 的用法,再逐步探索 `iLow()` 的強大功能,會是更穩健的學習路徑。如果你對開發更複雜的EA 交易系統感興趣,那麼 `iLow()` 將是你不可或缺的工具。

 

常見問題 (FAQ)

Q:MQL4 Low[0] 回傳的價格是即時跳動的嗎?

A:是的。`Low[0]` 代表當前 K 棒(尚未收盤)的最低價。只要市場有新的 Tick 報價進來,這個數值就會跟著更新。一旦該 K 棒收盤,`Low[0]` 的值就會固定下來,並成為下一根新 K 棒的 `Low[1]`。

Q:如何找到過去N根K棒中的最低價?

A:這需要使用迴圈來遍歷 `Low[]` 陣列。你可以使用 MQL4 內建的 `Lowest()` 函數來簡化這個過程。例如,要找到從前一根 K 棒開始,過去 20 根 K 棒中的最低價,可以這樣寫:`int lowestBarIndex = Lowest(NULL, 0, MODE_LOW, 20, 1);` 這會返回最低價所在 K 棒的索引值,然後你再用 `Low[lowestBarIndex]` 來取得該價格。

Q:在腳本(Script)和EA(Expert Advisor)中使用Low函數有什麼不同?

A:功能上沒有不同,但在執行邏輯上有差異。腳本通常只執行一次就結束,所以它讀取到的 `Low` 值是執行瞬間的快照。而 EA 則是在 `OnTick()` 函數中持續執行的,每一次市場報價進來,`OnTick()` 就會被觸發一次,EA 就能不斷獲取最新的 `Low[0]` 價格來進行判斷。

Q:如果圖表上的歷史數據不足,讀取Low[1000]會發生什麼?

A:如果索引值超出了當前圖表已載入的歷史數據範圍,讀取 `Low[i]` 會回傳一個 0 或者是一個無效的數值。在進行迴圈處理時,最好先用 `Bars` 或 `rates_total` 變數來檢查圖表上總共有多少根 K 棒,以避免讀取到無效的數據,這是一個良好的程式設計習慣。

 

結論

總結來說,`MQL4 Low` 函數(或更精確地說是 `Low[]` 陣列)是所有 MT4 程式交易開發者必須掌握的基礎。通過本文的學習,你已經了解其基本語法、如何讀取不同週期的 K 棒最低點、實戰應用範例,以及與 `iLow()` 函數的關鍵區別。掌握 MT4 最低價指標的核心語法並不難,關鍵在於理解其背後的索引邏輯並多加練習。現在就動手打開你的 MetaEditor,參考MQL4官方文檔,開始編寫你的第一個指標或交易策略吧!

喜欢这篇文章的话,请分享吧!

相关文章

返回顶部