- 1 1. Pendahuluan
- 2 2. Apa itu fungsi ArraySort?
- 3 3. Cara Penggunaan Dasar
- 4 4. Penerapan fungsi ArraySort
- 5 5. Batasan dan Catatan Fungsi ArraySort
- 6 6. Contoh Penggunaan Praktis
- 7 7. Pertanyaan yang Sering Diajukan (FAQ)
- 7.1 Bagaimana cara menyortir hanya sebagian array?
- 7.2 Penyortiran menurun tidak berfungsi dengan benar. Apa yang harus dilakukan?
- 7.3 Apakah ada cara untuk memproses array multidimensi secara efisien?
- 7.4 Apakah ada cara untuk mencegah kesalahan ketika array kosong?
- 7.5 Apakah Anda dapat menangani nilai duplikat dalam array dengan benar?
- 8 8. Ringkasan dan langkah selanjutnya
- 9 Situs Referensi
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
- array[]:
Tentukan array yang akan diurutkan. Array ini harus satu dimensi. - count:
Tentukan jumlah elemen yang akan diurutkan. Secara default, seluruh array (WHOLE_ARRAY
) menjadi target. - start:
Tentukan indeks mulai pengurutan. Nilai default 0 (awal array). - 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.
- 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
- 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
- Pilih tipe data yang tepat:
memilih tipe data yang tepat untuk mengoptimalkan penggunaan memori (misalnya: gunakanfloat
daripadadouble
).
5. Batasan dan Catatan Fungsi ArraySort
Batasan Terkait Tipe Array
ArraySort
fungsi hanya dapat digunakan untuk tipe data tertentu. Harap perhatikan poin-poin berikut.
- 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
- 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.
- Jika array kosong:
Jika array kosong (ArraySize(array) == 0) maka tidak akan disortir.
double emptyArray[];
ArraySort(emptyArray); // Tidak disortir
- 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.
- Sort sebagian:
Dengan menyortir hanya bagian yang diperlukan, dapat mengurangi kompleksitas.
ArraySort(array, 50); // Menyortir 50 pertama
- Filter data sebelumnya:
Hapus data tidak perlu sebelum sort.
ArrayResize(array, newSize);
- 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.
ArrayResize
fungsi:
memahami cara mengubah ukuran array, memungkinkan operasi data dinamis.ArrayCopy
fungsi:
menyalin array secara efisien, memperluas jangkauan operasi data.- 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…
配列操作の重要性 MQL4における配列操作は、効率的なプログラム作成の鍵です。配列を使用することで、大量のデータを一元管…