
Pernah nggak kamu ngerasain ribetnya trading manual? Nungguin chart seharian, tapi pas ada peluang malah kelewatan? Nah, kali ini saya mau share pengalaman seru pakai robot trading forex (EA MT4) di pair EURUSD timeframe M30. Hasil backtest yang saya dapat benar-benar bikin pengen langsung coba di akun real.
Hasil Backtest EA – Modal 100 Dollar Jadi Ribuan Dollar!
Backtest saya lakukan dari awal Januari 2025 sampai tanggal terbaru sekarang 16 Agustus 2025 dengan modal awal hanya $100. Dan hasilnya? Gila banget:
- Spread: 15 (saya sengaja isi 15 meskipun sebenarnya broker yang saya pakai spread normal di angka 7 saja. Jika pas backtest kolom spread diisi angka 7 pasti hasilnya jauh lebih menguntungkan tapi kurang realistis di akun real.)
- Total transaksi: 13 order buy & sell
- Laba kotor: $2.748
- Rugi kotor: $493
- Keuntungan bersih: $2.254
- Profit terbesar 1x order: $783
- Loss terbesar 1x order: $348
- Rata-rata profit per order: $274
- Rata-rata loss per order: $164
- Profit beruntun: 3x
- Loss beruntun: tidak pernah lebih dari 1x, setelah itu langsung profit lagi!
Bayangin aja, dari modal receh $100 bisa tumbuh ribuan dollar hanya dengan memanfaatkan algoritma EA ini.
Metode & Cara Kerja EA MT4 Ini
Biar kamu nggak penasaran, saya jelasin secara singkat metode yang dipakai. Jadi EA ini menggabungkan indikator MACD multi-timeframe dengan strategi pending order.
- Trend filter → pakai MACD di H4 & H1 untuk memastikan arah trend utama. Kalau dua-duanya searah, barulah cari entry.
- Trigger entry → pakai MACD di M30 buat mendeteksi cross.
- Eksekusi order → EA otomatis pasang pending order Buy Limit / Sell Limit, jadi entry nggak asal-asalan.
- Risk management → lot dihitung otomatis berdasarkan persentase balance. Jadi sistemnya terukur, bukan gambling.
- Filter tambahan: ada pengecekan jam trading, gap candle M30, dan auto-cancel order kalau sinyal sudah nggak valid lagi.
Statistik Eksekusi Order
Biar lebih transparan, ini data dari backtest:
- Buy Limit: 9x (profit 6x, loss 1x, expired 2x)
- Sell Limit: 14x (profit 4x, loss 2x, expired 8x)
- Expired (dibatalkan otomatis): 10x
Artinya EA ini benar-benar disiplin. Kalau sinyal sudah nggak valid, pending order langsung dihapus. Jadi nggak ada tuh order nyangkut nggak jelas.
Gratis & Open Source – Bisa Kamu Edit Sesuka Hati
Yang paling menarik, EA ini bisa kamu dapatkan gratis di eafxgratis.com. Script yang dibagikan berupa file MQL4 (bukan EX4) alias open source. Jadi kalau kamu mau modifikasi, menambahkan indikator lain, atau mengutak-atik money management, tinggal edit aja.
Nggak ada yang dikunci, nggak ada hidden code, semuanya transparan.
Kenapa Wajib Dicoba?
- Sudah terbukti backtest menghasilkan profit konsisten
- Strategi jelas & mudah dipahami (MACD + pending order)
- Ada money management otomatis
- Gratis, open source, bisa diedit sesuka hati
- Cocok buat kamu yang males trading manual
👉 Jadi, kalau kamu lagi nyari robot EA MT4 gratis dengan performa mantap, cobain aja script ini di eafxgratis.com. Siapa tahu, dari modal receh bisa bikin kamu tajir melintir.
Ohya ada yang lupa dan ini penting banget terkait manajemen risiko. Nilai pada RiskPercent disini saya isi 25. Itu terbilang besar banget dan sangat berisiko, tapi untungnya juga bisa lebih cepat. Saya sarankan untuk merubah nilainya dari 25 menjadi 2 saja.
Sebagai contoh jika modal kamu $100 dan pakai RiskPercent 25, maka order pertama yang dibuka adalah 0.16 LOT. Tapi jika kamu apakai RiskPercent 2 maka order pertama yang dibuka adalah 0.01 LOT

