Senin, 24 Desember 2012

Belajar Membuat EA Sederhana 16


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

Setelah kita membuat EA average dengan pergantian candel pada part sebelumnya

Kali ini Kita akan bahas membuat EA dengan indikator diluar Mt4
Nah kali ini kita aan bahas membuat EA dengan indikator Donchian Bands
Indikator ini sudah cukup terkenal

Nah sebelum kita coba membuat custom indiator ini, hal yang perlu diketahui sebelum membuat custom indinya adalah mencek nilai indikator dulu , caranya:

attack indikator ke chart di mt4
tekan Ctrl D

Nah sekarang perhatikan nilai yang ada dalam jendela tersebut!
Mengingat banyanya indikator yang dibikin oleh para programer tentu untuk membaca indikator dan menentukan nilai perlu latihan dan sering mencoba dan mencoba!


Pada gambar di atas adalah cara menentukan indikator yang tidak ada di mt4, di dahului dengan iCustom.

double donci = iCustom(Symbol(), Timeframe, "Nama indiatornya", bufer, mode, shift);

Saya beri nama donci (contoh saja)  ,
Timeframe bisa di sesuaikan lihat pembahasan di part awal
Nama indikator  disesuaikan dengan tanda " "
bufer ini tergantung indikatornya , setiap indikator punya bufer berbeda-beda maksimal jumlahnya 8
contoh kalo ada 3 bufer
double indi_x = iCustom(Symbol(), Timeframe, "Nama indiatornya", bufer1, bufer2, bufer3, mode, shift);
Mode adalah urutan nilai yang keluar dari indikatornya (bisa di cek pada jendela Ctrl D), ini dimulai dari 0 ;
Shift adalah seperti pada candel yang telah dibahas sebelumnya , contoh diisi 0 artinya candel yang sedang berjalan, diisi 1 artinya candel 2 sebelumnya

Oke kita lanjut  membuat custom dengan indikator Donchian Bands , namun seblum itu silahkan download dulu indiatornya disini 

Nah kalu sudah di download silahan di attac ke Mt4 dan kemudian tekan Ctrl D


Perhatikan pada jendela data windows
Ada 3 buah nilai , paling atas ini adalah mode 0, sedangkan di bawahnya mode 1 dan paling bawah mode 2.

Pada tampilan indiator trsebut ada 3 buah garis yaitu paling atas merah, tengah hijau dan bawah merah.
Untuk menetuan nilai 3 garis tersebut arahan pointer ke garis tersebut!
Pada garis paling atas maka kalau di cek data windows pada saat diarahan garis merah atas maka nilainya akan sama dengan mode 0,
Pada garis hijau tengah maka nilainya cocok dengan mode 3
dan pada garis bawah merah nilainya cocok dengan mode 2

Nah dari nilai diatas untu menentuan customnya

Searang kita lihat nilai bufernya , tekan Ctrl I dan double klik pada indikator Donchian Bands , maa aan tampil sbb:


Maka terdapat satu nilai bufer , yaitu IPeriod

Sekarang dari data di atas kita coba buat customnya
Karena ada 3 buah modenya sehingga kita buat 3 buah nama ,  yaitu da, db dan dt (nama ini sebarang saja)


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

pada shift nya kebetulan saya ini 0 artinya candel yang sedang berjalan

Untuk mengecek apakah custom yang kita buat tersebut berhasil membaca nilanya maka kita lihat dengan mmanfaatkan comment

Saya coba buatkan EAnya


//+------------------------------------------------------------------+
//|                                                           in.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern int IPeriod=20;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+

int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
 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

Comment("garis atas ",da,"garis tengah ",dt, "garis bawah ",db);
//----
   return(0);
  }
//+------------------------------------------------------------------+


dari EA pembaca tersebut akan terlihat sbb:



Oke cukup mudah kan?

Oke deh yang sudah mengerti silahan dibuat EAnya ya  dengan mengacu pada EA pada part sebelumnya, saya kira cuup mudah!

Semoga sukses

Jangan lupa asih komen kalau sudah berhasil !

Sampai di part berikutnya!

Belajar Membuat EA Sederhana 15


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

Pastian sudah membaca part 14 disini 

Pada bagian ini kita akan memodifikasi EA pada part 14 dengan sedikit penambahan hedge average
Seperti pada part-part sebelumnya telah dibahas juga op hedge (buy dan sell) .

