Our professional Customer Supports waiting for you! Contact now
Everyday: 09:00am - 10:00pm
By Invezto in Trading Insight on 02 Dec, 2025

Membuat Sinyal Kustom (CSignalBase) di MQL5

Membuat Sinyal Kustom (CSignalBase) di MQL5

MQL5 Wizard Payah? Ini Cara "Bongkar Paksa" & Bikin Modul Sinyal Kustom Anda Sendiri

Di episode sebelumnya dari saga "Mencoba Waras dengan MQL5", kita sudah membedah MQL5 Standard Library (SL). Kita sudah melihat bagaimana "MQL5 Wizard" yang ajaib itu bisa menciptakan EA fungsional dalam 5 menit. Kita juga sudah menyadari bahwa "sihir" itu adalah tipuan.

Wizard itu hanyalah antarmuka cantik yang merakit "Komponen LEGO" standar: `CSignalMA`, `CMoneyFixedLot`, `CTrailingFixedPips`, dan mengikat semuanya dengan lakban bernama `CExpert`.

Lalu Anda mencoba *backtest* EA "ajaib" itu. Dan Anda sadar... sinyalnya lambat. Anda gali lebih dalam. Anda sadar bahwa `CSignalMA` bawaan MetaQuotes—Komponen LEGO resmi mereka—dirancang oleh pengacara. Ia hanya mengecek *cross* di *candle* yang sudah DITUTUP (bar `[1]`). Bukan di *candle* yang sedang berjalan (bar `[0]`).

"Tapi saya adalah *trader* agresif!" teriak Anda. "Saya mau sinyal di bar `[0]`! Saya mau profit *sekarang*!"

Anda buka MQL5 Wizard. Anda cari kotaknya. "Checkbox untuk MA cross di bar [0]". Tidak ada. "Checkbox untuk sinyal RSI di atas 50 DAN MA di atas 200". Tidak ada. "Checkbox untuk sinyal Kustom SuperTrend V8 saya". Jelas tidak ada.

Selamat. Anda sudah menemukan "Borgol Emas" itu. *Framework* Standard Library itu ternyata kaku. Ia kuat, tapi bodoh. Ia efisien, tapi tidak fleksibel.

Jadi, apa solusinya? Buang semua 5000 baris kode SL dan tulis dari nol seperti di MQL4? Bisa, tapi itu Goblok. Anda akan kehilangan *backtester* super cepat dan semua struktur rapi yang sudah susah payah kita pelajari.

Solusi yang "benar"—solusi seorang arsitek—adalah: Buat Komponen LEGO kustom Anda sendiri yang 100% pas dengan Pabrik Perakitan MetaQuotes.

Artikel ini adalah panduan teknis (dengan nada sarkasme yang pas) untuk membongkar "cetakan" sinyal MetaQuotes (`CSignalBase`) dan membuat sinyal Anda sendiri yang jauh lebih pintar, lebih cepat, dan lebih "Anda".

"Borgol Emas" itu Sebenarnya Adalah "Cetakan LEGO"

Hal pertama yang harus Anda pahami adalah: `CExpert` (Si Manajer Pabrik) itu dirancang untuk bisa diperluas. MetaQuotes tidak sebodoh itu. Mereka tahu sinyal bawaan mereka itu standar.

Mereka menggunakan keajaiban OOP bernama Polimorfisme. Si Manajer `CExpert` tidak peduli dengan kelas `CSignalMA` atau `CSignalRSI`. Dia hanya peduli pada SATU hal: kelas induk bernama CSignalBase.

CSignalBase adalah "Cetakan LEGO" universal. Ini adalah *kontrak* atau *blueprint* yang berkata: 
"Hei, saya tidak peduli logikamu apa. Kamu mau pakai 10 MA, 5 RSI, dan 3 ZigZag, itu urusanmu. TAPI... jika kamu mau 'dicolok' ke saya (CExpert), kamu HARUS punya bentuk yang pas. Kamu HARUS menyediakan fungsi-fungsi standar yang saya (CExpert) bisa panggil."

Tugas kita? Sederhana. Kita buat kelas baru, kita "tempel" di cetakan CSignalBase, dan kita isi "lubang-lubang" yang wajib diisi.

Proses ini disebut Inheritance (Pewarisan). Kita tidak menulis ulang 1000 baris. Kita *mewarisi* 990 baris "plumbing" membosankan dari CSignalBase, dan kita hanya menulis 10 baris "otak" sinyal kita sendiri.

Studi Kasus: Membuat `CSignalMA_Aggressive` (Cross di Bar [0])

Mari kita lakukan. Kita akan membuat sinyal MA Cross kita sendiri yang jauh lebih baik:

  1. Cek *cross* di *candle* yang sedang berjalan (bar `[0]`).
  2. Jauh lebih agresif dan lebih cepat merespon.

 

Kita akan membuat file baru, CSignalMA_Aggressive.mqh. Siap-siap, ini teknis.

Langkah 1: Deklarasi Kelas (Mencetak dari `CSignalBase`)

