Indikator ADX (Average Directional Index) adalah indikator forex yang digunakan untuk mempelajari dan menghasilkan data tentang tren yang sedang berlangsung. Data tersebut berupa identifikasi dari arah dan kekuatan tren.
Indikator ADX terdiri dari gabungan dua indikator arah +DI dan -DI. Kedua indikator tersebut melengkapi ADX sebagai petunjuk aran tren. Petunjuk tersebut berasal dari perhitungan sederhana dari pergerakan arah market.
Baca juga: Indikator ADX Sebagai Pengukur Kekuatan Tren
Strategi Robot EA ADX
Strategi yang digunakan apabila garis +DI diatas -DI dan garis ADX berada di atas nilai 25, maka open posisi BUY. Begitu juga selaliknya untuk kondisi SELL garis -DI diatas +DI dan garis ADX berada di atas level 25. Apabila garis ADX dibawah level 25 maka akan dilakukan menutup semua posisi trading.
Berikut kode sederhana Robot Expert Advisor yang menggunakan indikator ADX.
//-- ADX INDICATOR
input int ADXPeriod = 14;
input int ADXLevel = 25;
input ENUM_APPLIED_PRICE ADX_AppliedPrice = PRICE_CLOSE;
//-- TPSL
input int TP = 100;
input int SL = 500;
//-- STANDARD INPUT
input double Lot = 0.01;
input int MagicNumber = 6489716;
input string TradeComment = __FILE__;
//-- VARIABLE
datetime BarTime = 0;
// Fungsi untuk mengambil nilai ADX
double GetADX()
{
double adx = iADX(_Symbol, 0, ADXPeriod, ADX_AppliedPrice, MODE_MAIN, 0);
return adx;
}
void OnTick()
{
OnEveryNewBar();
}
void OnEveryNewBar()
{
if (BarTime != Time[0])
{
Trade();
BarTime = Time[0];
}
}
int GetOrdersTotal()
{
int total = OrdersTotal();
int Count = 0;
for (int i = total - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
Count++;
}
}
}
return Count;
}
void Trade()
{
double minusDI = iADX(_Symbol,0,ADXPeriod,ADX_AppliedPrice,MODE_MINUSDI,0);
double plusDI = iADX(_Symbol,0,ADXPeriod,ADX_AppliedPrice,MODE_PLUSDI,0);
if (GetADX() > ADXLevel) {
if (GetOrdersTotal() == 0) {
if (minusDI > plusDI)
{
OpenOrder("SELL");
}else
{
OpenOrder("BUY");
}
}
}else{
CloseAllPositions();
}
}
void OpenOrder(string OrderPosition)
{
double tpPrice, slPrice, OpenPrice;
ENUM_ORDER_TYPE orderType;
if (OrderPosition == "BUY") {
OpenPrice = Ask;
tpPrice = NormalizeDouble(OpenPrice+TP*Point, Digits());
if (SL > 0) {
slPrice = NormalizeDouble(OpenPrice-SL*Point, Digits());
}else{
slPrice = 0;
}
orderType = OP_BUY;
}else
if (OrderPosition == "SELL") {
OpenPrice = Bid;
tpPrice = NormalizeDouble(OpenPrice-TP*Point, Digits());
if (SL > 0) {
slPrice = NormalizeDouble(OpenPrice+SL*Point, Digits());
}else{
slPrice = 0;
}
orderType = OP_SELL;
}
int orderTicket = OrderSend(Symbol(),orderType,Lot,OpenPrice,3,slPrice,tpPrice,TradeComment,MagicNumber);
}
void CloseAllPositions()
{
int total = OrdersTotal();
for (int i = total - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
int ticket = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 3, White);
}
}
}
}