Supaya terjadi ordernya tidak satu arah tetapi order berdasarkan signal yang terjadi , maka bagian yang di rubah adalh pagian trigernya dengan menghilangkan filter jumlah order yang berlawanan , sebagai berikut:


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


Sehingga bila dimasukkan ke dalam EAnya :


//+------------------------------------------------------------------+
//|                                             EA MA Cross AntiQ+   |
//|                                                gifaesa@yahoo.com |
//|                                     http://JumForex.blogspot.com |
//+------------------------------------------------------------------+

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

extern string  Nama_EA                 = "Cross AntiQ+";
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             = 2;
extern int     TP                      = 100;
extern int     SL                      = 100;
extern int     Max_order               = 10;
extern double  Lots                    = 0.1;
extern bool    TrailingStop_           = true;
extern int     TrailingStop            = 20;
extern int     Magic                   = 69;
extern string  Seting_MA               = "Sesuka Hati";
extern int     Pereode_1                 = 4;
extern int     Pereode_2                 = 4;

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()
  {

if(TrailingStop_)dtrailing();
if(Tp_in_Money && TP_in_money<= money()) closeall();
//----
double MA_1O =iMA(Symbol(),0,Pereode_1,0,MODE_SMA,PRICE_OPEN ,1);
double MA_1C =iMA(Symbol(),0,Pereode_1,0,MODE_SMA,PRICE_CLOSE ,1);
double MA_2O =iMA(Symbol(),0,Pereode_2,0,MODE_SMA,PRICE_OPEN ,2);
double MA_2C =iMA(Symbol(),0,Pereode_2,0,MODE_SMA,PRICE_CLOSE ,2);

int signal;
if(MA_2O >MA_2C && MA_1O < MA_1C) signal=1;// aturan buy
if(MA_2O <MA_2C && MA_1O > MA_1C) 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)<Max_order  && Trade_buy  && signal==1  && wt!=Time[0] ){tiket = OrderSend(Symbol(),OP_BUY,NR(Lots),Ask,3,slb, tpb,Nama_EA,Magic,0,Blue);
  if(tiket>0) wt=Time[0];
  }
  if( jumlahorder(1)<Max_order && Trade_sell && signal==2  && wk!=Time[0]) {ticet = OrderSend(Symbol(),OP_SELL,NR(Lots),Bid,3,sls, tps,Nama_EA,Magic,0,Red);
  if(ticet>0) 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()
{
for (int i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber()!=Magic ) 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);
}

Jadideh..........
Semoga sukses deh

Salam

2 komentar:

  1. Assalamu'alaikum!
    Maaf master, mau tanya, kalau coding untuk biar OP mengikuti trend besar gimana ya? contohnya begini :
    Jika Trend besar turun, EA hanya akan OP SELL meskipun ada sinyal buy, begitu sebaliknya.
    jadi bisa otomatis, tidak usah mengubah settingan Trade_Buy = true/false & Trade_Sell = True/False
    sekian master, mohon maaf sebelumnya.
    wassalam
    Balas
    Balasan
    1. berarti perlu ditambah filter di trigernya
      contoh pada ea di atas
      if(MA_2O >MA_2C && MA_1O < MA_1C && tambah aturan trend besar buy) signal=1;// aturan buy
      if(MA_2O MA_1C && tambah aturan trend besar sell) signal=2;//aturan sell

Belajar Membuat EA Sederhana 14


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

Pastikan anda membaca di part 13 disini

Nah  part 14 kali ini kita akan memodifikasi EA pada part 13 supaya EAnya bertipe average

Rule yang saya tambahkan adalah order dalam pergantian candel bila terjadi order lanjutan (average) .
Order lanjutan tersebut tidak berdasarkan range atau pips tetapi dibuat order persignal, sehingga ketika ada order buy dan terjadi cross ma signal buy maka akan melakukan order lanjutan dala pergantian candel

Adapun bagian yang penting perlu ditambahkan adalah batasan op == Max_order
Hal lain adalah saya tambahkan pilihan trailing =false/true;

Sedangkan bagian pentingnya adalah penambahan filter pergantian candel , sy tambahan
if(wt!=Time[0]){ blabla..........................

if(tiket>0) wt=Time[0];
}


ini adalah filter untuk order pada pergantian candel

Nah ini hasilnya:

