ArraySort MQL4: Cara Pakai & Contoh Aplikasi

※記事内に広告を含む場合があります。
目次

1. Pendahuluan

MQL4 dan Pentingnya Operasi Array

MQL4 adalah bahasa pemrograman untuk membuat program perdagangan otomatis (EA) dan indikator kustom di platform MetaTrader 4 (MT4). Dalam MQL4 yang memungkinkan analisis data pasar keuangan dan otomatisasi strategi perdagangan, keterampilan mengoperasikan array sangat penting. Array adalah struktur data dasar yang digunakan untuk mengelola data harga dan nilai indikator secara efisien.

Di antara fungsi-fungsi tersebut, fungsi ArraySort adalah alat yang berguna untuk mengurutkan elemen array. Dengan memahami dan memanfaatkan fungsi ini dengan benar, Anda dapat meningkatkan efisiensi strategi perdagangan dan analisis data.

Tujuan Artikel Ini

Artikel ini akan menjelaskan secara rinci fungsi ArraySort MQL4, mulai dari cara penggunaan dasar hingga metode penerapan lanjutan. Artikel ini disajikan dengan cara yang mudah dipahami bahkan bagi pemula, dengan contoh praktis.

2. Apa itu fungsi ArraySort?

Ringkasan fungsi ArraySort

ArraySort adalah fungsi built-in di MQL4 untuk mengurutkan array secara naik atau turun. Proses pengurutan dapat digunakan untuk menyusun data harga atau waktu, serta pengurutan berdasarkan kondisi kustom.

Berikut adalah sintaks fungsi ini.

int ArraySort(
    void &array[],
    int count=WHOLE_ARRAY,
    int start=0,
    int direction=MODE_ASCEND
);

Penjelasan parameter utama

  1. array[]:
    Tentukan array yang akan diurutkan. Array ini harus satu dimensi.
  2. count:
    Tentukan jumlah elemen yang akan diurutkan. Secara default, seluruh array ( WHOLE_ARRAY ) menjadi target.
  3. start:
    Tentukan indeks mulai pengurutan. Nilai default 0 (awal array).
  4. direction:
    Tentukan arah pengurutan.
  • MODE_ASCEND: Naik (dari kecil ke besar)
  • MODE_DESCEND: Turun (dari besar ke kecil)

Contoh penggunaan: Pengurutan dasar

Berikut adalah contoh pengurutan naik dasar.

double prices[] = {1.2345, 1.1234, 1.5678, 1.3456};
ArraySort(prices);

// Setelah pengurutan: {1.1234, 1.2345, 1.3456, 1.5678}

Dalam kode ini, fungsi ArraySort digunakan untuk mengurutkan data harga secara naik.

3. Cara Penggunaan Dasar

Pengurutan Array Sederhana

Cara paling dasar adalah mengurutkan array tunggal dalam urutan menaik atau menurun. Berikut contoh sederhananya.

Pengurutan Menaik

double values[] = {5.5, 2.2, 8.8, 1.1};
ArraySort(values);

// Setelah pengurutan: {1.1, 2.2, 5.5, 8.8}

Pengurutan Menurun

double values[] = {5.5, 2.2, 8.8, 1.1};
ArraySort(values, WHOLE_ARRAY, 0, MODE_DESCEND);

// Setelah pengurutan: {8.8, 5.5, 2.2, 1.1}

Menentukan Posisi Awal Pengurutan

Berikut kode menunjukkan contoh mengurutkan hanya bagian tertentu.

double data[] = {9.9, 7.7, 3.3, 5.5};
ArraySort(data, 2, 1); // Mengurutkan 2 elemen mulai dari indeks 1

// Setelah pengurutan: {9.9, 3.3, 7.7, 5.5}

Dalam kode ini, mulai dari indeks 1 (7.7), dua elemen (7.7 dan 3.3) diurutkan secara menaik.

4. Penerapan fungsi ArraySort

Contoh kondisi pengurutan yang kompleks

ArraySort fungsi sangat berguna ketika melakukan pengurutan sesuai kondisi tertentu selain pengurutan naik turun dasar. Misalnya, dapat dipertimbangkan situasi mengurutkan dengan menggabungkan harga dan waktu.

Contoh pengurutan dengan beberapa kondisi

Berikut kode contoh mengurutkan data tanggal dan harga.

// Data tanggal dan harga
datetime dates[] = {20221101, 20221103, 20221102};
double prices[] = {1.2345, 1.1234, 1.3456};

