
Ah, Anda di sini. Selamat datang, wahai programmer MQL4 veteran. Anda adalah masternya `init()`, `start()`, dan `deinit()`. Anda bisa membuat Expert Advisor (EA) sambil tidur. Anda hafal di luar kepala cara kerja `OrderSend()` dan `OrderSelect()` di antara ribuan order *hedging* yang berantakan. Anda adalah raja di dunia MetaTrader 4.
Lalu, suatu hari, Anda iseng membuka MetaTrader 5. Anda buka MetaEditor-nya. Anda menekan F1 untuk melihat dokumentasi. Dan... Anda tidak mengerti apa-apa. Semuanya terasa salah. Semuanya terasa... bengkak dan rumit.
"Ini kan cuma MQL4 + 1?" pikir Anda naif. "Harusnya cuma upgrade, kan?"
SALAH.
Jika MQL4 adalah obeng dan tang yang praktis, MQL5 adalah bengkel perakitan pabrik BMW yang penuh robot. Keduanya sama-sama "alat", tapi skala dan filosofinya berbeda total. Ini bukan *upgrade*. Ini adalah *transplantasi otak*.
Artikel ini adalah pemandu wisata sinis Anda untuk menyeberangi jurang neraka antara MQL4 dan MQL5. Kami tidak akan menahan-nahan. Ini akan menyakitkan, tapi perlu. Bersiaplah, karena ilusi Anda tentang "upgrade sederhana" akan kami hancurkan sekarang.
Perbedaan fundamental pertama yang harus Anda terima adalah: MQL4 adalah bahasa skrip prosedural. MQL5 adalah bahasa *full-blown* Object-Oriented Programming (OOP).
Apa bedanya?
Kenapa ini penting? Karena MQL5 *memaksa* Anda berpikir seperti ini. Seluruh Standard Library-nya (Pustaka Standar) dibangun di atas konsep ini. Anda tidak bisa lagi seenaknya memanggil fungsi. Anda harus *membuat instance dari sebuah class* dulu. Ini adalah sumber 90% frustrasi awal Anda.
Hal pertama yang Anda sadari adalah fungsi-fungsi kesayangan Anda... HILANG. Lenyap. Tidak ada lagi.
Di MQL4, hidup itu sederhana:
init(): Dijalankan sekali saat EA di-load.deinit(): Dijalankan sekali saat EA di-unload.start(): Dijalankan setiap *tick* baru. (Untuk indikator, namanya start() juga, tapi perilakunya beda. Ah, masa-masa indah yang membingungkan).
Di MQL5, MetaQuotes memutuskan bahwa tiga fungsi tidak cukup. Kita, rupanya, butuh selusin fungsi (atau lebih) yang disebut Event Handlers.
Alih-alih tiga fungsi tadi, sekarang Anda punya *spesialisasi*:
OnInit(): Ini adalah init() Anda yang lama. Tempat Anda inisialisasi variabel.OnDeinit(const int reason): Ini adalah deinit() Anda, tapi sekarang lebih pintar. Dia memberi tahu Anda *alasan* kenapa EA di-unload (misal: Anda hapus manual, ganti *timeframe*, dll).OnTick(): Ini adalah start() Anda untuk Expert Advisors (EA). Dijalankan setiap *tick*.OnCalculate(...): Ini adalah start() Anda untuk Indikator. JANGAN salah pakai. Ini *hanya* untuk indikator.OnTimer(): Fungsi yang dipanggil berdasarkan *timer* yang Anda set. Ya, sekarang MQL5 punya *built-in timer* yang waras, tidak perlu *sleep-loop* bodoh lagi.OnTrade(): Fungsi yang dipanggil ketika ada *trade event* (order terisi, diubah, dihapus).OnTester(): Fungsi yang dipanggil di akhir *backtest*. Sangat berguna.OnChartEvent, OnBookEvent, dll).Kenapa ini menyebalkan? Karena kode MQL4 Anda tidak bisa langsung di-*paste*. Anda harus memecah fungsi start() Anda dan menaruh kodenya di tempat yang benar. Kenapa ini (sebenarnya) bagus? Karena kode Anda jadi jauh lebih rapi, terstruktur, dan efisien. EA Anda tidak perlu mengecek order setiap *tick* jika dia bisa bereaksi terhadap *trade event* via OnTrade(). Tapi ya, tetap saja menyebalkan di awal.
Seperti yang saya bilang, MQL5 itu OOP. Dan MetaQuotes dengan "baik hatinya" menyediakan Standard Library (CStandardLibrary) untuk membantu Anda. Ini adalah sekumpulan *class* yang sudah jadi untuk melakukan tugas-tugas umum.
Masalahnya? Ini seperti Anda minta dibelikan sepeda, tapi malah dikasih bongkahan komponen-komponennya dan disuruh rakit sendiri.
Contoh paling menyakitkan: Trading.
Di MQL4, untuk *entry* posisi, Anda cukup: OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "My EA", 12345, 0, clrGreen); Satu baris. Jelek, banyak angka, tapi berhasil.
Di MQL5... oh boy... bersiaplah.
#include <Trade/Trade.mqh>.CTrade. Misal: CTrade trade;MqlTradeRequest (permintaan) dan MqlTradeResult (hasil).CTrade: trade.Buy(0.1, NULL, _Symbol, Ask, Ask+100*_Point, Ask-100*_Point, "Komentar");
Kelihatannya lebih bersih, kan? Tapi ini adalah *tipuan*. Di baliknya, class CTrade itu melakukan puluhan cek yang Anda tidak sadari. Ini adalah *black box*. Dan jika Anda tidak suka *black box* (seperti kebanyakan *coder* MQL4), Anda harus belajar membuat *request* trading Anda sendiri, yang mana 10x lebih rumit daripada OrderSend() yang lama.
Inilah. Ini dia. Ini adalah Pembunuh EA #1. Jika Anda hanya ingat satu hal dari artikel ini, ingatlah ini.
MetaTrader 4 menggunakan sistem "Hedging".
MetaTrader 5 (secara default) menggunakan sistem "Netting".
Apa bedanya?
Di MQL4, setiap OrderSend() menciptakan "tiket" order yang unik.
BUY 0.1 lot EURUSD (Tiket #1).BUY 0.1 lot EURUSD lagi (Tiket #2).SELL 0.5 lot EURUSD (Tiket #3).Sekarang, di akun Anda ada TIGA order terpisah. Anda bisa tutup Tiket #1 dan membiarkan #2 dan #3 tetap terbuka. Logika EA *Martingale* dan *Grid* Anda bergantung pada ini.
Di MQL5 (Netting), hanya ada SATU posisi agregat per simbol.
BUY 0.1 lot EURUSD. Posisi Anda: LONG 0.1 lot.BUY 0.1 lot EURUSD lagi. Posisi Anda: LONG 0.2 lot (posisi lama di-avg).SELL 0.5 lot EURUSD. Posisi Anda: SHORT 0.3 lot (posisinya *dibalik*!).
Lihat masalahnya? SEMUA logika EA MQL4 Anda yang mengandalkan `OrderSelect()`, `OrdersTotal()`, dan me-manage tiket individual, langsung HANCUR LEBUR. Tidak bisa dipakai. Sampah.
"Tapi, tapi," kata Anda, "Broker saya sekarang menawarkan 'Hedging Account' di MT5!"
Benar. MetaQuotes akhirnya menyerah dan menambahkan mode *hedging* ke MT5. Tapi... (dan ini "tapi" yang besar), cara Anda *coding* untuk itu TETAP BEDA.
OrdersTotal() hilang. Gantinya PositionsTotal().OrderSelect() hilang. Gantinya PositionSelect() atau HistoryOrderSelect().OrderClose() hilang. Untuk menutup posisi, Anda harus mengirim order baru dengan arah berlawanan.
Oh, Anda pikir cuma *coder* EA yang menderita? Selamat datang, *coder* indikator!
Di MQL4, Anda punya satu fungsi start(). Anda punya *array* seperti Open[], High[], Low[], Close[]. Anda punya SetIndexBuffer(). Hidup gampang.
Di MQL5, Anda punya OnCalculate(). Dan MQL5 memberi Anda DUA versi OnCalculate() yang berbeda, hanya untuk membuat Anda bingung:
OnCalculate(const int rates_total, ...): Ini adalah mode "lama", mirip MQL4. Anda bekerja dengan *index* (0, 1, 2, 3...).OnCalculate(const datetime &time[], ...): Ini adalah mode "baru" yang (katanya) lebih efisien, di mana data diindeks berdasarkan *time series* (tanggal), bukan *array index*.
Selain itu, *indexing* *array* sekarang jadi isu. Di MQL4, Close[0] adalah *candle* sekarang. Di MQL5, Close[0] (secara *default*) adalah *candle* paling TUA di sejarah. Anda harus memanggil ArraySetAsSeries() di setiap *array* data Anda agar perilakunya kembali normal ([0] = sekarang). Kenapa? Entahlah. Mungkin para *engineer* di MetaQuotes sedang bosan hari itu.
Oke, setelah 1000+ kata penuh hinaan dan ratapan, apakah ada hal bagus di MQL5? Anehnya, ya. Banyak.
Strategy Tester di MQL4 itu mainan anak-anak. Lambat, satu *core*, dan tidak akurat. Strategy Tester di MQL5 adalah monster.
Hanya demi Tester-nya saja, migrasi ke MQL5 itu sepadan.
MQL5 adalah bahasa yang lebih dewasa. Anda dapat:
int mode = 1. Sekarang bisa pakai enum Mode {MODE_A, MODE_B};OnTimer(), OnBookEvent() (data *Depth of Market*), OnChartEvent() (reaksi terhadap klik mouse!).WebRequest()) dan bekerja dengan database SQL.
Ini mungkin pahit, tapi MQL4 sudah *sunset*. MetaQuotes tidak lagi mengembangkannya. Semua hal keren di masa depan—integrasi *Machine Learning*, *library* Python, *trading* di bursa saham—semua ada dan akan ada di MQL5. Bertahan di MQL4 berarti Anda memilih untuk jadi dinosaurus yang menunggu meteor.
Migrasi dari MQL4 ke MQL5 bukanlah "belajar 1-2 hari". Ini adalah komitmen untuk belajar ulang dari nol. Anda harus membuang banyak kebiasaan lama Anda, menelan ego Anda, dan menerima filosofi OOP yang rumit.
Perjalanan ini akan penuh dengan frustrasi. Anda akan maki-maki. Anda akan kangen dengan simplisitas MQL4. Anda akan menghabiskan jam-jam berharga hanya untuk mencari tahu kenapa trade.Buy() Anda gagal (jawabannya: mungkin karena Anda lupa set *magic number* via trade.SetExpertMagicNumber()).
Tapi di ujung terowongan gelap itu, ada cahaya. Cahaya itu adalah Strategy Tester yang super cepat, kode yang lebih bersih, dan platform yang siap untuk masa depan.
Proses belajar ini sendirian itu bikin frustrasi. Anda akan mentok, maki-maki, dan nyaris banting laptop. Untuk itulah komunitas ada. Kalau Anda mau lihat-lihat tips, trik, dan diskusi cerdas (atau sekadar curhat) soal dunia *coding* trading dan investasi yang kadang bikin gila ini...
...pastikan Anda follow akun sosial media INVEZTO. Kami menyajikan konten-konten edukatif yang relevan dengan penderitaan Anda sehari-hari sebagai trader dan developer. Siapa tahu, di sana Anda bisa menemukan pencerahan... atau setidaknya teman senasib. Selamat belajar (kembali)!
Multi-Level Grid Trading M...
Bitcoin: Asia Serves Toxic...
Pasar Forex Curang? ...
Gartley Pattern MQL5: The ...