//+------------------------------------------------------------------+
//|                                             EA MA Cross AntiQ+   |
//|                                                gifaesa@yahoo.com |
//|                                     http://JumForex.blogspot.com |
//+------------------------------------------------------------------+

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

extern string  Nama_EA                 = "Cross AntiQ+";
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             = 2;
extern int     TP                      = 100;
extern int     SL                      = 100;
extern int     Max_order               = 10;
extern double  Lots                    = 0.1;
extern bool    TrailingStop_           = true;
extern int     TrailingStop            = 20;
extern int     Magic                   = 69;
extern string  Seting_MA               = "Sesuka Hati";
extern int     Pereode_1                 = 4;
extern int     Pereode_2                 = 4;

double slb,tpb,sls,tps,pt;
int wt,tiket;
//+------------------------------------------------------------------+
//| 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()
  {

if(TrailingStop_)dtrailing();
if(Tp_in_Money && TP_in_money<= money()) closeall();
//----
double MA_1O =iMA(Symbol(),0,Pereode_1,0,MODE_SMA,PRICE_OPEN ,1);
double MA_1C =iMA(Symbol(),0,Pereode_1,0,MODE_SMA,PRICE_CLOSE ,1);
double MA_2O =iMA(Symbol(),0,Pereode_2,0,MODE_SMA,PRICE_OPEN ,2);
double MA_2C =iMA(Symbol(),0,Pereode_2,0,MODE_SMA,PRICE_CLOSE ,2);

int signal;
if(MA_2O >MA_2C && MA_1O < MA_1C) signal=1;// aturan buy
if(MA_2O <MA_2C && MA_1O > MA_1C) 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(wt!=Time[0]){
  if(jumlahorder(0)<Max_order && jumlahorder(1)==0 && Trade_buy  && signal==1 ) {tiket = OrderSend(Symbol(),OP_BUY,NR(Lots),Ask,3,slb, tpb,Nama_EA,Magic,0,Blue);}
  if(jumlahorder(0)==0 && jumlahorder(1)<Max_order && Trade_sell && signal==2 ) {tiket = OrderSend(Symbol(),OP_SELL,NR(Lots),Bid,3,sls, tps,Nama_EA,Magic,0,Red);}
  if(tiket>0) wt=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()
{
for (int i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber()!=Magic ) 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);
}

Oke deh semboga menambah wawasan

salam sukses

Jangan lupa kasih komen ya

Belajar Membuat EA Sederhana 13


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

Pastikan sebelumnya sudah membaca di part 12 disini

Pada bagian ini saya akan coba membahas tentang EA dari crossing MA permintaan seorang trader sbb:
"Saya minta tolong untuk dibuatkan EA dari indicator MA4 Open dan MA4 Close master "



Kita buat costum dan logikanya dulu  sbb:

double MA_1O =iMA(Symbol(),0,Pereode_1,0,MODE_SMA,PRICE_OPEN ,1);
double MA_1C =iMA(Symbol(),0,Pereode_1,0,MODE_SMA,PRICE_CLOSE ,1);
double MA_2O =iMA(Symbol(),0,Pereode_2,0,MODE_SMA,PRICE_OPEN ,2);
double MA_2C =iMA(Symbol(),0,Pereode_2,0,MODE_SMA,PRICE_CLOSE ,2);

int signal;
if(MA_2O >MA_2C && MA_1O < MA_1C) signal=1;// aturan buy
if(MA_2O <MA_2C && MA_1O > MA_1C) signal=2;//aturan sell

logika diatas biasa digunakan untuk crosing MA

Nah pada EA yang akan kita buat ini saya akan tambahkan untuk tp in money   (hiden tp dengan acuan jumlah profit daam money $ )

kita buat fungsi untuk menghitung profit dalam $


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);
}

Langkah berikutnya adalah membuat fungsi closeall yaitu untuk menutup semua order ketika tpin money tercapai:

void closeall()
{
for (int i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber()!=Magic ) 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);
}
}
}

Jadi pembuatan ea kali ini ada penambahan tp in money sehingga pada fungsi diatas bisa dibuat perintah untuk mengeksekusi  tp in money

if(tp_in_money<= money()) closeall();

Jadi ketika  profit sudah lebih besar atau sama dengan tp_in_money maka semua order di closeall

pada Ea yang kita buat kali ini EA yang hanya 1 arah (bukan hedge)