// Urutkan tanggal naik, dan sinkronkan data harga
ArraySort(dates); // Urutkan tanggal

// Rekonstruksi data harga secara manual berdasarkan tanggal
double sorted_prices[ArraySize(prices)];
for (int i = 0; i < ArraySize(prices); i++)
{
    int index = ArrayBsearch(dates, dates[i], 0, WHOLE_ARRAY);
    sorted_prices[i] = prices[index];
}

// Setelah pengurutan:
// tanggal: {20221101, 20221102, 20221103}
// sorted_prices: {1.2345, 1.3456, 1.1234}

Dalam contoh ini, ArraySort dan ArrayBsearch digabungkan, melakukan pengurutan sambil menjaga sinkronisasi data.

Pengurutan parsial array multidimensi

Di MQL4, tidak dapat langsung mengurutkan array multidimensi. Namun, biasanya mengekstrak kolom atau baris yang diperlukan ke array satu dimensi, lalu mengurutkan dan menyusun kembali.

Contoh pengurutan array multidimensi

// Array multidimensi (baris: tanggal, kolom: harga)
double data[][2] = {{20221101, 1.2345}, {20221103, 1.1234}, {20221102, 1.3456}};

// Urutkan berdasarkan tanggal
double temp[3]; // Array satu dimensi sementara
for (int i = 0; i < ArraySize(data); i++)
    temp[i] = data[i][0]; // Ekstrak tanggal

ArraySort(temp); // Urutkan tanggal naik

// Susun kembali array multidimensi berdasarkan hasil pengurutan
double sorted_data[3][2];
for (int i = 0; i < ArraySize(temp); i++)
{
    for (int j = 0; j < ArraySize(data); j++)
    {
        if (temp[i] == data[j][0])
        {
            sorted_data[i][0] = data[j][0];
            sorted_data[i][1] = data[j][1];
            break;
        }
    }
}

// Setelah pengurutan: {{20221101, 1.2345}, {20221102, 1.3456}, {20221103, 1.1234}}

Pengurutan dengan memperhatikan performa

Ketika menangani data dalam jumlah besar, performa pengurutan penting. Berikut adalah beberapa tip menggunakan fungsi ArraySort secara efisien.

  1. Filter data yang tidak perlu sebelumnya:
    menghapus elemen yang tidak perlu dalam array untuk meminimalkan target pengurutan.
   ArrayResize(array, count); // Ubah ukuran menjadi ukuran yang diperlukan
  1. Batasi rentang pengurutan:
    bukan seluruh array, melainkan hanya bagian yang diperlukan untuk mengurangi jumlah perhitungan.
   ArraySort(array, 50, 10); // Urutkan hanya 10 hingga 50 item
  1. Pilih tipe data yang tepat:
    memilih tipe data yang tepat untuk mengoptimalkan penggunaan memori (misalnya: gunakan float daripada double).

5. Batasan dan Catatan Fungsi ArraySort

Batasan Terkait Tipe Array

ArraySort fungsi hanya dapat digunakan untuk tipe data tertentu. Harap perhatikan poin-poin berikut.

  1. Tipe Data yang Didukung:
  • Numerik (int, double, float): dapat disortir
  • String (string): dapat disortir
  • Tipe lain (misalnya bool, datetime): dapat disortir tetapi perlu memperhatikan makna urutan
  1. Jika sort tidak berlaku:
    ArraySort tidak dapat diterapkan langsung pada array multidimensi. Anda perlu mengekstrak kolom atau baris tertentu menjadi array satu dimensi, menyortir, lalu menyusunnya kembali.

Contoh: Array multidimensi yang tidak didukung

double matrix[][2] = {{1.2, 2.3}, {3.4, 4.5}};
// ArraySort(matrix); // Akan menghasilkan error

Keandalan Hasil Sort

Dengan menggunakan ArraySort, jika ada nilai yang sama lebih dari satu, urutannya tidak dijamin. Ini disebut tidak stabil (setelah sort, urutan nilai yang sama tidak dipertahankan).

Contoh: Ketika tidak stabil

double array[] = {2.2, 1.1, 2.2, 3.3};
ArraySort(array);
// Hasil sort: {1.1, 2.2, 2.2, 3.3} (urutan tidak dipertahankan)

Jika diperlukan, Anda harus menambahkan kondisi khusus untuk mengimplementasikan perilaku seperti sort stabil.

Penanganan Error

