Agustus 14, 2025

(MT4) Snipper USDJPY - EA Scalping Gratis WinRate 90%

Kalau kamu sudah lama terjun di dunia forex trading pakai MetaTrader 4 (MT4), pasti udah gak asing sama yang namanya EA (Expert Advisor). Nah, di artikel ini kita bakal bahas tuntas satu script EA unggulan yang namanya Snipper USDJPY. Script ini dibuat pakai bahasa MQL4, dan khusus nyasar di pair USDJPY dengan strategi unik: entry cuma kalau candle udah jalan 40 detik, tanpa re-entry di candle yang sama.

Kenapa Harus EA MQL4, Bukan EX4?

Buat yang belum paham, MQL4 itu bahasa pemrograman asli buat bikin EA di MetaTrader 4. Kalau EX4 itu udah jadi versi compile — semacam file jadi yang gak bisa diedit.
Nah, keunggulan pakai file .mq4 dibanding .ex4:

  • Bisa dioprek dan dimodif sesuka hati.
  • Bisa belajar logika strategi langsung dari source code.
  • Lebih transparan, gak ada kode yang disembunyikan developer.
  • Cocok buat backtest sekaligus belajar MQL4.

Jadi, kalau kamu pengen punya EA yang fleksibel dan ngerti cara kerjanya, punya source code MQL4 itu penting banget.

Strategi yang Dipakai EA Snipper USDJPY

EA ini punya logika simpel tapi efektif:

  1. Pantau candle M1 (1 menit) di pair USDJPY.
  2. Tunggu 40 detik setelah candle baru open.
  3. Cek pergerakan harga:
    • Kalau harga udah naik ≥ 7 pips dari open, dan posisi pullback-nya oke → SELL.

    • Kalau harga udah turun ≥ 7 pips dari open, dan pantulannya valid → BUY.
  4. Stop Loss diatur kecil (2.4 pips) biar kalau salah arah, ruginya tipis.
  5. Take Profit ngikutin level Bollinger Bands (indikator bawaan MT4).
  6. Ada Trailing Stop biar profit ngunci kalau-kalau sudah floating profit tapi gagal TP.

Dengan cara ini, EA lebih ke tipe scalper cepat yang nyari gerakan pendek tapi mantap.

Penjelasan Logika Script EA

Biar gampang, kita pecah jadi beberapa bagian:

1. Risk Management Otomatis

EA ini punya fungsi CalculateLotSize() yang langsung ngitung lot berdasarkan persentase risiko dari saldo akun. Jadi misalnya RiskPercent = 50, saldo $500 → dia otomatis hitung lot-nya. Ini bikin manajemen risiko lebih konsisten tanpa kamu harus hitung manual tiap entry.

2. Filter Jam Trading

EA cuma mau kerja antara jam 09:00 - 22:59 (server time). Ini strategi bagus buat hindarin volatilitas aneh di jam-jam sepi atau pas market buka/tutup.

3. Candle Check

Setiap ada candle baru, EA nyimpen harga open, high, low candle itu. Kalau udah entry sekali di candle itu, dia gak bakal entry lagi sampai candle baru muncul.

4. Entry Rule
  • SELL → harga udah naik ≥ 7 pips dari open, lalu ada jarak minimal 10 poin dari high ke Bid → eksekusi sell.
  • BUY → harga udah turun ≥ 7 pips dari open, lalu ada jarak minimal 10 poin dari Bid ke low → eksekusi buy.
5. Trailing Stop

Setelah posisi profit sesuai TrailingStartPips, SL bakal pindah otomatis ngikut harga (TrailingStepPips). Jadi kalau market balik arah, profit yang udah ke-lock gak hilang.

Keunggulan EA Snipper USDJPY
  1. Tanpa Re-entry → aman dari overtrading di candle yang sama.
  2. Manajemen Risiko Otomatis → lot langsung sesuai persentase risiko.
  3. Cepat dan Gesit → cocok buat scalping USDJPY di M1.
  4. Kompak → script rapi, gampang dimodif, dan gak berat dijalankan di MT4.
  5. Bisa Dibaca dan Dimodif → format MQL4 memudahkan trader yang mau belajar atau ngasih sentuhan personal.
Tips Pakai EA Ini
  • Gunakan di VPS biar koneksi ke broker stabil.
  • Lakukan backtest dulu di MetaTrader 4 biar tahu performa historisnya.
  • Sesuaikan RiskPercent dengan mental trading kamu — jangan langsung all-in.
  • Ingat, walaupun EA ini pintar, money management tetap nomor satu.