Nah dari fungsi2 diatas kita gabungkan dengan EA pada part 12 , sehingga jadinya sebagai berikut :


//+------------------------------------------------------------------+
//|                                             EA MA Cross AntiQ+   |
//|                                                gifaesa@yahoo.com |
//|                                     http://JumForex.blogspot.com |
//+------------------------------------------------------------------+

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

extern string  Nama_EA                 = "Cross AntiQ+";
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             = 2;
extern int     TP                      = 100;
extern int     SL                      = 100;
extern double  Lots                    = 0.1;
extern int     TrailingStop            = 20;
extern int     Magic                   = 69;
extern string  Seting_MA               = "Sesuka Hati";
extern int     Pereode_1                 = 4;
extern int     Pereode_2                 = 4;

double slb,tpb,sls,tps,pt;
//+------------------------------------------------------------------+
//| 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()
  {

dtrailing();
if(Tp_in_Money && TP_in_money<= money()) closeall();
//----
double MA_1O =iMA(Symbol(),0,Pereode_1,0,MODE_SMA,PRICE_OPEN ,1);
double MA_1C =iMA(Symbol(),0,Pereode_1,0,MODE_SMA,PRICE_CLOSE ,1);
double MA_2O =iMA(Symbol(),0,Pereode_2,0,MODE_SMA,PRICE_OPEN ,2);
double MA_2C =iMA(Symbol(),0,Pereode_2,0,MODE_SMA,PRICE_CLOSE ,2);

int signal;
if(MA_2O >MA_2C && MA_1O < MA_1C) signal=1;// aturan buy
if(MA_2O <MA_2C && MA_1O > MA_1C) 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==1) {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==2) {OrderSend(Symbol(),OP_SELL,NR(Lots),Bid,3,sls, tps,Nama_EA,Magic,0,Red);}
 }

//----
   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()
{
for (int i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber()!=Magic ) 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);
}

Jadi deh silahkan di coba untuk di test di buat sebagai tambahan wawasan

sampai jumpa di part berikutnya

Semoga sukses



Belajar Membuat EA Sederhana 12


http://jumforex.blogspot.com/2012/09/belajar-membuat-ea-sederhana-12.html

pastikan untuk mengikuti posting ini mengikuti part  11

Kali ini kita akan coba melanjutkan tentang  membuat EA sederhana yang sebelumnya sudah banyak saya bahas di post sebelumnya.
EA yang dibikin di posting ini telah saya  becktest ternyata hasilnya termasuk lumayan untuk sebuah EA sederhana, ini imagenya:
Haaaaaa menarik kan!

Langsung saja kita  EA tersebut  rulenya sbb
Untuk buy
  1. Open candel 2 dibawah MA 2 dan close candel 2  diatas MA 2
  2. Open candel 1 diatas MA 1 dan close candel diatas MA 1
  3. Harga masih di atas MA1
Untuk sell kebalikan dari buy
Hal yang lain perlu ditambahkan adalah
  1. Jam trading
  2. SL dan TP bisa di atur 0
  3. Trailing  yang bisa di atur 
  4. TF suka2 ditadak ditentukan
Nah dari rule diatas mungkin ada hal yang baru dalam EA kali ini al;

 1. TP dan SL supaya bisa di isi dengan 0

Pada  EA sebelumnya bila TP dan SL  diisi dengan 0 , maka akan error hal ini karena belum ada digunakan fasilitas untuk itu. Nah dalam supaya TP dan SL bisa diisi dengan 0 maka harus di buat variabel untuk mewakili pada harga TP maupun SL.
Untuk mudahnya harga pada Takeprofit buy saya buat ==>    double tpb, untuk takeprofit sell==>double tps , harga pada stoploss buy==> double slb dan stoploss sell==> double sls.

terlebih dahulu  dibuat deklarasi
  double slb,tpb,sls,tps,pt;
dan membuat logikanya
   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-SL*pt;
   if(TP==0)tps=0;else tps=Bid+SL*pt;
 OrderSend(Symbol(),OP_BUY,NR(Lots),Ask,3,slb, tpb,Nama_EA,Magic,0,Blue);
OrderSend(Symbol(),OP_SELL,NR(Lots),Bid,3,sls, tps,Nama_EA,Magic,0,Red);

2. Trailing