Fungsi ArraySort jarang gagal, namun dapat terjadi error karena kondisi array atau kesalahan pengaturan parameter. Berikut contoh error dan penyebabnya.

  1. Jika array kosong:
    Jika array kosong (ArraySize(array) == 0) maka tidak akan disortir.
   double emptyArray[];
   ArraySort(emptyArray); // Tidak disortir
  1. Indeks tidak valid:
    Jika rentang sort (start dan count) melebihi ukuran array, akan terjadi perilaku tak terduga.
   double array[] = {5.0, 3.0, 1.0};
   ArraySort(array, 5, 2); // Menyebabkan error atau perilaku tidak valid

Contoh kode untuk mencegah error

double array[] = {1.0, 2.0, 3.0};
int size = ArraySize(array);

if (size > 0) {
   ArraySort(array, size, 0, MODE_ASCEND);
} else {
   Print("Array kosong");
}

Masalah Kinerja

Ketika menyortir data dalam jumlah besar, perlu memperhatikan kompleksitas algoritma sort (O(n log n)). Berikut cara meningkatkan kinerja.

  1. Sort sebagian:
    Dengan menyortir hanya bagian yang diperlukan, dapat mengurangi kompleksitas.
   ArraySort(array, 50); // Menyortir 50 pertama
  1. Filter data sebelumnya:
    Hapus data tidak perlu sebelum sort.
   ArrayResize(array, newSize);
  1. Gunakan tipe data yang tepat:
    Dengan memilih tipe data yang tepat, dapat mengoptimalkan penggunaan memori (misalnya gunakan float daripada double).

6. Contoh Penggunaan Praktis

Pengurutan Data Riwayat Perdagangan

Berikut adalah contoh pengurutan data riwayat perdagangan menggunakan ArraySort.

Contoh Kode Sebenarnya

// Data riwayat perdagangan (tanggal dan jumlah keuntungan)
datetime tradeDates[] = {20221102, 20221101, 20221103};
double profits[] = {100.0, 50.0, 150.0};

// Urutkan tanggal secara ascending dan sinkronkan jumlah keuntungan
ArraySort(tradeDates);

double sorted_profits[ArraySize(profits)];
for (int i = 0; i < ArraySize(tradeDates); i++) {
   int index = ArrayBsearch(tradeDates, tradeDates[i], 0, WHOLE_ARRAY);
   sorted_profits[i] = profits[index];
}

// Setelah pengurutan:
// tradeDates: {20221101, 20221102, 20221103}
// sorted_profits: {50.0, 100.0, 150.0}

Penggunaan dalam Indikator Kustom

Misalnya, Anda juga dapat memanfaatkan ArraySort untuk mengurutkan nilai rata-rata bergerak berdasarkan kondisi tertentu.

7. Pertanyaan yang Sering Diajukan (FAQ)

Bagaimana cara menyortir hanya sebagian array?

Dengan menggunakan parameter start dan count dari fungsi ArraySort, Anda dapat menyortir hanya sebagian array.

Contoh: Menyortir sebagian array

double data[] = {9.0, 3.0, 7.0, 1.0, 5.0};
ArraySort(data, 3, 1); // Menyortir 3 elemen mulai dari indeks 1 secara ascending

// Setelah sort: {9.0, 1.0, 3.0, 7.0, 5.0}

Dalam contoh ini, hanya tiga elemen mulai dari indeks 1 (3.0) yang disortir.

Penyortiran menurun tidak berfungsi dengan benar. Apa yang harus dilakukan?

Untuk melakukan penyortiran menurun, Anda perlu menentukan MODE_DESCEND pada parameter direction. Jika tidak ditentukan, secara default akan naik.

Contoh penyortiran menurun yang benar

double data[] = {2.2, 3.3, 1.1};
ArraySort(data, WHOLE_ARRAY, 0, MODE_DESCEND);

// Setelah sort: {3.3, 2.2, 1.1}

Catatan: Jika MODE_DESCEND tidak ditentukan, hasilnya dapat dalam urutan yang tidak diinginkan.

Apakah ada cara untuk memproses array multidimensi secara efisien?

Di MQL4, fungsi ArraySort tidak langsung mendukung array multidimensi, jadi kami sarankan memprosesnya secara efisien menggunakan metode berikut.

Metode 1: Mengonversi ke array 1D dan menyortir

Ekstrak kolom atau baris tertentu dari array multidimensi sebagai array 1D dan sortir.

Metode 2: Rekonstruksi kolom yang akan disortir berdasarkan indeks