Kesimpulan

Snipper USDJPY ini contoh EA scalper MQL4 GRATIS yang fokus, cepat, dan gampang dipahami. Dengan source code MQL4 yang terbuka, kamu bisa belajar banyak tentang pemrograman MQL4, strategi entry cepat, sampai manajemen risiko otomatis.
Kalau dibanding file EX4 yang tertutup, MQL4 jelas lebih unggul buat trader yang pengen berkembang dan ngerti logika di balik robot trading mereka.

Berikut Script EA Scalping USDJPY

//+---------------------------------------------------------------------+
//|				Snipper USDJPY by: www.eafxgratis.com					|
//|				Untuk MetaTrader 4 (MQ4) - WinRate > 90%				|
//+---------------------------------------------------------------------+
#property strict // Memaksa penulisan kode mengikuti standar MQL4 modern (lebih ketat)

// -------------------- Input Parameter -----------------------------
extern double RiskPercent = 50; // Persentase risiko per posisi (contoh: 50 berarti 50% dari saldo)
extern int Slippage = 2;        // Batas toleransi perbedaan harga saat eksekusi order
extern double StopLossPips = 2.4; // Jarak Stop Loss dalam pips
extern double TrailingStartPips = 0.1; // Mulai trailing stop setelah profit minimal 0.1 pip
extern double TrailingStepPips = 2.4;  // Jarak trailing stop dari harga saat ini

extern int BB_Period = 20;      // Periode indikator Bollinger Bands
extern double BB_Deviation = 2.0; // Deviasi standar Bollinger Bands

// -------------------- Variabel Global ------------------------
double candleOpen, candleHigh, candleLow; // Menyimpan harga open, high, low candle saat ini
datetime candleCheckedTime = -1; // Menyimpan waktu candle terakhir yang sudah dicek
bool orderExecutedThisCandle = false; // Menandakan apakah sudah entry di candle ini

//+------------------------------------------------------------------+
//| Fungsi menghitung lot otomatis sesuai risiko                    |
//+------------------------------------------------------------------+
double CalculateLotSize() {
   double balance = AccountBalance(); // Mengambil saldo akun
   double riskAmount = balance * RiskPercent / 100.0; // Nominal uang yang dirisikokan
   double slPrice = PipToPrice(StopLossPips); // Konversi SL dari pips ke harga
   double tickValue = MarketInfo(Symbol(), MODE_TICKVALUE); // Nilai per pip per lot

   // Hitung lot berdasarkan risiko dan stop loss
   double lot = riskAmount / (StopLossPips * tickValue / PipValue());

   // Ambil batas lot minimal, maksimal, dan kelipatan lot dari broker
   double minLot = MarketInfo(Symbol(), MODE_MINLOT);
   double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);

   // Pastikan lot tidak melebihi batas broker
   lot = MathMax(minLot, MathMin(lot, maxLot));
   lot = NormalizeDouble(lot / lotStep, 0) * lotStep; // Sesuaikan kelipatan lot

   return NormalizeDouble(lot, 2); // Dibulatkan 2 desimal
}

