//+------------------------------------------------------------------+
//| Expert Advisor: Martingale Trigger |
//+------------------------------------------------------------------+
extern double lotAwal = 0.02;
extern double tp = 5; // Take profit dalam poin penuh
extern double sl = 5; // Stop loss dalam poin penuh
extern double pemicuJarak = 2.5; // Jarak trigger dari high/low sebelumnya
double lot = lotAwal;
bool pemicu = false;
bool sudahJalanSekali = false;
int magicNumber = MathRand();
datetime waktuBarTerakhir = 0;
//+------------------------------------------------------------------+
//| Fungsi utama saat tick |
//+------------------------------------------------------------------+
void OnTick()
{
if (!pemicu)
{
if (barH1Baru())
{
gambarHiLo();
}
cekPemicuAtas();
cekPemicuBawah();
}
else
{
awasi();
}
}
//+------------------------------------------------------------------+
//| Cek apakah ada bar H1 baru |
//+------------------------------------------------------------------+
bool barH1Baru()
{
datetime waktuBarSekarang = iTime(Symbol(), PERIOD_H1, 0);
if (waktuBarSekarang != waktuBarTerakhir)
{
waktuBarTerakhir = waktuBarSekarang;
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| Menggambar high low candle H1 sebelumnya |
//+------------------------------------------------------------------+
void gambarHiLo()
{
// Hapus semua objek dulu
int totalObj = ObjectsTotal();
for (int i = totalObj - 1; i >= 0; i--)
{
string namaObj = ObjectName(i);
ObjectDelete(namaObj);
}
double hi = iHigh(Symbol(), PERIOD_H1, 1);
double lo = iLow(Symbol(), PERIOD_H1, 1);
string namaHi = "GarisHi_" + TimeToStr(TimeCurrent(), TIME_SECONDS);
ObjectCreate(namaHi, OBJ_HLINE, 0, Time[0], hi);
ObjectSetInteger(0, namaHi, OBJPROP_COLOR, clrRed);
ObjectSetInteger(0, namaHi, OBJPROP_WIDTH, 1);
string namaLo = "GarisLo_" + TimeToStr(TimeCurrent(), TIME_SECONDS);
ObjectCreate(namaLo, OBJ_HLINE, 0, Time[0], lo);
ObjectSetInteger(0, namaLo, OBJPROP_COLOR, clrBlue);
ObjectSetInteger(0, namaLo, OBJPROP_WIDTH, 1);
}
//+------------------------------------------------------------------+
//| Cek pemicu Atas dari high H1 |
//+------------------------------------------------------------------+
void cekPemicuAtas()
{
double highH1 = iHigh(Symbol(), PERIOD_H1, 1);
double hargaPemicu = highH1 + pemicuJarak;
if (Bid >= hargaPemicu and Bid <= hargaPemicu+1)
{
double hargaBuyStop = hargaPemicu + pemicuJarak;
double hargaSellStop = hargaPemicu - pemicuJarak;
OrderSend(Symbol(), OP_BUYSTOP, lot, hargaBuyStop, 3, hargaBuyStop - sl,
hargaBuyStop + tp, "BuyStop", magicNumber, 0, clrGreen);
OrderSend(Symbol(), OP_SELLSTOP, lot, hargaSellStop, 3, hargaSellStop + sl,
hargaSellStop - tp, "SellStop", magicNumber, 0, clrRed);
pemicu = true;
}
}
//+------------------------------------------------------------------+
//| Cek pemicu bawah dari low H1 |
//+------------------------------------------------------------------+
void cekPemicuBawah()
{
double lowH1 = iLow(Symbol(), PERIOD_H1, 1);
double hargaPemicu = lowH1 - pemicuJarak;
if (Ask <= hargaPemicu and Ask >= hargaPemicu)
{
double hargaBuyStop = hargaPemicu + pemicuJarak;
double hargaSellStop = hargaPemicu - pemicuJarak;
OrderSend(Symbol(), OP_BUYSTOP, lot, hargaBuyStop, 3, hargaBuyStop - sl,
hargaBuyStop + tp, "BuyStop", magicNumber, 0, clrGreen);
OrderSend(Symbol(), OP_SELLSTOP, lot, hargaSellStop, 3, hargaSellStop + sl,
hargaSellStop - tp, "SellStop", magicNumber, 0, clrRed);
pemicu = true;
}
}
//+------------------------------------------------------------------+
//| Cek apakah ada order aktif (running, bukan pending) |
//+------------------------------------------------------------------+
bool adaOrderAktif()
{
for (int i = 0; i < OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if ((OrderType() == OP_BUY || OrderType() == OP_SELL) &&
OrderMagicNumber() == magicNumber)
return true;
}
}
return false;
}
//+------------------------------------------------------------------+
//| Fungsi pengawasan martingale |
//+------------------------------------------------------------------+
void awasi()
{
if (!sudahJalanSekali)
{
sudahJalanSekali = true;
// Hapus semua pending order
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if ((OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) &&
OrderMagicNumber() == magicNumber)
OrderDelete(OrderTicket());
}
}
if (adaOrderAktif())
{
double slAktif = OrderStopLoss();
double lotBaru = OrderLots() * 2;
if (OrderType() == OP_BUY)
{
OrderSend(Symbol(), OP_SELLSTOP, lotBaru, slAktif, 3, slAktif + sl,
slAktif - tp, "Sell Recovery", magicNumber, 0, clrRed);
}
if (OrderType() == OP_SELL)
{
OrderSend(Symbol(), OP_BUYSTOP, lotBaru, slAktif, 3, slAktif - sl,
slAktif + tp, "Buy Recovery", magicNumber, 0, clrGreen);
}
}
}
}