Belajar Membuat EA Sederhana 18 Martingel


http://jumforex.blogspot.com/2012/10/belajar-membuat-ea-sederhana-18.html

Pastian sudah mengikuti part 17 sebelumnya disiini

Pada pembahasan ali ini kita akan membuat EA yang bertype Martingel , saya rasa banyak penggemar Ea yang berjenis kelaminnya martingel heeeeeeee

Pada Ea martingel yang kita bikin ini hanya mengedit Ea sebelumnya di part 17 dan saya beri nama Jum+Donchian+v2

Seperti biasa dalam Ea martingel ada beberapa parameter tambahan bila dibanding dengan Ea non martingel,  al:

  1. Pengali lot , sering diberi nama multiflier atau multi saja ..... atau dimarti haaa   ya .. suka2 aja yang bikin. 
  2. Jarak antar order , sering diberi nama pips atau range atau apalah suka2
  3. Banyaknya level order, ini merupaan batasan jumlah order masksimum

Nah dari penambahan 3 parameter di atas maka kita akan membuat codingnya

Pengali lot

Ada banyak cara dalam membuat pengali lot order ini , pada bagian ini saya akan menggunakan fungsi matematika MathPow (merupakan fungsi matematika yang digunakan menghitung kelipatan).
Aturannya  MathPow(double value1, double value 2)
value 1 = merupakan bilangan kelipatan
value 2 = bilangan level kelipatan

Jadi dalam hal ini kita gunakan Lots*MathPow(DiMarti,jumlahorder())
dalam hal ini pengali lot kita gunaan DiMarti

Cara lain selain dengan menggunakan MathPow adalah dengan mengalikan order lot terakhir dengan DiMarti 
(lain kali kita bahas)
Nah dalam hal ini saya buat fungsinya sbb:


double xlot(int m)
{
double ylot,dlot;
for (int i = 0; i < OrdersTotal(); i++) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic ||OrderType()!=m) continue;
   dlot=OrderLots();
   }
if(OrderType()==m)ylot=NR(Lots*MathPow(DiMarti,jumlahorder(m)));
return(ylot);
}



Jarak antar order
Jarak antar order ini di hitung dari harga order sebelumnya sering disebut Orderopenprice.
Nah untuk menentukan besaran Orderopenprice pada order terahir perlu dibuat scrip pencacah atau untuk menghitung order openprice terahir
saya gunakan fungsi sbb:

int trad()
{
int type,dp; double opb,ops,lastlotb,lastlots;
for (int i = 0; i < OrdersTotal(); i++) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
   type=OrderType();
if(type==0)opb = OrderOpenPrice();
if(type==1)ops = OrderOpenPrice();
}
   double as = opb - Jarak_order * pt;
   double bi = ops + Jarak_order * pt;
   if ( Ask <= as &&  jumlahorder(0)> 0 ) dp=1; 
if ( Bid >= bi &&  jumlahorder(1)> 0 ) dp=2;

return(dp);
}

Banyaknya level order
Untuk membatasi order maka saya gunakan batasan jumlahorder(0)<Max_order , jumlahorder(1)<Max_order 

Haaa wah udah hampir jadi nih .....

Nah saya aan tambahkan filter candel supaya kalau ada news panjang akan order setiap pergantian candel , dengan memanfaatan wt!=Time[0] seperti pembahasan sebelumnhya.

Terapan tambahan untuk order martingelnya saya buat sbb:


if(trad()==1 && wt!=Time[0] && jumlahorder(1)==0 && jumlahorder(0)<Max_order  && Trade_buy  && signal==2) {OrderSend(Symbol(),OP_BUY,xlot(0),Ask,3,slb, tpb,Nama_EA,Magic,0,Blue); wt=Time[0]; }
if(trad()==2 && wk!=Time[0] && jumlahorder(0)==0 && jumlahorder(1)<Max_order  && Trade_sell && signal==1) {OrderSend(Symbol(),OP_SELL,xlot(1),Bid,3,sls, tps,Nama_EA,Magic,0,Red); wk=Time[0];  }


Dan untuk sedikit melihat info maka saya juga  buatkan fungsi untuk membuat labelnya