Untuk membuat script trailing ada banyak cara , tapi pada trailing yang akan kita buat ini saya buat dengan fungsi untuk perintah dengan mnggunakan void
perhatikan

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 digunakan sebagai fungsi trailing  , sehingga dtrailing() harus dibuat di bawah int star()

 3. Logika buy dan sell

sesuai rule diatas maka dibuat logika sbb:

double MA2 =iMA(Symbol(),0,Pereode,0,MODE_SMA,PRICE_CLOSE ,2);
double MA1 =iMA(Symbol(),0,Pereode,0,MODE_SMA,PRICE_CLOSE ,1);
int signal;
if(Open[2]<MA2 && Close[2]>MA2 && Open[1]>MA1 && Close[1]>MA1 && Ask>MA1) signal=1;// aturan buy
if(Open[2]>MA2 && Close[2]<MA2 && Open[1]<MA1 && Close[1]<MA1 && Bid<MA1) signal=2;//aturan sell

Nah logika diatas dibuat signal =1 berarti order buy dan bila signal=2 berarti order sell

Nah siahkan dilihat hasilnya dan menambah wawasan dari EA rule diatas


//+------------------------------------------------------------------+
//|                                                   EA MA AntiQ+   |
//|                                                gifaesa@yahoo.com |
//|                                     http://JumForex.blogspot.com |
//+------------------------------------------------------------------+

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

extern string  Nama_EA                 = "MA AntiQ";
extern bool    Trade_buy               = true;
extern bool    Trade_sell              = true;
extern int     Mulai_Jam               = 6;
extern int     Akhir_Jam               = 20;
extern int     TP                      = 100;
extern int     SL                      = 100;
extern double  Lots                    = 0.1;
extern int     TrailingStop            = 20;
extern int     Magic                   = 69;
extern string  Seting_MA               = "Sesuka Hati";
extern int     Pereode                 = 33;
double slb,tpb,sls,tps,pt;
//+------------------------------------------------------------------+
//| 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()
  {

dtrailing();
//----
double MA2 =iMA(Symbol(),0,Pereode,0,MODE_SMA,PRICE_CLOSE ,2);
double MA1 =iMA(Symbol(),0,Pereode,0,MODE_SMA,PRICE_CLOSE ,1);
int signal;
if(Open[2]<MA2 && Close[2]>MA2 && Open[1]>MA1 && Close[1]>MA1 && Ask>MA1) signal=1;// aturan buy
if(Open[2]>MA2 && Close[2]<MA2 && Open[1]<MA1 && Close[1]<MA1 && Bid<MA1) 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 && Trade_buy  && signal==1) {OrderSend(Symbol(),OP_BUY,NR(Lots),Ask,3,slb, tpb,Nama_EA,Magic,0,Blue);}
  if(jumlahorder(1)==0 && Trade_sell && signal==2) {OrderSend(Symbol(),OP_SELL,NR(Lots),Bid,3,sls, tps,Nama_EA,Magic,0,Red);}
 }

//----
   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);
              }
              }
           }
     }
  
}


EA ini sebenarnya sudah termasuk bagus bisa digunakan sebagai bahan pembelajaran
Silahkan di coba di becktes hasilnya cukup bagus untuk sebuah EA sederhana dan mungkin bisa di coba untuk di Fowardtes

dan  bila ada yang belum jelas silahkan kasih komen!
//sudah dikoreksi ada sedikit kesalahan paste //
Semoga bermanfaat

4 komentar:

  1. Siiip..., Aku masih selalu mengikuti pelajarannya mas bro...!!
    pada codebased pelajaran 11 kemarin sudah saya utak atik dengan menambahi logic buy & sell menggunakan indi fractal, he.. he...
    Kalau bisa pelajarannya nanti diteruskan sampai kepada strategi tradingnya, seperti martingale, hedging dsb. dalam bentuk void, jadi tinggal manggil. Oke thank sudah berbagi.!!
    Balas
  2. Oh ya kalau konsultasi lewat YM boleh nggak ya ?
    Balas
  3. koq jadi kacau ya mas jum..??
    banyak perubahan,, jadi bingung..
    Balas
    Balasan
    1. perubahan yang di tambahkan adalah:
      1. triger buy /sell dengan menambahkan indikator MA dan candel
      2. suport tp dan sl supaya bisa di isi dengan nol
      3. suport 5 digit (ini juga sudah dibahas)
      4. penambabahan trailing

      dipelajari santai aja , pelan2
      Ym boleh saja : gifaesa