Dalam contoh berikut, kami menyortir array multidimensi berdasarkan kolom kedua (data harga).

double data[][2] = {{1.0, 3.3}, {2.0, 1.1}, {3.0, 2.2}};
double temp[ArraySize(data)];

// Ekstrak kolom kedua (data harga) dan sortir
for (int i = 0; i < ArraySize(data); i++) {
   temp[i] = data[i][1];
}
ArraySort(temp); // Sortir harga secara ascending

// Rekonstruksi array multidimensi berdasarkan hasil sort
double sorted_data[ArraySize(data)][2];
for (int i = 0; i < ArraySize(temp); i++) {
   for (int j = 0; j < ArraySize(data); j++) {
       if (temp[i] == data[j][1]) {
           sorted_data[i][0] = data[j][0];
           sorted_data[i][1] = data[j][1];
           break;
       }
   }
}

// Setelah sort:
// sorted_data: {{2.0, 1.1}, {3.0, 2.2}, {1.0, 3.3}}

Apakah ada cara untuk mencegah kesalahan ketika array kosong?

ArraySort tidak berfungsi pada array kosong. Oleh karena itu, Anda perlu memeriksa apakah array kosong terlebih dahulu.

Contoh memeriksa apakah array kosong

double data[];

if (ArraySize(data) > 0) {
   ArraySort(data);
} else {
   Print("Array kosong.");
}

Apakah Anda dapat menangani nilai duplikat dalam array dengan benar?

ArraySort dapat menyortir nilai duplikat dalam array dengan benar, tetapi urutan nilai yang sama tidak dijamin (sort tidak stabil). Jika diperlukan sort stabil, Anda harus menyesuaikannya secara manual seperti berikut.

Contoh menjaga urutan secara manual

// Rekam nilai dalam array dan indeks asli
double data[] = {2.2, 1.1, 2.2, 3.3};
int indexes[ArraySize(data)];
for (int i = 0; i < ArraySize(data); i++) {
   indexes[i] = i;
}

// Buat fungsi bantu untuk sort dan implementasikan sort kustom
// Rekonstruksi indeks asli setelah sort

8. Ringkasan dan langkah selanjutnya

Meninjau poin-poin kunci fungsi ArraySort

  • Peran dasar:
    ArraySort fungsi adalah alat yang berguna untuk mengurutkan array dalam urutan menaik atau menurun.
  • Fitur utama:
    Pengurutan sebagian array, pengurutan berdasarkan kondisi tertentu, operasi tidak langsung pada array multidimensi, dan lain-lain, dapat digunakan untuk berbagai aplikasi.
  • Batasan dan catatan:
    Ada beberapa batasan seperti tipe array dan penanganan array multidimensi, serta tidak adanya jaminan stabilitas pengurutan.

Langkah selanjutnya

Untuk memperdalam operasi array di MQL4, kami sarankan mempelajari konten berikut.

  1. ArrayResize fungsi:
    memahami cara mengubah ukuran array, memungkinkan operasi data dinamis.
  2. ArrayCopy fungsi:
    menyalin array secara efisien, memperluas jangkauan operasi data.
  3. Implementasi logika pengurutan kustom:
    teknik aplikasi untuk kondisi pengurutan yang kompleks.
  • Sebagai langkah selanjutnya, mari gunakan ArraySort secara praktis di EA Anda sambil merujuk pada artikel lain dan dokumentasi resmi!

Situs Referensi

ArraySort - Array Functions - MQL4 Reference…

EXPO blog 投資の翼

配列操作の重要性 MQL4における配列操作は、効率的なプログラム作成の鍵です。配列を使用することで、大量のデータを一元管…

※記事内に広告を含む場合があります。
佐川 直弘: MetaTraderを活用したFX自動売買の開発で15年以上の経験を持つ日本のパイオニア🔧

トレーデンシー大会'15世界1位🥇、EA-1グランプリ準優勝🥈の実績を誇り、ラジオ日経出演経験もあり!
現在は、株式会社トリロジーの役員として活動中。
【財務省近畿財務局長(金商)第372号】に登録
され、厳しい審査を経た信頼性の高い投資助言者です。


【主な活動内容】
・高性能エキスパートアドバイザー(EA)の開発と提供
・最新トレーディング技術と市場分析の共有
・FX取引の効率化と利益最大化を目指すプロの戦略紹介

トレーダー向けに役立つ情報やヒントを発信中!

This website uses cookies.