Halo sobat trader! Pada kesempatan kali ini, kita akan belajar cara membuat Expert Advisor (EA) sederhana dengan menggunakan teknik MA Crossing di MetaTrader 4. Mari kita mulai dengan mendefinisikan variabel input yang diperlukan.
//--- parameter input input int period_ma_fast = 8; //Periode MA Cepat input int period_ma_slow = 20; //Periode MA Lambat input double takeProfit = 20.0; //Take Profit (pips) input double stopLoss = 20.0; //Stop Loss (pips) input double lotSize = 0.10; //Ukuran Lot input double minEquity = 100.0; //Equity Minimum ($) input int Slippage = 3; //Slippage input int MagicNumber = 889; //Nomor Magis
Selanjutnya, kita akan mendefinisikan variabel global. Variabel dengan cakupan global ini akan dikenal dan dapat diakses oleh semua fungsi.
//Variabel Global double myPoint = 0.0; int mySlippage = 0; int BuyTicket = 0; int SellTicket = 0;
Ketika EA dieksekusi, fungsi pertama yang dijalankan adalah OnInit(). Fungsi ini sering digunakan untuk memvalidasi dan menginisialisasi variabel global yang akan digunakan.
int OnInit() { //validasi input, selalu lakukan validasi saat inisialisasi data input if (period_ma_fast >= period_ma_slow || takeProfit < 0.0 || stopLoss < 0.0 || lotSize < 0.01 || minEquity < 10){ Alert("PERINGATAN - Data input awal tidak valid"); return (INIT_PARAMETERS_INCORRECT); } double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); if(lotSize<min_volume) { string pesan =StringFormat("Volume lebih kecil dari batas yang dibolehkan yaitu %.2f",min_volume); Alert (pesan); return(INIT_PARAMETERS_INCORRECT); } myPoint = GetPipPoint(Symbol()); mySlippage = GetSlippage(Symbol(),Slippage); return(INIT_SUCCEEDED); }
Ketika harga pasar bergerak (tick), fungsi OnTick() akan dipanggil dan menjalankan semua instruksi/fungsi yang terdapat dalam blok fungsi OnTick().
Di dalam fungsi OnTick() akan memanggil berbagai fungsi lainnya.
Dimulai dengan memanggil fungsi checkMinEquity() untuk mengontrol kecukupan equity trading. Jika dana equity mencukupi (melebihi equity minimum), akan dilanjutkan dengan deklarasi variabel sinyal dan diikuti dengan pemanggilan fungsi NewCandle() yang berfungsi untuk memberi tahu ketika candle baru terbentuk.
Fungsi getSignal() akan membaca nilai pada kedua indikator moving average dan mengembalikan informasi sinyal apakah terjadi cross naik atau turun sebagai sinyal untuk beli/jual.
Berdasarkan informasi sinyal ini, akan diteruskan ke fungsi transaction() untuk membuka posisi beli atau jual.
Dan akan dilanjutkan dengan memanggil fungsi setTPSL() yang berfungsi untuk mengatur harga take profit dan stop loss.
Jika equity tidak memenuhi persyaratan minimum, akan muncul alert dan EA ini akan dihentikan.
void OnTick() { if (cekMinEquity()){ int signal = -1; bool isNewCandle = NewCandle(Period(), Symbol()); signal = getSignal(isNewCandle); transaction(isNewCandle, signal); setTPSL(); }else{ //Hentikan trading, karena equity tidak cukup Print("EA akan segera diberhentikan karena equity tidak mencukup"); } }
Fungsi untuk setTPSL()
void setTPSL(){ int tOrder = 0; string strMN = "", pair = ""; double sl = 0.0, tp = 0.0; pair = Symbol(); tOrder = OrdersTotal(); for (int i=tOrder-1; i>=0; i--){ bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); strMN = IntegerToString(OrderMagicNumber()); if (StringFind(strMN, IntegerToString(MagicNumber), 0) == 0 && StringFind(OrderSymbol(), pair, 0) == 0 ){ if (OrderType() == OP_BUY && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){ if (takeProfit > 0) { tp = OrderOpenPrice() + (takeProfit * myPoint); }else{ tp = OrderOpenPrice(); } if (stopLoss > 0) { sl = OrderOpenPrice() - (stopLoss * myPoint); }else{ sl = OrderStopLoss(); } if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){ if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrBlue)){ Print ("OrderModify Berhasil"); } } } if (OrderType() == OP_SELL && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){ if (takeProfit > 0) { tp = OrderOpenPrice() - (takeProfit * myPoint); }else{ tp = OrderOpenPrice(); } if (stopLoss > 0) { sl = OrderOpenPrice() + (stopLoss * myPoint); }else{ sl = OrderStopLoss(); } if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){ if (OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrRed)){ Print ("OrderModify Berhasil"); } } } }//akhir if magic number && pair }//akhir for }
Untuk edukasi dan berbagi ilmu di Indonesia, silakan bergabung di grup telegram kami t.me/codeMQL
Jika Anda mencari aplikasi untuk mendukung trading Anda, silakan unduh aplikasi SignalForex kami di Play Store.
https://play.google.com/store/apps/details?id=com.autobotfx.signalforex
Postingan terkait
- MQL5 Wizard: Mengoptimalkan Sinyal Perdagangan dengan Morning/Evening Stars dan MFI
- MQL5 Wizard: Membuat EA dengan Sinyal Trading Berdasarkan Pola Morning/Evening Stars dan Stochastic
- Menggunakan MQL5 Wizard untuk Sinyal Perdagangan: Pola Hammer/Hanging Man dan RSI
- MQL5 Wizard: Membuat Expert Advisor dengan Sinyal Trading 3 Black Crows/3 White Soldiers dan MFI
- MQL5 Wizard: Membuat Expert Advisor dengan Pola Candlestick 3 Black Crows/3 White Soldiers dan RSI