Menambahkan Martingale Ke Dalam Ea Forex

Pada tutorial ini kita coba membahas bagaimana menambahkan martingale kedalam EA. Seperti kita tahu, aneka macam robot forex yang mengandalkan martingale pada cara kerjanya. Hal itu dapat dipahami sebab dengan martingale, recovery loss serasa lebih cepat dan raihan profit dapat stabil meskipun harus mengorbankan banyak margin, terutama pada ketika loss berturut-turut.

bagaimana menambahkan martingale kedalam EA Menambahkan Martingale ke dalam EA Forex

Ini kita lanjutkan EA yang kemarin saja agar terang alur ceritanya.
Kode terakhir pada artikel tutorial Cara Membuat Robot Forex untuk Pemula
//+------------------------------------------------------------------+
//|                                                    NubiCoder.mq4 |
//|                          Copyright 2016 @ nubicoder.blogspot.com |
//|                                   https://nubicoder.blogspot.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016 @ nubicoder.blogspot.com"
#property link      "https://nubicoder.blogspot.com"
#property version   "1.00"
#property strict

input double   Lot   = 0.1;
input int      TP    = 200;
input int      SL    = 200;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double MA = iMA(NULL,NULL,14,0,0,0,1);
   if (OrdersTotal()==0) {
      if (Ask>MA){
         int ticket = OrderSend(NULL,OP_BUY,Lot,Ask,3,Ask-SL*Point,Ask+TP*Point);
         }
      if (Bid<MA) {
         int ticket = OrderSend(NULL,OP_SELL,Lot,Bid,3,Bid+SL*Point,Bid-TP*Point);
         }
      }
  }
//+------------------------------------------------------------------+


Untuk menambahkan martingale kita memakai logika:
  1. Jika order sebelumnya tertutup dalam kondisi loss, maka kita OP dengan melipatgandakan lot order sebelumnya.
  2. Jika order sebelumnya closed dalam keadaan profit, maka kita OP dengan lot awal sebelum di martingale.

Dalam hal ini kita perlu menambahkan variabel gres adalah variabel lot yang telah di marti. Dan variabel gres ini perlu juga ditetapkan bagaimana nilainya dapat terbentuk, adalah berupa fungsi atau rumusan. Kita namai variabelnya CalcLots. Rumusnya:
double CalcLots() {
     ............
    }
dimana titik-titik itu kawasan kita menulis isyarat rumus bagaimana CalcLots ini dapat terbentuk.

Untuk menyusun kecerdikan terbentuknya nilai CalcLots, kita perlu variabel
  • MinLot untuk memilih minimal lot yang diperbolehkan.
  • MaxLot untuk ukuran lot maksimal yang diperbolehkan.
  • Multiplier sebagai pengkali martingale.
  • LastLot untuk menyimpan nilai lot order yang sudah ditutup. dan,
  • xLot sebagai Output nilai dari variabel CalcLots ini.

Kita masukkan semua variabel itu kedalam rumus, alhasil begini :
double CalcLots() {
   double MinLot=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),2);
   double MaxLot=NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2);
   double xLot;
   double Multiplier=1;
   double LastLot=0;

   ...............
  }

Setelah itu kita perlu menambahkan rumus untuk mengecek order yang gres saja tertutup itu profit atau loss. Dan jikalau ketemunya loss, maka kita marti lotnya. Tapi kalau profit, kita kembalikan lagi lotnya menyerupai sedia kala. Rumus ini ditambahkan dibawah isyarat yang diatas. Jadinya begini :
double CalcLots() {
   double MinLot=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),2);
   double MaxLot=NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2);
   double xLot;
   double Multiplier=1;
   double LastLot=0;
   //------------------------------------------------------
   //Rumus untuk mengecek last closed order profit atau loss
   for(int iCnt=0; iCnt<OrdersHistoryTotal(); iCnt++) {
   if(OrderSelect(iCnt,SELECT_BY_POS,MODE_HISTORY)) {
      LastLot=OrderLots();
      if((OrderMagicNumber()==MagicNumber)&&(OrderProfit()<0)) Multiplier=Martingale;
      if((OrderMagicNumber()==MagicNumber)&&(OrderProfit()>=0)) Multiplier=1;
      }
   }
   //------------------------------------------------------

  ...............................
}