void label()
{
Comment("\n ",
"\n ",
"\n ------------------------------------------------",
"\n :: =>+Jum+Donchian+v2<=",
"\n :: =>JumForex.blogspot.com<=",
"\n ------------------------------------------------",
"\n :: Spread                 : ", MarketInfo(Symbol(), MODE_SPREAD),
"\n :: Leverage               : 1 : ", AccountLeverage(),
"\n :: Equity                 : ", AccountEquity(),
"\n :: Jam Server             :", Hour(), ":", Minute(),
"\n ------------------------------------------------",
"\n :: >>By: Jum69<<",
"\n ------------------------------------------------");
}


Sehingga jadinya gini deh


//+------------------------------------------------------------------+
//|                                                 EA Jum+Donchian+ |
//|                                                gifaesa@yahoo.com |
//|                                     http://JumForex.blogspot.com |
//+------------------------------------------------------------------+

#property copyright "JumForex.blogspot.com"
#property link      "Gifaesa@yahoo.com"

extern string  Nama_EA                 = "Jum+Donchian+v2";
extern bool    Trade_buy               = true;
extern bool    Trade_sell              = true;
extern int     Mulai_Jam               = 6;
extern int     Akhir_Jam               = 20;
extern bool    Tp_in_Money             = true;
extern double  TP_in_money             = 10;
extern int     TP                      = 100;
extern int     SL                      = 0;
extern double  Lots                    = 0.1;
extern int     Jarak_order             = 35;
extern int     Max_order               = 10;
extern double  DiMarti                 = 1.3;
extern bool    TrailingStop_           = false;
extern int     TrailingStop            = 20;
extern int     Magic                   = 69;
extern string  Seting_Donchian         = "Sesuka Hati";
extern int     IPeriod                 = 20;

double slb,tpb,sls,tps,pt;
int wt,wk,tiket,ticet;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   if(Digits==3 || Digits==5) pt=10*Point;   else   pt=Point;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
label();
if(TrailingStop_)dtrailing();
if(Tp_in_Money && TP_in_money<= money()){ 
   closeall(0);
   closeall(1);
   }
//----
 double da = iCustom(Symbol(), 0,"Donchian Bands",IPeriod, 0,0 ) ;// garis atas modenya 0
 double db = iCustom(Symbol(), 0,"Donchian Bands",IPeriod, 1,0 ) ;// garis bawah modenya 1
 double dt = iCustom(Symbol(), 0,"Donchian Bands",IPeriod, 2,0 ) ;// garis tengah modenya 2
int signal;
if(da<Ask) signal=1;// aturan buy
if(db>Bid) signal=2;//aturan sell
if(Jam_trade()==1){
   if(SL==0)slb=0;else slb=Ask-SL*pt;
   if(SL==0)sls=0;else sls=Bid+SL*pt;
   if(TP==0)tpb=0;else tpb=Ask+TP*pt;
   if(TP==0)tps=0;else tps=Bid-TP*pt;
  if(jumlahorder(0)==0 && jumlahorder(1)==0  && Trade_buy  && signal==2) {OrderSend(Symbol(),OP_BUY,NR(Lots),Ask,3,slb, tpb,Nama_EA,Magic,0,Blue);}
  if(jumlahorder(0)==0 && jumlahorder(1)==0  && Trade_sell && signal==1) {OrderSend(Symbol(),OP_SELL,NR(Lots),Bid,3,sls, tps,Nama_EA,Magic,0,Red);}
 }
if(trad()==1 && wt!=Time[0] && jumlahorder(1)==0 && jumlahorder(0)<Max_order  && Trade_buy  && signal==2) {OrderSend(Symbol(),OP_BUY,xlot(0),Ask,3,slb, tpb,Nama_EA,Magic,0,Blue); wt=Time[0]; }
if(trad()==2 && wk!=Time[0] && jumlahorder(0)==0 && jumlahorder(1)<Max_order  && Trade_sell && signal==1) {OrderSend(Symbol(),OP_SELL,xlot(1),Bid,3,sls, tps,Nama_EA,Magic,0,Red); wk=Time[0];  }

   return(0);
  }
//+------------------------------------------------------------------+