Kalau sudah siap, salin semua kode script dibawah lalu simpan di MetaEditor MT4 kamu.
//+-------------------------------------------------------------------------------------+
//| EURUSD M30 (EA MACD MultiTF Pending Order) by: www.eafxgratis.com |
//+-------------------------------------------------------------------------------------+
#property strict
//---- Input Parameter (bisa diatur user)
input string TradeSymbol = "EURUSD"; // Pair yang digunakan
input double RiskPercent = 25.0; // % balance yang diriskokan per trade
input int SL_Pips = 15; // Stop Loss (dalam pips)
input int TP_Pips = 30; // Take Profit (dalam pips)
input int GapFilterPips = 30; // Maksimal gap candle M30 agar bisa entry
input bool UseTimeFilter = true; // Aktifkan filter jam trading
input int TradeStartHour = 1; // Jam mulai trading (server time)
input int TradeEndHour = 21; // Jam akhir trading (server time)
input int MACD_Fast = 12; // MACD parameter fast EMA
input int MACD_Slow = 26; // MACD parameter slow EMA
input int MACD_Signal = 9; // MACD signal line
input int ConsecutiveBarsRequired = 10; // Jumlah bar berturut2 searah (trend kuat)
input int PendingExpireMinutes = 240; // Expiry pending order (menit)
input int MagicNumber = 20250815; // Magic Number khusus EA ini
input int Slippage = 3; // Maksimum slippage
//---- Variabel global
double PipPoint; // Besaran 1 pip (otomatis menyesuaikan 4/5 digit)
int DigitsAdj; // Jumlah digit harga pair
//+------------------------------------------------------------------+
//| Fungsi Init (dijalankan sekali ketika EA attach) |
//+------------------------------------------------------------------+
int OnInit()
{
int digits = (int)MarketInfo(TradeSymbol, MODE_DIGITS);
DigitsAdj = digits;
double point = MarketInfo(TradeSymbol, MODE_POINT);
// Atur besar 1 pip berdasarkan jumlah digit broker
if(digits==5 || digits==3) PipPoint = point * 10.0;
else PipPoint = point;
Print("EA initialized for ", TradeSymbol,
" Digits=", digits, " PipPoint=",DoubleToString(PipPoint,10));
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Fungsi utama: dijalankan setiap tick harga baru |
//+------------------------------------------------------------------+
void OnTick()
{
// Filter jam trading
if(UseTimeFilter && !IsWithinTradeHours()) return;
// Filter gap candle (hindari loncatan harga terlalu besar)
if(!GapOK_M30()) return;
// Jika sudah ada order aktif/pending, hentikan
if(HasActiveOrderOrPending()) return;
// Cek arah trend H4 (harus jelas bullish/bearish)
int h4Dir = GetMACDTrendDir(TradeSymbol, PERIOD_H4, ConsecutiveBarsRequired);
if(h4Dir==0) return;
// Cek arah trend H1, harus searah H4
int h1Dir = GetMACDTrendDir(TradeSymbol, PERIOD_H1, ConsecutiveBarsRequired);
if(h1Dir != h4Dir) return;
// Deteksi cross MACD di M30 (sebagai trigger entry)
int touch = DetectM30Touch();
if(touch==0) return;
if(touch != h4Dir) return; // Harus searah dengan trend H4
// Ambil harga cross (titik tengah spread)
double crossPrice = (Ask + Bid)/2.0;
// Jika arah buy → pasang Buy Limit
if(touch==1)
PlaceBuyLimitAfterCross(crossPrice);
// Jika arah sell → pasang Sell Limit
else if(touch==-1)
PlaceSellLimitAfterCross(crossPrice);
}
//+------------------------------------------------------------------+
//| Hitung lot berdasarkan % balance yang dirisikokan |
//+------------------------------------------------------------------+
double CalculateLotFromRisk(double riskPercent, double slPips)
{
double balance = AccountBalance();
double riskMoney = balance * riskPercent / 100.0; // nominal uang yang diriskokan
double tickValue = MarketInfo(TradeSymbol, MODE_TICKVALUE);
double tickSize = MarketInfo(TradeSymbol, MODE_TICKSIZE);
double pipValuePerLot = tickValue * (PipPoint / tickSize);
// lot = uang risiko / (SL dalam pip * nilai pip per lot)
double lot = riskMoney / (slPips * pipValuePerLot);
return NormalizeLot(lot);
}
//+------------------------------------------------------------------+
//| Cek apakah waktu sekarang masih dalam jam trading |
//+------------------------------------------------------------------+
bool IsWithinTradeHours()
{
int hr = TimeHour(TimeCurrent());
if(TradeStartHour <= TradeEndHour)
return (hr >= TradeStartHour && hr < TradeEndHour);
else
return (hr >= TradeStartHour || hr < TradeEndHour);
}
//+------------------------------------------------------------------+
//| Cek apakah gap candle M30 terlalu besar |
//+------------------------------------------------------------------+
bool GapOK_M30()
{
double open_now = iOpen(TradeSymbol, PERIOD_M30, 0);
double close_prev = iClose(TradeSymbol, PERIOD_M30, 1);
if(open_now==EMPTY_VALUE || close_prev==EMPTY_VALUE) return false;
double gapPips = MathAbs(open_now - close_prev) / PipPoint;
return (gapPips <= GapFilterPips);
}
//+------------------------------------------------------------------+
//| Deteksi cross MACD pada timeframe M30 |
//| Return 1 = cross ke bawah (buy setup) |
//| Return -1 = cross ke atas (sell setup) |
//+------------------------------------------------------------------+
int DetectM30Touch()
{
double main_prev = iMACD(TradeSymbol, PERIOD_M30, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE, MODE_MAIN, 1);
double sig_prev = iMACD(TradeSymbol, PERIOD_M30, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE, MODE_SIGNAL, 1);
double main_now = iMACD(TradeSymbol, PERIOD_M30, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE, MODE_MAIN, 0);
double sig_now = iMACD(TradeSymbol, PERIOD_M30, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE, MODE_SIGNAL, 0);
if(main_prev==EMPTY_VALUE || sig_prev==EMPTY_VALUE || main_now==EMPTY_VALUE || sig_now==EMPTY_VALUE) return 0;
// Cross turun → sinyal buy
if(main_prev > sig_prev && main_now <= sig_now) return 1;
// Cross naik → sinyal sell
if(main_prev < sig_prev && main_now >= sig_now) return -1;
return 0;
}
//+------------------------------------------------------------------+
//| Pasang pending order Buy Limit setelah cross M30 |
//+------------------------------------------------------------------+
void PlaceBuyLimitAfterCross(double crossPrice)
{
double limitPrice = NormalizeDouble(crossPrice - SL_Pips * PipPoint, DigitsAdj);
if(limitPrice >= Ask - (PipPoint*0.00001))
limitPrice = NormalizeDouble(Ask - PipPoint, DigitsAdj);
double sl = NormalizeDouble(limitPrice - SL_Pips * PipPoint, DigitsAdj);
double tp = NormalizeDouble(limitPrice + TP_Pips * PipPoint, DigitsAdj);
// Jika sudah ada pending BuyLimit → batal pasang
if(ExistsPendingOfType(OP_BUYLIMIT)) return;
datetime expiry = TimeCurrent() + PendingExpireMinutes * 60;
double volume = CalculateLotFromRisk(RiskPercent, SL_Pips);
int ticket = OrderSend(TradeSymbol, OP_BUYLIMIT, volume, limitPrice, Slippage, sl, tp, "MACD_BUYLIMIT_30", MagicNumber, expiry, clrBlue);
if(ticket>0)
Print("Placed BuyLimit at ", DoubleToString(limitPrice,DigitsAdj), " lot=", DoubleToString(volume,2), " ticket=", ticket);
else
Print("BuyLimit placement failed error=", GetLastError());
}
//+------------------------------------------------------------------+
//| Pasang pending order Sell Limit setelah cross M30 |
//+------------------------------------------------------------------+
void PlaceSellLimitAfterCross(double crossPrice)
{
double limitPrice = NormalizeDouble(crossPrice + SL_Pips * PipPoint, DigitsAdj);
if(limitPrice <= Bid + (PipPoint*0.00001))
limitPrice = NormalizeDouble(Bid + PipPoint, DigitsAdj);
double sl = NormalizeDouble(limitPrice + SL_Pips * PipPoint, DigitsAdj);
double tp = NormalizeDouble(limitPrice - TP_Pips * PipPoint, DigitsAdj);
// Jika sudah ada pending SellLimit → batal pasang
if(ExistsPendingOfType(OP_SELLLIMIT)) return;
datetime expiry = TimeCurrent() + PendingExpireMinutes * 60;
double volume = CalculateLotFromRisk(RiskPercent, SL_Pips);
int ticket = OrderSend(TradeSymbol, OP_SELLLIMIT, volume, limitPrice, Slippage, sl, tp, "MACD_SELLLIMIT_30", MagicNumber, expiry, clrRed);
if(ticket>0)
Print("Placed SellLimit at ", DoubleToString(limitPrice,DigitsAdj), " lot=", DoubleToString(volume,2), " ticket=", ticket);
else
Print("SellLimit placement failed error=", GetLastError());
}
//+------------------------------------------------------------------+
//| Cek apakah sudah ada order aktif/pending di chart ini |
//+------------------------------------------------------------------+
bool HasActiveOrderOrPending()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=TradeSymbol) continue;
if(OrderMagicNumber()!=MagicNumber) continue;
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| Cek apakah sudah ada pending order dengan tipe tertentu |
//+------------------------------------------------------------------+
bool ExistsPendingOfType(int pendingType)
{
for(int i=0;i<OrdersTotal();i++)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=TradeSymbol) continue;
if(OrderMagicNumber()!=MagicNumber) continue;
if(OrderType()==pendingType) return true;
}
return false;
}
//+------------------------------------------------------------------+
//| Normalisasi lot agar sesuai aturan broker (min, max, step) |
//+------------------------------------------------------------------+
double NormalizeLot(double lot)
{
double minLot = MarketInfo(TradeSymbol, MODE_MINLOT);
double maxLot = MarketInfo(TradeSymbol, MODE_MAXLOT);
double step = MarketInfo(TradeSymbol, MODE_LOTSTEP);
if(lot < minLot) lot = minLot;
if(lot > maxLot) lot = maxLot;
double n = MathFloor(lot/step);
lot = n*step;
return NormalizeDouble(lot,2);
}
//+------------------------------------------------------------------+
//| Hitung arah trend MACD pada timeframe tertentu |
//| Return 1 = bullish kuat, -1 = bearish kuat, 0 = netral |
//+------------------------------------------------------------------+
int GetMACDTrendDir(string symbol, ENUM_TIMEFRAMES tf, int barsCount)
{
int up=0, down=0;
for(int i=1;i<=barsCount;i++)
{
double m = iMACD(symbol, tf, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE, MODE_MAIN, i);
double s = iMACD(symbol, tf, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE, MODE_SIGNAL, i);
if(m==EMPTY_VALUE || s==EMPTY_VALUE) return 0;
if(m > s) up++;
else if(m < s) down++;
}
if(up==barsCount) return 1;
if(down==barsCount) return -1;
return 0;
}
//+------------------------------------------------------------------+
//| Fungsi deinit (dipanggil saat EA dilepas) |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
Wawww mantep modal 100 dolar jadi 2000 dolar lebih. Tapi maaf sebelumnya saya masih pemula dan masih bingung itu datanya bener gak ya kan modalnya cuma 100 dolar tapi kenapa rata rata lossnya 164 dollar bahkan loss terbesar sampai 348 dolar. Itu kan melebihi modalnya.... 🤔
BalasHapusGak apa-apa namanya juga pemula :) rata2 loss $164 itu akumulasi dari awal trading sampai balance sebesar $2.254 jadi wajar saja kalau Loss nya besar, secara LOT juga membesar seiring waktu. Dan.. jangan cuma dilirik Loss-nya saja, tapi rata2 profitnya $274. itu juga melebihi modalnya yang $100 kan hehe
Hapus