Arrays in MQL5: A Comprehensive Guide

Watch on YouTube: Mastering Arrays in MQL5: A Comprehensive Guide

Arrays are essential in MQL5 for managing multiple values of the same type efficiently. Below is a deeper explanation of array types, initialization, manipulation, and practical examples with commented code snippets.

Single-Dimensional Arrays

Single-dimensional arrays hold a sequence of values. They are useful for storing related data like price values, indicator results, or trade IDs in a linear structure.

Example:

void OnStart() {
    int prices[10];  // Declare an array with 10 integer elements
    prices[0] = 100;  // Assign the first element
    prices[1] = 200;  // Assign the second element
    // Access and print array elements
    Print("First price: ", prices[0]);
    Print("Second price: ", prices[1]);
}

Explanation:

  • prices[10] declares an array to hold 10 integers.
  • Elements are indexed starting from 0. prices[0] is the first element.
  • The array stores integers for potential use in calculations or logic.

Multi-Dimensional Arrays

Multi-dimensional arrays store data in tabular form, useful for managing related datasets like matrix computations or storing multiple attributes of a bar.

Example:

void OnStart() {
    double arr[2][2];  // Declare a 2x2 array (arr)
    arr[0][0] = 1.1;   // Assign values to the first row
    arr[0][1] = 1.2;  
    arr[1][0] = 2.1;   // Assign values to the second row
    arr[1][1] = 2.2;
    // Print elements
    Print("Array element [0][0]: ", arr[0][0]);
    Print("Array element [1][1]: ", arr[1][1]);
}

Explanation:

  • arr[2][2] creates a two-dimensional array with 2 rows and 2 columns.
  • Elements are accessed using arr[row][column] notation.
  • This is beneficial when dealing with structured data requiring multiple attributes.

Array Initialization and Resizing

Arrays can be declared empty and resized dynamically using ArrayResize, especially when the required size is determined at runtime.

Example:

void OnStart() {
    int values[];  // Declare an empty array
    ArrayResize(values, 5);  // Resize the array to hold 5 elements
    for (int i = 0; i < ArraySize(values); i++) {
        values[i] = i * 10;  // Initialize array elements with multiples of 10
        Print("Value at index ", i, ": ", values[i]);
    }
}

Explanation:

  • ArrayResize(values, 5) resizes the array to hold 5 elements.
  • ArraySize returns the current size of the array.
  • Dynamically resizing arrays is useful for handling variable-sized data, like a flexible number of trades or indicators.

Important Functions for Arrays

MQL5 provides utility functions to manipulate arrays efficiently:

  • ArrayResize: Resizes the array dynamically to a specified size.
  • ArraySetAsSeries: Reverses array indexing to match the time-series order.
  • ArrayCopy: Copies elements from one array to another.

Example:

void OnStart() {
    int values1[] = {1, 2, 3};  // Initialize an array
    int values2[];              // Declare an empty array
    ArrayResize(values2, ArraySize(values1));  // Resize values2 to match values1 size
    ArrayCopy(values2, values1);               // Copy elements from values1 to values2
    for (int i = 0; i < ArraySize(values2); i++) {
        Print("Copied value at index ", i, ": ", values2[i]);
    }
}

Explanation:

  • ArrayCopy duplicates all elements from values1 to values2.
  • This is useful when you need to replicate data for calculations or backups.

Time Series and Arrays

MQL5 handles time series data in reverse indexing (most recent data at index 0). The function ArraySetAsSeries is used to ensure arrays are processed as time series.

Example:

void OnStart() {
    double closePrices[];                // Declare an array for close prices
    int bars = CopyClose(_Symbol, 0, 0, 10, closePrices);  // Get the last 10 close prices
    if (bars > 0) {
        ArraySetAsSeries(closePrices, true);  // Treat as time series (latest first)
        Print("Most recent close price: ", closePrices[0]);
        Print("Oldest close price: ", closePrices[bars - 1]);
    }
}

Explanation:

  • CopyClose fills closePrices with the closing prices of the last 10 bars.
  • ArraySetAsSeries ensures the latest price is at closePrices[0].

Conclusion

Arrays in MQL5 are indispensable for managing data. By combining functions like ArrayResize, ArrayCopy, and ArraySetAsSeries, you can handle dynamic and time-sensitive trading data effectively. This versatility makes arrays a cornerstone of robust algorithmic trading solutions.

Next: Technical Indicators

Previous: Timeseries and Indicators