Sampai disini kita sudah mengetahui order yang gres saja tertutup itu loss atau profit dan kapan lotnya harus di martingale. Tapi ini belum selesai, kita masih perlu mengukur besar nilai lotnya yang akan kita gunakan untuk membuka order baru. Kodenya jadi begini :
double CalcLots() {
   double MinLot=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),2);
   double MaxLot=NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2);
   double xLot;
   double Multiplier=1;
   double LastLot=0;
   //------------------------------------------------------
   //Rumus untuk mengecek last closed order profit atau loss
   for(int iCnt=0; iCnt<OrdersHistoryTotal(); iCnt++) {
   if(OrderSelect(iCnt,SELECT_BY_POS,MODE_HISTORY)) {
      LastLot=OrderLots();
      if((OrderMagicNumber()==MagicNumber)&&(OrderProfit()<0)) Multiplier=Martingale;
      if((OrderMagicNumber()==MagicNumber)&&(OrderProfit()>=0)) Multiplier=1;
      }
   }
   //------------------------------------------------------
   //Rumus untuk menghitung nilai lot marti
   if(Multiplier>1) xLot=NormalizeDouble(MathMin(MathMax(LastLot*Multiplier,MinLot),MaxLot),2);
   else
   xLot=NormalizeDouble(MathMin(MathMax(Lot*Multiplier,MinLot),MaxLot),2);
   //------------------------------------------------------
   return(xLot);
   } 

Dengan ini kita sudah selesai menghitung nilai CalcLots. Selanjutnya kita masukkan isyarat rumus CalcLots ini kedalam EA kita yang kemarin, sehingga jadi begini :
//+------------------------------------------------------------------+
//|                                                    NubiCoder.mq4 |
//|                          Copyright 2016 @ nubicoder.blogspot.com |
//|                                   https://nubicoder.blogspot.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016 @ nubicoder.blogspot.com"
#property link      "https://nubicoder.blogspot.com"
#property version   "1.00"
#property strict

input double   Lot   = 0.1;
input int      TP    = 200;
input int      SL    = 200;
input double Martingale = 2;

//---------------------------
double CalcLots() {
   double MinLot=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),2);
   double MaxLot=NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2);
   double xLot;
   double Multiplier=1;
   double LastLot=0;
   //------------------------------------------------------
   //Rumus untuk mengecek last closed order profit atau loss
   for(int iCnt=0; iCnt<OrdersHistoryTotal(); iCnt++) {
   if(OrderSelect(iCnt,SELECT_BY_POS,MODE_HISTORY)) {
      LastLot=OrderLots();
      if(OrderProfit()<0) Multiplier=Martingale;
      if(OrderProfit()>=0) Multiplier=1;
      }
   }
   //------------------------------------------------------
   //Rumus untuk menghitung nilai lot marti
   if(Multiplier>1) xLot=NormalizeDouble(MathMin(MathMax(LastLot*Multiplier,MinLot),MaxLot),2);
   else
   xLot=NormalizeDouble(MathMin(MathMax(Lot*Multiplier,MinLot),MaxLot),2);
   //------------------------------------------------------
   return(xLot);
   }

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double MA = iMA(NULL,NULL,14,0,0,0,1);
   if (OrdersTotal()==0) {
      if (Ask>MA){
         int ticket = OrderSend(NULL,OP_BUY,CalcLots(),Ask,3,Ask-SL*Point,Ask+TP*Point);
         }
      if (Bid<MA) {
         int ticket = OrderSend(NULL,OP_SELL,CalcLots(),Bid,3,Bid+SL*Point,Bid-TP*Point);
         }
      }
  }
//+------------------------------------------------------------------+

Terakhir, compile isyarat diatas di meta editor dan coba jalankan di strategy tester. Jika sudah berjalan dengan semestinya dan fungsi lot martingalenya berfungsi, itu tandanya sudah berhasil. Demikianlah cara menambahkan martingale kedalam EA. Semoga bermanfaat.

Subscribe to receive free email updates:

0 Response to "Menambahkan Martingale Ke Dalam Ea Forex"

Post a Comment