
Bayangkan skenario ini. Anda adalah programmer MQL4 yang pongah. Anda sudah membuat ratusan EA. Anda tahu cara kerja iMA(), iRSI(), iStochastic() di luar kepala. "Ah, gampang," pikir Anda. "Saya mau bikin EA di MQL5, tinggal panggil iMA() kan?"
Lalu Anda menulis kode yang logis ini di MQL5:
double moving_average = iMA(_Symbol, _Period, 14, 0, MODE_SMA, PRICE_CLOSE, 0);
Print("Nilai MA saya adalah: ", moving_average);
Anda jalankan di tester. Dan log Anda berkata: "Nilai MA saya adalah: 4".
Anda bingung. "4? Apa maksudnya 4? Harga EURUSD kan 1.08000, harusnya MA-nya sekitar situ!"
Anda coba lagi. Log-nya bilang: "Nilai MA saya adalah: 8". Anda ganti timeframe. "Nilai MA saya adalah: 12".
Selamat datang, sobat. Anda baru saja bertemu iblis pertama Anda di MQL5. Angka yang Anda lihat itu (4, 8, 12) bukanlah nilai Moving Average. Itu adalah "HANDLE".
Jika MQL4 adalah restoran di mana Anda pesan (iMA) dan langsung dapat makanan (nilai MA), MQL5 adalah birokrasi pemerintahan. Anda "pesan" iMA, dan Anda hanya dapat nomor antrean (Handle). Anda kemudian harus membawa nomor antrean itu, beserta formulir yang tepat (CopyBuffer) dan wadah Anda sendiri (array), ke loket yang berbeda untuk *akhirnya* mendapatkan data Anda.
Ini adalah panduan (sarkastik tapi jujur) untuk bertahan hidup di dunia baru yang gila ini. Ini adalah cara memanggil indikator di MQL5.
Sebelum kita belajar "caranya", kita harus paham "kenapa"-nya. Kenapa MetaQuotes mengubah sesuatu yang begitu sederhana (1 baris kode) menjadi proses 3-langkah yang rumit? Apakah mereka benci kita? Apakah mereka ingin kita menderita?
Jawabannya (anehnya): Performa.
Di MQL4, saat Anda memanggil iMA(...) di dalam OnTick(), indikator itu (mungkin) akan *dihitung ulang* setiap *tick*. Di Strategy Tester, ini adalah bencana. Jika Anda menguji 10 tahun data, fungsi iMA Anda akan dihitung jutaan, bahkan miliaran kali. Lambat.
Di MQL5, model "Handle" ini jauh lebih cerdas (dan jauh lebih tidak ramah pengguna).
iMA di OnInit() (hanya SEKALI).OnTick(), Anda tidak lagi "menghitung". Anda hanya "menyalin" data yang sudah jadi. Anda memanggil CopyBuffer().
Ini seperti film Hollywood. Semua adegan ledakan (kalkulasi indikator) sudah direkam sebelumnya. EA Anda hanya menonton (menyalin) hasilnya. Hasilnya? *Backtest* MQL5 bisa ribuan kali lebih cepat daripada MQL4.
Jadi ya, MetaQuotes mengorbankan kewarasan kita di depan editor kode demi kecepatan kilat di Strategy Tester. Adil? Tidak. Tapi kita harus hidup dengannya.
Mari kita lupakan MQL4. Ini adalah mantra baru Anda. Untuk mendapatkan SATU nilai indikator, Anda butuh TIGA langkah. Selalu.
CopyBuffer)Mari kita bedah satu per satu, menggunakan kasus "Saya cuma mau nilai MA-14 yang terbaru."
Handle adalah *resource*. Anda tidak mau memintanya setiap *tick*. Itu boros. Anda memintanya SEKALI saat EA pertama kali di-load, yaitu di dalam fungsi OnInit(). Dan Anda menyimpannya di variabel global.
int g_ma_handle; // Variabel global untuk menyimpan handle
void OnInit() { g_ma_handle = iMA(_Symbol, _Period, 14, 0, MODE_SMA, PRICE_CLOSE); if(g_ma_handle == INVALID_HANDLE) { Print("Error: Gagal membuat handle MA! Kode error: ", GetLastError()); return(INIT_FAILED); } return(INIT_SUCCEEDED); }
Perhatikan: Fungsi iMA, iRSI, iMACD, dll. terlihat persis seperti di MQL4, tapi *return value*-nya adalah int (handle), BUKAN double (nilai). Dan Anda *wajib* mengecek INVALID_HANDLE. Jika gagal, EA Anda tidak boleh lanjut.
Di mana MQL5 akan menaruh data MA Anda? Dia tidak akan memberikannya langsung. Anda harus menyediakan "wadah" (sebuah array) untuk dia isi.
Di dalam OnTick() (karena kita mau data terbaru setiap *tick*), kita siapkan wadahnya:
double ma_buffer[]; // Ini adalah 'ember' kita
Sekarang, ada satu lagi "jebakan" MQL5 yang brilian. Secara *default*, array di MQL5 di-indeks dari "paling tua" ke "paling baru". Artinya ma_buffer[0] adalah nilai MA 5 tahun lalu. Ini Goblok. Kita mau ma_buffer[0] adalah nilai MA *sekarang*.
Untuk membaliknya, kita harus panggil "jimat" ini:
ArraySetAsSeries(ma_buffer, true);
JANGAN PERNAH LUPAKAN BARIS INI. 90% error logika MQL5 pemula adalah karena lupa ArraySetAsSeries.
Sekarang kita punya Handle (g_ma_handle) dan Ember (ma_buffer). Saatnya pergi ke loket CopyBuffer.
void OnTick() { // Langkah 2: Siapkan Ember dan Balikkan Arahnya double ma_buffer[]; ArraySetAsSeries(ma_buffer, true); // Langkah 3: Minta data! if(CopyBuffer(g_ma_handle, 0, 0, 1, ma_buffer) < 1) { Print("Error: Gagal menyalin data MA!"); return; } // Akhirnya... AKHIRNYA! double nilai_ma_terbaru = ma_buffer[0]; Print("Nilai MA terbaru adalah: ", nilai_ma_terbaru); }
Mari kita bedah monster CopyBuffer itu:
CopyBuffer(handle, buffer_number, start_pos, count, target_array)
handle (g_ma_handle): Nomor antrean kita dari OnInit().buffer_number (0): Ini krusial. Indikator bisa punya BANYAK garis (buffer). MA sederhana cuma punya 1 (buffer 0). MACD punya 2 (garis utama 0, garis sinyal 1). Stochastic punya 2 (%K 0, %D 1). Anda harus tahu buffer mana yang Anda mau.start_pos (0): Mau mulai salin data dari *candle* mana? 0 artinya "mulai dari *candle* sekarang".count (1): Mau berapa *candle*? Karena kita cuma butuh nilai *terbaru*, kita minta 1 saja.target_array (ma_buffer): Ember kita. Di sinilah datanya akan ditaruh.Fungsi CopyBuffer mengembalikan jumlah data yang *berhasil* disalin. Jika kita minta 1 (count=1) tapi dia mengembalikan kurang dari 1 (misal 0 atau -1), artinya gagal. Makanya kita cek if(CopyBuffer(...) < 1).
Dan *voila*. Setelah 3 langkah birokrasi ini, variabel nilai_ma_terbaru Anda akhirnya berisi apa yang Anda inginkan dari awal.
Oh, Anda pikir sudah selesai? Itu tadi baru indikator *built-in*. Bagaimana jika Anda *download* indikator keren dari internet, misal "SuperTrend_V3_Final_Real.ex5", dan Anda mau memakainya di EA Anda?
Selamat datang di iCustom(). Logikanya SAMA PERSIS (3 Langkah: Handle, Ember, Kopi), tapi Handle-nya jauh lebih... "rewel".
int g_supertrend_handle;
void OnInit() { // Ini adalah neraka parameter g_supertrend_handle = iCustom(_Symbol, _Period, "NamaFileIndikator", // Mulai parameter input indikator... 10.0, // Misal: Input 1 (ATR Period) 3.0, // Misal: Input 2 (ATR Multiplier) true, // Misal: Input 3 (Use Alerts?) ... // dan seterusnya... ); }
H3: Dosa-Dosa Umum `iCustom()`Di sinilah 99% orang gagal:
Nama File Salah: "SuperTrend_V3_Final_Real.ex5". Jika indikator Anda ada di folder `Indicators/MyStuff`, Anda harus menulis: `"MyStuff\\SuperTrend_V3_Final_Real"`. (Perhatikan: tanpa .ex5, dan pakai *double-backslash* `\\`.)Urutan Parameter Salah: Parameter input (10.0, 3.0, true...) harus 100% SAMA PERSIS urutannya dengan yang ada di tab "Inputs" indikator kustom Anda. Salah urutan satu saja? INVALID_HANDLE.Tipe Data Parameter Salah: Jika inputnya minta `int` tapi Anda kasih `double` (10.0 padahal harusnya 10), bisa jadi gagal.Nomor Buffer Salah: Ini yang paling parah. Katakanlah indikator SuperTrend Anda menggambar 2 garis (garis *uptrend* dan garis *downtrend*) dan mungkin beberapa panah. Ini bisa jadi 4-5 *buffer* yang berbeda!
Buffer 0: Garis UptrendBuffer 1: Garis DowntrendBuffer 2: Panah AtasBuffer 3: Panah BawahJika Anda panggil CopyBuffer(g_supertrend_handle, 0, ...) padahal Anda mau data Panah Bawah (Buffer 3), data Anda akan salah total.
Pro Tip: Untuk tahu nomor buffer indikator kustom, pasang indikatornya di chart, lalu buka jendela "Data Window" (Ctrl+D). Arahkan kursor Anda ke garis indikator di chart. Data Window akan menunjukkan nama *buffer* dan nilainya. Hitung dari atas, mulai dari 0.
H2: Kesimpulan: Sakit, Tapi Penting (Dan Jauh Lebih Cepat)Mari kita tarik napas. Ya, ini rumit. Ya, ini birokratis. Ya, ini adalah kemunduran besar dari simplisitas MQL4.
Tapi (dan ini "tapi" yang penting), ini adalah cara kerja yang "benar" dalam dunia *programming* performa tinggi. Anda dipaksa untuk me-manage *resources* (handle) dan memori (array) secara eksplisit. Anda dipaksa berpikir tentang efisiensi (panggil di OnInit, bukan di OnTick). Anda tidak lagi diperlakukan seperti anak kecil yang semua kodenya dijalankan begitu saja.
Migrasi ke MQL5 memaksa Anda untuk berhenti menjadi "skripter" dan mulai menjadi "programmer". Prosesnya menyakitkan, tapi hasilnya adalah kode yang (secara teori) lebih bersih, lebih terstruktur, dan yang paling penting: *di-backtest* ribuan kali lebih cepat.
Jadi, jangan banting laptop Anda. Peluklah penderitaan ini. Kuasai tiga langkah ini—Handle, Array, CopyBuffer—dan Anda akan baik-baik saja.
Tentu saja, perjalanan menguasai MQL5 penuh dengan "jebakan" teknis seperti ini. Jika Anda adalah tipe orang yang suka membedah hal-hal rumit, mencari cara paling efisien, dan tidak takut pada dokumentasi teknis... Anda adalah tipe kami.
Untuk diskusi teknis lebih lanjut, tips *coding* MQL5, dan konten edukasi seputar trading dan investasi yang tidak men-dewa-kan hal-hal gampang, pastikan Anda follow akun sosial media INVEZTO. Kami menyajikan konten menarik yang akan mengasah otak Anda, bukan hanya dompet Anda. Sampai jumpa di neraka *pointer* berikutnya!
Multi-Level Grid Trading M...
Bitcoin: Asia Serves Toxic...
Pasar Forex Curang? ...
Gartley Pattern MQL5: The ...