Dalam post kali ini, kita akan membincangkan tentang cara membuat Expert Advisor (EA) untuk strategi 2 MA Crossing di MetaTrader 4. Mari kita mulakan dengan mendefinisikan input parameter.
//--- parameter input input int period_ma_cepat = 8; //Tempoh MA Cepat input int period_ma_lambat = 20;//Tempoh MA Lambat input double takeProfit = 20.0; //Ambil Untung (pips) input double stopLoss = 20.0 //Had Kerugian (pips) input double saizLot = 0.10; //Saiz Lot input double ekuitiMin = 100.0;//Min. Ekuiti ($) input int Slippage = 3; //Slippage input int MagicNumber = 889; //Nombor Ajaib
Seterusnya, kita akan mendefinisikan variabel global. Variabel dengan skop global ini akan dikenali atau dapat diakses oleh semua fungsi.
//Variabel Global double myPoint = 0.0; int mySlippage = 0; int BuyTicket = 0; int SellTicket = 0;
Apabila EA dilaksanakan, fungsi pertama yang akan dijalankan adalah OnInit(). Oleh itu, kita sering menggunakan fungsi ini untuk mengesahkan dan memulakan variabel global yang akan digunakan.
int OnInit() { //validasi input, sebaiknya kita selalu melakukan validasi pada initialisasi data input if (period_ma_cepat >= period_ma_lambat || takeProfit < 0.0 || stopLoss < 0.0 || saizLot < 0.01 || ekuitiMin < 10) { Alert("AMARAN - Data input tidak sah"); return (INIT_PARAMETERS_INCORRECT); } double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); if(saizLot<min_volume) { string pesan =StringFormat("Volume lebih kecil dari batas yang dibolehkan iaitu %.2f",min_volume); Alert (pesan); return(INIT_PARAMETERS_INCORRECT); } myPoint = GetPipPoint(Symbol()); mySlippage = GetSlippage(Symbol(),Slippage); return(INIT_SUCCEEDED); }
Ketika harga pasaran bergerak (tick), fungsi OnTick() akan dipanggil dan melaksanakan semua arahan / fungsi yang terdapat dalam blok fungsi ini.
Di dalam fungsi OnTick(), pelbagai fungsi lain akan dipanggil.
Kita mula dengan memanggil fungsi checkMinEquity() untuk mengawal kesesuaian ekuiti perdagangan. Jika dana ekuiti mencukupi (melebihi ekuiti minimum), ia akan diikuti dengan deklarasi variabel isyarat dan seterusnya memanggil fungsi NewCandle() yang berfungsi untuk memaklumkan apabila lilin baru terbentuk.
Fungsi getSignal() akan membaca nilai pada kedua-dua indikator moving average dan mengembalikan maklumat isyarat sama ada berlaku persilangan ke atas atau ke bawah sebagai isyarat untuk beli / jual.
Berdasarkan maklumat isyarat ini, ia akan diteruskan ke fungsi transaction() untuk menetapkan posisi beli atau jual yang dibuka.
Seterusnya, kita akan memanggil fungsi setTPSL() yang berfungsi untuk menetapkan harga ambil untung dan had kerugian.
Jika ekuiti tidak memenuhi syarat minimum, amaran akan dipaparkan 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 perdagangan, kerana ekuiti tidak cukup Print("EA akan dihentikan kerana ekuiti tidak mencukupi"); } }
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 ("Pengubahsuaian Pesanan Berjaya"); } } } 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 ("Pengubahsuaian Pesanan Berjaya"); } } } }//tamat jika nombor ajaib && pasangan }//tamat for }
Untuk pendidikan dan perkongsian dalam Bahasa Melayu, sila sertai kami di grup telegram t.me/codeMQL
Jika anda sedang mencari aplikasi untuk menyokong perdagangan anda, sila muat turun aplikasi SignalForex kami di play store
https://play.google.com/store/apps/details?id=com.autobotfx.signalforex
Siaran berkaitan
- Pemprosesan Pesanan Visual - Sistem Trading untuk MetaTrader 4
- Sistem Perdagangan Automatik 'Combo' - EA untuk MetaTrader 4
- MQL5 Wizard: Cipta Sistem Trading Berdasarkan Pola Morning/Evening Star dan RSI
- Panduan Lengkap MQL5 Wizard untuk Isyarat Dagangan Berdasarkan Morning/Evening Stars dan Stochastic
- MQL5 Wizard: Cipta Isyarat Dagangan Menggunakan Corak Morning/Evening Star dan MFI