int Jam_trade()
{
   bool trade = false;
   if(Mulai_Jam > Akhir_Jam){
     if (Hour() >= Mulai_Jam || Hour() < Akhir_Jam) trade = true;
   } else
     if (Hour() >= Mulai_Jam && Hour() < Akhir_Jam) trade = true;

   return (trade);
}

int jumlahorder( int tipe)
{
int total=0;
for(int i=0; i<OrdersTotal(); i++)
  {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic || OrderType()!=tipe) continue;
     total++;
  }

return(total);
}
double NR(double thelot)
{
    double maxlots = MarketInfo(Symbol(), MODE_MAXLOT),
    minilot = MarketInfo(Symbol(), MODE_MINLOT),
    lstep = MarketInfo(Symbol(), MODE_LOTSTEP);
    double lots = lstep * NormalizeDouble(thelot / lstep, 0);
    lots = MathMax(MathMin(maxlots, lots), minilot);
    return (lots);
}

void dtrailing()
{
for(int i=0; i<OrdersTotal(); i++){
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic ) continue;
        if(OrderType()==OP_BUY)  {
         if(Bid-OrderOpenPrice()>pt*TrailingStop)  {
           if((OrderStopLoss()<Bid-pt*TrailingStop) || (OrderStopLoss()==0)) {
              OrderModify(OrderTicket(),OrderOpenPrice(),Bid-pt*TrailingStop,OrderTakeProfit(),0,Green);
              return(0);
              }
              }
           }
        if(OrderType()==OP_SELL)  {
         if((OrderOpenPrice()-Ask)>(pt*TrailingStop)){
           if(OrderStopLoss()>(Ask+pt*TrailingStop) || (OrderStopLoss()==0)){
              OrderModify(OrderTicket(),OrderOpenPrice(),Ask+pt*TrailingStop,OrderTakeProfit(),0,Red);
              return(0);
              }
              }
           }
     }
  
}
void closeall(int m)
{
for (int i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber()!=Magic || m!= OrderType()) continue;
if (OrderType() > 1) OrderDelete(OrderTicket());
else {
if (OrderType() == 0) OrderClose(OrderTicket(), OrderLots(), Bid, 3, CLR_NONE);
else               OrderClose(OrderTicket(), OrderLots(), Ask, 3, CLR_NONE);
}
}
}
double money()
{
double dp = 0;
int i;
for (i = 0; i < OrdersTotal(); i++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol()  || OrderMagicNumber()!=Magic) continue;
dp += OrderProfit();
}
return(dp);
}

int trad()
{
int type,dp; double opb,ops,lastlotb,lastlots;
for (int i = 0; i < OrdersTotal(); i++) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
   type=OrderType();
if(type==0)opb = OrderOpenPrice();
if(type==1)ops = OrderOpenPrice();
}
   double as = opb - Jarak_order * pt;
   double bi = ops + Jarak_order * pt;
   if ( Ask <= as &&  jumlahorder(0)> 0 ) dp=1; 
if ( Bid >= bi &&  jumlahorder(1)> 0 ) dp=2;

return(dp);
}
double xlot(int m)
{
double ylot,dlot;
for (int i = 0; i < OrdersTotal(); i++) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic ||OrderType()!=m) continue;
   dlot=OrderLots();
   }
if(OrderType()==m)ylot=NR(Lots*MathPow(DiMarti,jumlahorder(m)));
return(ylot);
}
void label()
{
Comment("\n ",
"\n ",
"\n ------------------------------------------------",
"\n :: =>+Jum+Donchian+v2<=",
"\n :: =>JumForex.blogspot.com<=",
"\n ------------------------------------------------",
"\n :: Spread                 : ", MarketInfo(Symbol(), MODE_SPREAD),
"\n :: Leverage               : 1 : ", AccountLeverage(),
"\n :: Equity                 : ", AccountEquity(),
"\n :: Jam Server             :", Hour(), ":", Minute(),
"\n ------------------------------------------------",
"\n :: >>By: Jum69<<",
"\n ------------------------------------------------");
}

Sepertinya EA ini udah layak di Coba deh untuk di Beck test  ........

Nah sampai disini monggo dicoba kalao ada manfaat dan pertanyaan silahkan kasih komen ya

Smoga bermanfaat!