Hal pertama adalah memberitahu MQL5 bahwa kita membuat kelas baru yang "patuh" pada cetakan CSignalBase.

//--- Sertakan 'cetakan' induknya #include <Expert\Signal\SignalBase.mqh> //--- Deklarasikan kelas baru kita //--- Kita bilang: "Kelas ini adalah ANAK dari CSignalBase" class CSignalMA_Aggressive : public CSignalBase {     //--- Jeroan kita taruh di sini nanti };

Dengan : public CSignalBase, kita baru saja mewarisi puluhan fungsi. 90% pekerjaan selesai. Serius.

Langkah 2: "Jeroan" - Apa yang Kita Butuhkan? (`private`)

Sekarang, pikirkan. Untuk membuat sinyal MA Cross, apa yang kita butuhkan di "dapur" (private) kita?

  1. Handle (nomor antrean) untuk MA Cepat.
  2. Handle (nomor antrean) untuk MA Lambat.
  3. "Ember" (array) untuk menampung data MA Cepat.
  4. "Ember" (array) untuk menampung data MA Lambat.

 

Jadi, kita tambahkan ini di dalam kelas kita:

class CSignalMA_Aggressive : public CSignalBase { protected:     //--- Parameter (biar bisa di-tweak dari luar)     int              m_ma_fast_period;     int              m_ma_slow_period; private:     //--- "Jeroan" teknis kita     int              m_ma_fast_handle;     int              m_ma_slow_handle;     double            m_ma_fast_buffer[];     double            m_ma_slow_buffer[]; };

Langkah 3: Menghidupkan Mesin (`Constructor` & `Init`)

Saat "benda" (objek) kita ini pertama kali dibuat (`new`), kita harus mendapatkan *handle-handle* birokratis itu. Kita lakukan ini di fungsi `Init()`.

//--- Ini adalah fungsi "Constructor", dipanggil saat 'new' void CSignalMA_Aggressive::CSignalMA_Aggressive() {     //--- Set default value     m_ma_fast_period = 10;     m_ma_slow_period = 20; } //--- Ini adalah fungsi Inisialisasi (diwarisi dari CSignalBase) //--- Kita 'override' untuk mengisi logika kita bool CSignalMA_Aggressive::Init(string symbol, ENUM_TIMEFRAMES period) {     //--- Panggil dulu Init() punya 'Induk', ini WAJIB     if(!CSignalBase::Init(symbol, period)) return(false);     //--- Sekarang, minta 'nomor antrean' MA kita     m_ma_fast_handle = iMA(symbol, period, m_ma_fast_period, 0, MODE_SMA, PRICE_CLOSE);     m_ma_slow_handle = iMA(symbol, period, m_ma_slow_period, 0, MODE_SMA, PRICE_CLOSE);     //--- Cek apakah kita dapat 'nomor antrean' yang valid     if(m_ma_fast_handle==INVALID_HANDLE || m_ma_slow_handle==INVALID_HANDLE)     {         Print("Gagal membuat handle MA!");         return(false);     }     //--- Jangan lupa balikkan 'ember' kita!     ArraySetAsSeries(m_ma_fast_buffer, true);     ArraySetAsSeries(m_ma_slow_buffer, true);     return(true); }

Oke, mesin kita sudah siap. Handle sudah di tangan. Ember sudah dibalikkan. Sekarang... bagian utamanya.

Langkah 4: OTAKNYA! (`override virtual bool CheckSignal()`)

Ini dia. Ini adalah fungsi "wajib" yang dicari oleh `CExpert`. Si Manajer Pabrik (`CExpert`) akan memanggil fungsi ini di setiap *tick*. Tugas kita adalah mengisinya dengan logika kita dan mengembalikan jawaban yang sederhana: SIGNAL_BUY (100), SIGNAL_SELL (200), atau SIGNAL_NONE (0).

//--- Ini adalah OTAK dari sinyal kita //--- Kita 'override' (mengganti) fungsi 'virtual' dari CSignalBase virtual bool CSignalMA_Aggressive::CheckSignal() {     //--- Reset sinyal kita     m_signal_dir = SIGNAL_NONE;     //--- Minta data: Salin 2 'candle' terakhir (bar [0] dan [1])     if(CopyBuffer(m_ma_fast_handle, 0, 0, 2, m_ma_fast_buffer) < 2)         return(false); // Gagal salin, data belum siap     if(CopyBuffer(m_ma_slow_handle, 0, 0, 2, m_ma_slow_buffer) < 2)         return(false); // Gagal salin, data belum siap     //--- Ini dia, LOGIKA KUSTOM KITA!     double fast_now = m_ma_fast_buffer[0];     double fast_prev = m_ma_fast_buffer[1];     double slow_now = m_ma_slow_buffer[0];     double slow_prev = m_ma_slow_buffer[1];     //--- Cek Sinyal BUY (Cross dari bawah ke atas DI BAR SEKARANG)     if(fast_now > slow_now && fast_prev < slow_prev)     {         m_signal_dir = SIGNAL_BUY; // SET SINYAL!         return(true);     }     //--- Cek Sinyal SELL (Cross dari atas ke bawah DI BAR SEKARANG)     if(fast_now < slow_now && fast_prev > slow_prev)     {         m_signal_dir = SIGNAL_SELL; // SET SINYAL!         return(true);     }     //--- Tidak ada sinyal     return(true); // Berhasil cek, tapi tidak ada sinyal }

SELESAI. Simpan file CSignalMA_Aggressive.mqh Anda. Komponen LEGO kustom Anda sudah siap.

"Mencolokkan" LEGO Kustom ke Pabrik EA Anda

Ini adalah bagian yang paling memuaskan. Bagaimana cara memakai "mainan" baru kita?

Buka file `.mq5` utama EA Anda (yang dibuat oleh Wizard, atau yang Anda buat manual).

Langkah 1: Impor "Mainan" Anda

Di bagian atas, di bawah semua #include lainnya, tambahkan:

#include "CSignalMA_Aggressive.mqh"

Langkah 2: Ganti Komponen di `OnInit()`

Cari fungsi OnInit(). Anda akan menemukan baris yang dibuat oleh Wizard, yang terlihat seperti ini:

//--- HAPUS BARIS LAMA INI! --- // m_signal = new CSignalMA(Signal_MA_PeriodFast, Signal_MA_PeriodSlow, ...);

Sekarang, GANTI baris itu dan "colokkan" kelas kustom kita:

//--- PASANG KELAS KUSTOM KITA --- m_signal = new CSignalMA_Aggressive(); //--- (Opsional) Kita bisa set parameternya jika kita buat fungsi public-nya // m_signal.SetMAPeriods(Signal_MA_PeriodFast, Signal_MA_PeriodSlow);

DAN... SELESAI.

Hanya itu. Anda tidak perlu menyentuh OnTick(). Anda tidak perlu menyentuh CTrade. Anda tidak perlu menyentuh `Money Management`.

Berkat keajaiban Polimorfisme, Si Manajer `CExpert` tidak tahu dan tidak peduli bahwa m_signal sekarang adalah sinyal kustom Anda. Dia hanya tahu cara memanggil m_signal.CheckSignal()—fungsi yang *sama*—dan dia akan mendapatkan jawaban yang dia butuhkan. Tapi sekarang, jawaban itu datang dari OTAK kustom Anda, bukan dari otak standar MetaQuotes.

Langit Adalah Batasnya: Ini Baru Permulaan!

Sekarang Anda tahu rahasianya. CSignalBase adalah kunci untuk membuka seluruh *framework*.

Apa yang bisa Anda lakukan sekarang?

