MetaTrader4
Panduan Lengkap 2 MA Crossing untuk MetaTrader 4
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
2021.03.30