//+------------------------------------------------------------------+
//| Fungsi OnInit dijalankan saat EA pertama kali attach             |
//+------------------------------------------------------------------+
int OnInit() {
   Print("RiskPercent input: ", RiskPercent); // Menampilkan nilai RiskPercent di tab Experts

   // Mencegah EA agar tidak bisa dipakai di akun orang lain
   if (AccountNumber() != 12345678) { // Ganti dengan ID akun trading kamu
      Alert("Akun tidak diizinkan menggunakan EA ini.");
      return(INIT_FAILED);
   }

   // EA hanya boleh di time frame M1
   if (Period() != PERIOD_M1) {
      Print("Error: EA hanya bisa dijalankan di time frame M1.");
      return(INIT_FAILED);
   }

   // Settingan EA ini hanya cocok untuk pair USDJPY
   if (!(Symbol() == "USDJPY")) {
      Print("Pair tidak diizinkan: ", Symbol());
      return(INIT_FAILED);
   }

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Fungsi bantu konversi pip ke nilai harga                         |
//+------------------------------------------------------------------+
double PipValue() {
   if (StringFind(Symbol(), "JPY") >= 0) return 0.01; // Pair JPY punya 2 desimal
   return 0.0001; // Pair lain 4 desimal
}

double PipToPrice(double pips) {
   return pips * PipValue(); // Mengubah pips ke harga absolut
}

//+------------------------------------------------------------------+
//| Fungsi utama EA: OnTick (dijalankan setiap ada tick baru)         |
//+------------------------------------------------------------------+
void OnTick() {
   // Cek spread (jika > 1.5 pips, jangan entry)
   double spread = (Ask - Bid) / PipValue();
   if (spread > 1.5) return;

   // Batasi jam trading antara 09:00 - 22:59
   int hours = TimeHour(TimeCurrent()); 
   if (hours < 9 || hours >= 23)
      return;

   datetime currentCandleTime = Time[0]; // Waktu candle aktif

   // Reset variabel saat candle baru muncul
   if (currentCandleTime != candleCheckedTime) {
      candleCheckedTime = currentCandleTime;
      candleOpen = Open[0];
      candleHigh = High[0];
      candleLow  = Low[0];
      orderExecutedThisCandle = false; // Boleh entry lagi di candle baru
   }

   // Hitung pergerakan harga dalam pips
   double moveUpPips = (High[0] - candleOpen) / PipValue();
   double moveDownPips = (candleOpen - Low[0]) / PipValue();

   // Cek apakah sudah ada order terbuka di pair ini
   bool hasOpenOrder = false;
   for (int i = 0; i < OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == Symbol()) {
            hasOpenOrder = true;
            break;
         }
      }
   }

   // Hanya entry jika tidak ada order terbuka dan belum entry di candle ini
   if (!hasOpenOrder && !orderExecutedThisCandle) {
      int secondsSinceCandleOpen = TimeCurrent() - candleCheckedTime;

      // Entry hanya jika sudah lewat 40 detik sejak candle mulai
      if (secondsSinceCandleOpen >= 40) {
         double lot = CalculateLotSize(); // Gunakan perhitungan lot dinamis

         // Kondisi entry SELL
         if (moveUpPips >= 7 && (High[0] - Bid) / PipValue() >= 0.1) {
            double sl = Ask + PipToPrice(StopLossPips); // SL di atas harga ask
            double tp = iBands(Symbol(), 0, BB_Period, BB_Deviation, 0, PRICE_CLOSE, MODE_LOWER, 0); // TP di lower BB
            int ticket = OrderSend(Symbol(), OP_SELL, lot, Bid, Slippage, sl, tp, "SELL Entry", 0, 0, Red);
            if (ticket > 0) orderExecutedThisCandle = true;
         }

         // Kondisi entry BUY
         if (moveDownPips >= 7 && (Bid - Low[0]) / PipValue() >= 0.1) {
            double sl = Bid - PipToPrice(StopLossPips); // SL di bawah harga bid
            double tp = iBands(Symbol(), 0, BB_Period, BB_Deviation, 0, PRICE_CLOSE, MODE_UPPER, 0); // TP di upper BB
            int ticket = OrderSend(Symbol(), OP_BUY, lot, Ask, Slippage, sl, tp, "BUY Entry", 0, 0, Blue);
            if (ticket > 0) orderExecutedThisCandle = true;
         }
      }
   }

   // ---------------- Trailing Stop ----------------
   for (int i = 0; i < OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() != Symbol()) continue;

         // Trailing untuk BUY
         if (OrderType() == OP_BUY) {
            double trailStart = OrderOpenPrice() + PipToPrice(TrailingStartPips);
            double newSL = Bid - PipToPrice(TrailingStepPips);
            if (Bid > trailStart && (OrderStopLoss() < newSL || OrderStopLoss() == 0)) {
               OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, Blue);
            }
         }

         // Trailing untuk SELL
         if (OrderType() == OP_SELL) {
            double trailStart = OrderOpenPrice() - PipToPrice(TrailingStartPips);
            double newSL = Ask + PipToPrice(TrailingStepPips);
            if (Ask < trailStart && (OrderStopLoss() > newSL || OrderStopLoss() == 0)) {
               OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, Red);
            }
         }
      }
   }
}

2 komentar:

  1. Maaf mas untuk AccountNumber 12345678 itu harus diganti dengan nomor akun trading saya gitu? Gimana caranya dapat nomor akun saya mas sigit?

    BalasHapus
  2. AccountNumber didapat dari akun trading kamu. Saat kamu login ke metatrader, kolom input LOGIN itu adalah AccountNumber atau nomor akun. Atau jika tidak ingin memasukkan nomor akun ke script EA, hapus saja bagian

    if (AccountNumber() != 12345678) {
    Alert("Akun tidak diizinkan menggunakan EA ini.");
    return(INIT_FAILED);
    }

    BalasHapus

Berikan ide atau saran untuk artikel ini. Jangan nyepam karena pasti tidak akan ditayangkan.