  • CSignalRSI_MA_Stoch: Buat satu kelas sinyal yang menggabungkan TIGA indikator sekaligus. Logika Anda, aturan Anda.
  • CSignalMultiTimeframe: Buat kelas sinyal yang berjalan di chart M15, tapi datanya (iMA, iRSI) diambil dari H1 dan D1.
  • CSignalSuperTrend: Bungkus indikator kustom favorit Anda (`iCustom`) di dalam kelas CSignalBase. Sekarang indikator *download* Anda bisa "dicolok" ke *framework* `CExpert`!

 

Logika yang sama persis berlaku untuk departemen lain:

  • Benci `CMoneyFixedLot`? Buat CMyMoney_AntiMartingale Anda sendiri yang mewarisi CMoneyBase.
  • Benci `CTrailingFixedPips`? Buat CMyTrailing_Chandelier Anda sendiri yang mewarisi CTrailingBase.

 

Kesimpulan: Berhenti Jadi "Pengguna", Mulailah Jadi "Arsitek"

MQL5 Standard Library bukanlah "penjara" atau "borgol" seperti yang kita keluhkan di awal. Itu adalah "perancah" (scaffolding). Itu adalah landasan peluncuran.

MQL5 Wizard bagus untuk membuat prototipe dalam 5 menit. Tapi *kekuatan sebenarnya* datang dari pemahaman bahwa setiap komponen yang dibuat Wizard dapat—dan *harus*—diganti dengan komponen kustom Anda yang lebih unggul.

Menguasai cara mewarisi CSignalBase adalah langkah pertama Anda dari seorang "pengguna" MQL5 menjadi seorang "arsitek" *algorithmic trading* sejati. Anda tidak lagi dibatasi oleh apa yang MetaQuotes *berikan* kepada Anda; Anda sekarang dibatasi *hanya* oleh apa yang bisa Anda *coding*.

Tentu saja, perjalanan menjadi arsitek ini rumit. Butuh ide, butuh *sparring partner* untuk menguji logika, dan butuh komunitas yang sama-sama "gila" *coding*. Jika Anda menikmati diskusi teknis mendalam yang membongkar mesin dari dalam...

...Anda tahu di mana harus mencari kami. Pastikan Anda follow akun sosial media INVEZTO! Kami adalah tempat para *developer* dan *trader* serius berkumpul untuk membedah strategi, berbagi *coding* cerdas, dan (tentu saja) menertawakan keanehan pasar. Dapatkan info menarik lainnya dan mari kita bangun sesuatu yang hebat.

You may also like

Related posts