Anda di halaman 1dari 51

MQL4

Kali ini di sela2 nganggur nunggu Adzan beduk heeeeeeeeeeeee

Sesuai dengan janji saya di post sebelumnya maka saya akan coba share cara belajar bikin EA
sederhana .
Mengingat saya bukan programer karena saya belajar otodidak dari forum2 untuk itu saya akan
memaparkan dengan gaya saya bukan seperti programer karena keterbatasan kemampuan
jadilah bahasa saya mudah2an mudah dipahami

Okey!
Saya mencoba mengajak rekan2 untuk sedikit belajar atau mengengal sebuah EA sederhana.
Karena bagi trader yang sudah lama menekuni forex rasanya kurang lengkap kalau belum bisa bikin EA
sendiri, meskipun itu sangat sedehana.

Sudah banyak forum2 membahas masalah bahasa mql4 , mungkin melihat sekilas tulisan huruf2 yang banyak
akan pusing ...................
Tapi sebenarnya tidak juga kalau mau niat belajar ======> enjoy aja!

Kuncinya belajar bikin EA adalah tekun dan rajin bertanya!


dan juga rajin ngumpulun  script library script...................................heeeeeeee gitu
maksudnya ngumpulun  script gimana ya?

tiap EA di bikin dengan parameter2 dan seuai ketentuan yang bikin EA


contoh yang sederhana adalah script perintah order/perintah  buy

OrderSend(Symbol(),0,start_lot,Ask,3,Ask-SL*Point,Ask+TP*Point,"+Jum+oke+",Magic,0,Blue)

kadang adajuga ditulis seperti ini

OrderSend(Symbol(),OP_BUY,start_lot,Ask,slipage,Ask-SL*Point,
Ask+TP*Point,"+Jum+oke+",Magic,0,Blue);

sekilas beda sebenarnya sama saja


Nah untuk lebih detil nanti kita bahas di post berikutnya 

Oke
Nah untuk belajar kali ini saya mulai dari setengah dasar  anggab lah yang baca ini sudah pernah membuka
metaeditor

dan gak usah banya teori kita langsung aja buka metaeditor
kemudian ==> tekan keyboardnya  CTRL  N
maka akan muncul
Pastikan pada pilihan Expert Advisor 
terus klik aja next
dan muncul jendela dan tuliskan nama EA yang akan dibikin
saya coba tulis di nama ==> ss
maka akan muncul sbb

int deinit()
{
/ / ----

/ / ----
return(0);
}
/ / +------------------------------------------------------------------+
/ / | expert start function |
/ / +------------------------------------------------------------------+
int start()
{
/ / ----
/ / ----
return(0);

Nah Jadi deh

Kita langsung aja membuat EA sederhana dengan  rule sbb


1. EA akan Buy bila tidak ada order
Kali ini kita akan langsung bikin EA yang sudah siap bisa digunakan

Dengan rule sbb:


1.  Bila tidak ada order maka akan melakukan buy
2. Menggunakan TP dan SL

Okey cukup sederhana sehingga input parameternya sbb:


1. Nama EA = Buy saja.
2. TP.
3  SL.
4. Lots
5. MagicNumber 

Pada posting saya sebelumnya (di part 1) sudah saya jelaskan untuk memulai Ketika Metaeditor kita sudah di
buka maka tekan CTRL N maka akan muncul jendela menu pilihan Expert Advisor yang dipilih kemudian klik
next  , dan beri nama EA Buy saja

sehingga jadinya begini:

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

/ / +------------------------------------------------------------------+
/ / | expert initialization function |
/ / +------------------------------------------------------------------+
int init()
{
/ / ----

Untuk membuat parameter sebuah EA maka tiap data di dahului dengan extern  sebagai deklarasi
dan di tempatkan dibawah :

#property copyright "Copyright 2012, MetaQuotes Software Corp."


#property link      "http://www.metaquotes.net"

disini

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

Nah kita siapkan  parameter 1


Nama EA = Buy saja
Untuk penamaan ini menggunakan type daya String yaitu data berupa teks sebagai komen EA
komen ini dalam bahasa mql = OrderComment()
Ciri penulisan data type ini adalah di dahului dengan kata  string   dan dilanjutkan dengan nama yang
diinginkan tidak besepasi  , setelah itu  Sama dengan (=) dan kemudiaan di beri tanda " diisi seseuai
keingingan ditutup dengan tanda " dan ; 
 Sehingga untuk parameter 1 bisa di tulis
extern string Nama_EA = "Buy Saja";

sehingga jadinya:

#property copyright "Copyright 2012, MetaQuotes Software Corp."


#property link      "http://www.metaquotes.net"

extern string Nama_EA = "Buy Saja";

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
Parameter 2

TP = 11
TP atau Take profit ini di tulis dalam bahasa mql = OrderTakeProfit() 
Untuk TP ini menggunakan type data int (integer) ciri data ini data berupa angka bilangan bulat (tidak berkoma

Ciri penulisan type data ini didahului dengan kata int dilanjutkan dengan nama yang diinginkan tidak
bersepasi  , setelah itu  Sama dengan (=) dan kemudiaan di beri anka tidak berkoma  dengan tanda  ;

sehingga di tulis:

extern int     TP                      = 11;

 Parameter 3
 SL. = 100
SL atau stop loss dalam bahasa mql ditulis  OrderStopLoss() 
Penulisan SL ini sama dengan TP, karena type data integer (int)  sehingga aturan penulisan sama
ditulis sbb: 
extern int     SL                      = 100;

Sehingga bila dimasukan ke metaeditor sbb:

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

extern string  Nama_EA                 = "Buy Saja";


extern int     TP                      = 11;
extern int     SL                      = 100;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
Parameter 4
Lots = 0.1
Lots dalam  bahasa MQL ditulis = OrderLots()
Tipe data lots ini yang digunakan type double yaitu tepe data yang bilangannya berkoma
ciri nya didahului dengan kata double dilanjutkan dengan nama (lots )yang diinginkan tidak bersepasi  , setelah
itu  Sama dengan (=) dan kemudiaan di beri anka boleh berkoma  atau tidak *tanda koma disini dengan tulisan
titik (.)  bukan (,) dan diakhiri  dengan tanda  ;
sehingga ditulis:
extern double  Lots                    = 0.1;
Nah jadi deh kita lihat hasilnya
/ / +------------------------------------------------------------------+
//| Buy Saja.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http:/ / www.metaquote s.net |
/ / +------------------------------------------------------------------+
# property copyright "Copyright 2012, MetaQuotes Software Corp."
# property link "http:/ / www.metaquotes.net"

extern string Nama_EA = "Buy Saja";


extern int TP = 11;
extern int SL = 100;
extern double Lots = 0.1;

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

begini: 
 

Nah kalau sudah jadi seperti ini maka  klik Compile dan kalau berhasil akan muncul tulisan
Compiling 'Buy Saja.mq4'...
 0 error(s), 0 warning(s)    

caranya lihat gambar berikut:


Nah jadi deh hasilnya kita bisa lihat di Mt4 coba kita cari di folder expert maka EA Buy Saja sudah terlihat
tinggal dobel klik maka akan muncul parameter EA seperti gambar berikut

Hasil ini setelah di Compile  dan pastikan tidak ada error


Bila masih ada error maka parameter ini gak akan muncul di mt4

Okey mudah kan?

Heeeeeeee pasti jawabanya Muuuuuudah!

Semoga bisa dimengerti

Kita lanjut di part 3


Pada post sebelumnya kita sudah bikin parameter EA sbb:

Dan kita sudah bahas 3 type data yaitu string, int dan double

Nah kali ini saya akan menambahkan satu parameter yang sering digunakan sebagai identitas order EA yaitu
nomer Magic (magicnumber). dalam bahasa mql4 => OrderMagicNumber()

Apa sih sebenarnya magicnumber?

Magicnumber  adalah sebagai Ktp order atau Id ,  loh koq  bisa KTP ya?
Karena magicnumber sering digunakan sebagai identititas order sebuah EA untuk membedakan order dengan
EA lain,  meki sebenarnya tidak hanya itu penggunaannya bisa digunakan lebih luas.
untuk mengetahui nomer magic pada sebuah order biasanya tunjuk pointer pada sebuah order maka disitu akan
muncul angka nomer order dan nomer magic
contoh
Pada image berikutnya Numermaginya adalah 16   (id 16)

Nah itu gambaran kegunaan magic number !


Nah dalam parameter EA yang akan kita buat kali ini kita akan tambahkan nomor magic
Nomor magic ini meupakan type data int (bilangan bulat tanpa koma)
sehingga bisa dituliskan
//+------------------------------------------------------------------+
//|                                                     Buy Saja.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern string  Nama_EA                 = "Buy Saja";


extern int     TP                      = 11;
extern int     SL                      = 100;
extern double  Lots                = 0.1;
extern int     Magic                 = 69;

Oke tinggal di Compile lagi  dan di cek tidak ada errornya maka kita lihat di mt4 kalau berhasil maka akan
terlihat seperti image berikut setelah ea Buy Saja kita attack 

Sip deh  parameter EA sudah jadi  !


Apa EA sudah bisa jalan ?
Kalau jalan sih bisa saja tapi belum bisa order heeeeeeee

Nah supaya bisa order sesuai rules yang kita tentukan maka kita akan program

Program kita  akan tempatkan di bawah int start()

int start()
  {
//----
Disini   
//----
   return(0);
  }
Untuk memulai program  sesuai rule yaitu bila tidak ada order maka akan melakukan order Buy
Program yang dibuat menggunakan operasi if  
Penulisannya dimulai dengn kata  if dan di mulai tanda kurung pembuka ( dan di akhiri dengan tutup
kurung)kemudian tanda Kurung kurawal pembuka { dan di akhiri tutup kurung kurawal penutup }

Ketentuannnya :
if( bila ada kondisi yang ditentukan ) {  perintah yang diinginkan diakhiri tanda titik koma ;  }
Kadang juga bisa di tulis tnpa kurung kurawal dalam kondisi khusus (perintah sederhana)
if( bila ada kondisi yang ditentukan )   perintah yang diinginkan diakhiri tanda titik koma ; 

Oke deh  mungkin gambarannya mudah dipahami


Sekarang kembali  rules EA buy saja yang akan kita buat

dimana bila tidak ada order maka EA akan melakukan order buy artinya hanya ada 1 order buy
if( tidak ada order ) melakukan order buy;

tidak ada order artinya order total =0, ketentuan penulisan sama  dengan (=) di dalam kondisi harus di tulis 2
kali ( == )
order total di dalam mt4 disediakan sebagai variabel yang di sediakan dan di tulis OrdersTotal() 
sehinga kita tulis sebagai kondisi

if(OrdersTotal()==0)   
atau bisa juga ditulis
if(OrdersTotal()<1)  
Order buy sebagai perintah yang diinginkan kita mengambil  di satu  
OrderSend(Symbol(),OP_BUY,start_lot,Ask,slipage,Ask-SL*Point,
Ask+TP*Point,"+Jum+oke+",Magic,0,Blue);

kita rubah sesuai parameter yang kita sediakan ,start_lot diganti dengan Lots, slipage kita ganti dengan
angka 3(nanti akan kita bahas di post berikutnya ) , "+Jum+oke+" kita ganti dengan  parameter Nama_EA dan
Magic  sudah sesuai
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point, Ask+TP*Point,Nama_EA,Magic,0,Blue);

Ini kita gabungkan


Jadinya kalau   di gabungkan dengan kondisi di di tempatkan di bawah int start()
if(OrdersTotal()==0)  OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,
Ask+TP*Point,Nama_EA,Magic,0,Blue);

atau  sama saja dengan

if(OrdersTotal()==0){  OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,
Ask+TP*Point,Nama_EA,Magic,0,Blue); }

atau  sama juga dengan 


if(OrdersTotal()<0){  OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,
Ask+TP*Point,Nama_EA,Magic,0,Blue); }

 Nah hasilnya setelah dimasukkan ke dalam int start() dan seluruhnya adalah

return(0);
}
/ / +------------------------------------------------------------------+
/ / | expert start function |
/ / +------------------------------------------------------------------+
int start()
{
/ / ----
if(OrdersTotal()==0){ OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point, A
/ / ----
return(0);
}
/ / +------------------------------------------------------------------+

Jangan lupa untuk klik  Compile  dan pastikan tidak ada error 


Setelah sukses tahap berikutnya adalah kita coba Beck test untuk mengetahui apakah EA sudah bisa order
Nah silah di coba
dan saya coba Beck tes hasilnya sbb:
Ternyata EA ini sudah bisa order dan siap digunakan demo haaaaaaaaaa
Nah silahkan kasih komen ya kalau sudah berhail atau masih belum jelas

Kalau ternyata ada yang error berarti madih ada yang salah teliti ulang caranya dobel klik pada bagian yang
ditunjuk

Kalau di perhatikan pada EA yang di buat pada part 3 ada beberapa kelemahan al:

1. Hanya bisa digunakan satu pair saja (1 pasang mata uang)


2. Hanya bisa melakukan order buy 
3. Tidak ada batasan waktu trading
4. Tidak menggunakan indikator untuk trigernya (pemicu ordernya)
Kali ini kita bahas dulu tentang filter pair supaya EA yg telah kita buat di part 3 bisa digunakan di semua pair.
di part 3 kita menggunakan:
if(OrdersTotal()==0) 
yang dimaksud OrdersTotal ini adalah jumlah semua order diadalam Mt4 dari semua pair , termasuk pending
order. Jadi kalau ada  1 pending buystop di EURUSD  dan ada 2 buy di GBPUSD jadi jumlahnya 3 order,
sehingga karena kita membuat kondisi OrdersTotal() ==0  maka total order dihitung semua order. 

Ada beberapa cara untuk membuat filter pair dan saya akan bahas 2 macem cara yang umum digunakan
menurut bahasa sederhana. 

1. Cara langsung 

 Cara ini biasa dibuat skrip diatas perintah order  untuk menggantikan OrdersTotal(). 
Skrip ini ada tinggal simpan di library  sebagai scrip standar yang mungkin suatu saat dipakai lagi

  int Jumlahbuy=0;
  int Jumlahsell=0;
  for(int i=0; i<OrdersTotal(); i++)
  {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
      if(OrderType()==OP_BUY)   Jumlahbuy++;
      if(OrderType()==OP_SELL)  Jumlahsell++;
  } Nah skrip diatas merupakan skrip yang sering dipakai
  int Jumlahbuy=0;
  int Jumlahsell=0;
Ini merupakan variabel penghutung order , penempatan nya di ditempatkan di deklarasi (dibawah parameter
yang ada extern) bisa juga di atas skrip seperti di atas. 

for(int i=0; i<OrdersTotal(); i++)


Maksudnya adalah menghitung order aktif yang dimulai dari awal sampai terakhir. Kebalikan skrip ini
biasannya menghitung mundur (bahasa sederhannya)
 for(int i=OrdersTotal()-1; i>=0; i--)

Coba bandingkan dulu!

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
ini scrip standar untuk memilih ordr aktif 
  
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue; 

Ini menggunakan atau (||) artinya memilih hanya pada symbul (pair) yang  dan numor magic di attack jadi yang
lain dari itu diabaikan
bisa juga kondisi ini menggunakan tanda dan (&&) bedanya bila menggunakan && tersebut  tanda != diganti
dengan == sehingga jadinya
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) continue;

Silahkan dibandingkan   2 kondisi tersebut  (jangan sampai terbalik karena kalau terbalik ini tidak berfungsi.
Untuk itu tinggal  akan menggunakan && atau ||  atau keduanya dipakai

Kemudian
  if(OrderType()==OP_BUY)   Jumlahbuy++;
artinya membatasi order buy saja yang dihintung  dinyatakan kedalam sebuah variabel  Jumlahbuy
  if(OrderType()==OP_SELL)  Jumlahsell++;  
 artinya membatasi order sell saja yang dihintung  dinyatakan kedalam sebuah variabel  Jumlahsell

Terus gimana cara menggunakan?

Tinggal mengganti saja  


if(OrdersTotal()==0)  diganti dengan if(Jumlahbuy==0)  bisa juga diganti
dengan if(Jumlahbuy<1)

Jadinya EAnya sbb:


Nah EA diatas sudah bisa dipakai di semua pair 
Mudahkan?

2. Menggunakan Fungsi

Jadi selain menggunakan cara langsung pada bagian 1 bisa juga digunakan fungsi.
Fungsi ini menentukan nilai yang biasanya ditempatkan diluar int start().
Karena jumlah order ini merupakan bilangan bulat tidak berkoma maka digunakan integer (int).

coba perhatikan!

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

Ini merupakan skrip untuk filter order menggunakan fungsi .


Cara menggunkan nya
 jumlahorder(OP_BUY) ini merupakan jumlah buy
jumlahorder(OP_SELL) ini merupakan jumlah sell
jumlahorder(OP_BUYSTOP) ini merupakan jumlah pending order Buystop
dst....

Type order bisa juga dinyatakan dalam bilangan


OP_BUY     =    0
OP_SELL    =   1
OP_BUYLIMIT     =  2
OP_SELLLIMIT    =  3
OP_BUYSTOP     =   4
OP_SELLSTOP    =  5

Sehingga
 jumlahorder(OP_BUY)    bisa ditulis juga jumlahorder(0) 
demikian juga untuk jumlahorder(OP_SELL) bisa ditulis jumlahorder(1)

Sehingga pada EA diatas bisa diganti 


if(Jumlahbuy==0) menjadi if(jumlahorder(OP_BUY)==0)  atau  if(jumlahorder(0)==0) 

Dan kalau dimasukan ke dalam EAnya


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

extern string Nama_EA = "Buy Saja";


extern int TP = 11;
extern int SL = 100;
extern double Lots = 0.1;
extern int Magic = 69;
/ / +------------------------------------------------------------------+
/ / | expert initialization function |

Nah silahkan di Compile hasil dari pembuatan terebut bila sukses berarti EA terebut sudah bisa digunakan, tapi
bila masih ada errornya maka silahkan dikoreksei ulang mulai dari awal dan bandingkan dengan hasil di atas
(copykan hasil di atas ke metaeditor ). 
OKe semuanya
Kalau pada EA yang sudah kita buat pada part 4 bahwa EA sudah bisa digunakan di semua pair dan telah
digunakan fliter pair.
Kali ini kita akan menambahkan supaya EA juga bisa melakukan order sell, mengingat pada EA sebelumnya
hanya melakukan order buy saja.

Untuk menambahkan Supaya bisa order sell maka yang diperlukan adalah skrip perintah order sell, sbb:

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+SL*Point, Bid-TP*Point,Nama_EA,Magic,0,Red);

Coba bandingkan dengan perintah order buy!


Ada perbedaan yang perlu diketahui bahwa order buy mengacu pada harga berjalan Ask sedangkan order sell
menggunakan  Bid.
Selisih antara Ask dan bid inilah yang sering di sebut dengan spreed

Pada order buy


Ask-SL*Point, 
Ask+TP*Point,

Pada order sell


Bid+SL*Point, 
Bid-TP*Point 

Dan untuk membedakan warna order disini saya gunakan blue untuk buy dan red untuk sell.

Nah sekarang bagaimana untuk memasukkan perintah  order sell?

Pada EA 1 di part 4 bahwa menggunakan filter pair langung, untuk itu sudah disediakan variabel penghitung
order sell yaitu Jumlahsell  ,sehingga bisa dibuat kondisi : if(Jumlahsell==0) atau if(Jumlahsell<1)
Jadinya sbb:

if(Jumlahsell==0){OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+SL*Point, Bid-
TP*Point,Nama_EA,Magic,0,Red);}

Pada EA 2 yang menggunakan filter pair dengan menggunakan fungsi adalah


,code>  if(jumlahorder(1)==0) bisa juga   if(jumlahorder(OP_SELL)==0) atau   if(jumlahorder(1)<1), bisa
juga   if(jumlahorder(1)<1)

Jadinya sbb: 

if(jumlahorder(OP_SELL)==0){OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+SL*Point, Bid-
TP*Point,Nama_EA,Magic,0,Red);}
  
 bisa juga digunakan

if(jumlahorder(1)<1){OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+SL*Point, Bid-
TP*Point,Nama_EA,Magic,0,Red);}
 Kemudian kita masukan kedalam EAnya
EA 1 sbb:

for(int i=0; i<OrdersTotal(); i++)


{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()!=Symbol() || OrderMagicNumbe r()!=Magic) continue;
if(OrderType()==OP_BUY) Jumlahbuy++;
if(OrderType()==OP_SELL) Jumlahse ll++;
}
if(Jumlahbuy==0){ OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point, Ask
if(Jumlahsell==0){OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+SL*Point, Bid-TP

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

Jadi deh silahkan di Compile dulu kalau sukses berari EA sudah bisa Order sell , artnya bila tidak order buy
maka akanmmelakukan order buy dan bila tidak ada order sell maka akan melakukan order sell sehingga EA
ini akan melakukan hedge (order buy dan sell secara bersamaan)

Mudah kan?

Untuk EA 2 menggunakan filter fungsi sebagai berikut

int jumlahorder( int tipe)


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

return(total);
}

  
Oke silahkan di coba di Compile dulu dan kemudian di Beck test  , dan bila mana berhasil maka EA akan
kelihatan melakukan buy dan sell

Kemudaian hal lain yang perlu di ketahui bahwa dalam bahasa program mql4 untuk membuat
keterangan yang dimana keterangan tersebut tidak di baca sebaga program biasa nya digunakan tanda 
// untuk satu baris tetapi bila terdiri dari banya baris digunakan tanda  /* keterangan  dan diakhiri */ 
Sebelum membahas tentang filter waktu kita akan tambahkan tentang  type data.  Sebelum nya kita sudah
bahas tentang string, int dan doubel . Ada satu lagi yang sering digunakan untuk sebagai pilihan yaitu bool.
Bool ini mengahilkan nilai 1 bila true dan 0 bila false.
Jadi data tipe ini dalam sebiah deklarasi di dahului dengan  kata bool dan ditambahkan kata tanpa sepasi
kemudian = (sama dengan) dan di beri pilihan false atau true dan diakhiri dengan ; (titik koma)
contoh:
Kita mau menambahkan pilihan untuk EA sebelumnya supaya ada pilihan untuk buy saja atau sell saja

Kita buat deklarasi dulu 


extern bool Trade_buy= true;
extern bool Trade_sell= true;

terus dimana harus ditambahkan ?


Untuk menambahkan ini maka yang perlu dicari adalah bagian triger atau pemicu ordernya, yaitu
  if(jumlahorder(0)==0)  jadinnya if(jumlahorder(0)==0 && Trade_buy== true )
  if(jumlahorder(1)==0)  jadinya  if(jumlahorder(1)==0 && Trade_sell==true )

Penulisan Trade_buy== true bisa juga ditulis Trade_buy== 1  atau hanya  Trade_buy


Sedangkan Trade_buy==false bisa juga ditulis Trade_buy== 0  atau   !Trade_buy

Kita coba masukakan kedalam EAnya 


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

return(total);
}

Nah Ea di atas pada EA 2 yang menggunakan sedang kan untuk EA 1 silahkan ditambah akan sendiri
Setelah kita Compile sukses maka kalau kita attack EAnya akan tampak sbb:

telah kita bikin EA yang bisa buy dan sell dengan tambahan paremeter pilihan untuk terus trading buy atau sell
dengan menggunakan boolian sehingga bisa digunakan pilihan true ata false.
Kali kita akan bahas tentang menambahkan waktu trading

Waktu trading kali ini kita  bahas menggunakan waktu trading broker (time broker) dengan menggunkan
variabelHour() untuk Jam dan Minute() untuk waktu menit

Cukup  sederhana contoh


if(Hour()== 7 && Minute()==5) 
Artinya Ketika  (jam 7 lewat 5 menit  ) kondisi apa yang diinginkan .......

kita coba terapkan dalam perintah EA  kita

if(Hour()== 7 && Minute()==5){


   if(jumlahorder(0)==0 && Trade_buy)
{OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,
Ask+TP*Point,Nama_EA,Magic,0,Blue);}
   if(jumlahorder(1)==0 && Trade_sell)
{OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+SL*Point, Bid-
TP*Point,Nama_EA,Magic,0,Red);}
}

Pada penambahan di atas maka EA hanya akan Order buy dan sell ketika jam broker telah menunjukan jam 7
lewat 5 menit .

Nah bagamana supaya parameter waktu yang diinginkan bisa mudah di tampilkan dalam EA ?

Maka kita bisa membuat deklarasi waktu jam dan menit (waktu ini merupakan tipe data integer / tidak
berkoma)
contoh

extern int  Jam_Order  =7;


extern int  Menite        = 5;
 sehingga kalau dimasukkan ke dalam EA  sbb:

if(Hour()== Jam_Order && Minute()==Menite){


  if(jumlahorder(0)==0 && Trade_buy)
{OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,
Ask+TP*Point,Nama_EA,Magic,0,Blue);}
  if(jumlahorder(1)==0 && Trade_sell)
{OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+SL*Point, Bid-
TP*Point,Nama_EA,Magic,0,Red);}
 }

Mudahkan?
Ooooooo   ternyata mudah tinggal silahkan di coba di copas ke dalam EAnya .................
Jadideh!

Terus bagamana seandainya kita mau menambahkan waktu trading  dari jam tertentu sampai jam tertentu?

Nah untuk membuat batasan waktu ini saya akan bagikan sebuah skrip jadi yang biasa digunakan dalam
bentuk fungsi
Sebelumnya kita buat deklarasi waktu mulai dan mengakhiri  trading

extern    int                Mulai_Jam    =  22;


exter       int              Akhir_Jam    =   4;
kemudian fungsi waktunya sbb:

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

Karena skrip tersebut dalam bentuk fungsi maka penempatannya diluar int start()
Sekilas dari skrip tersebut menggunakan  bool dalam terapan waktu trading dan harus bernilai 1 .
Silahkan di simak dan di telaah fungsi terebut diatas!

untuk terapan penggunaanya dalam EA   if(Jam_trade()==1){.....}

 Kalau kita masukkan ke dalam EA 2 sbb:

int jumlahorder( int tipe)


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

return(total);
}
Oke bro EA sudah jadi silahkan di Compile dan EA siap digunakan untuk trade. Parameter sudah
lengkap tapi mengenai profit dan tidaknya yang silahkan di coba sendiri 

talah banyak kita bahas parameter EA sederhana dimana EA yang sudah jadi telah bisa melakukan order buy
dan sell (hedge) secara terus menerus ketika type order 0 dan dengan penambahan filter jam trading.

Kelemahan pada EA yang telah kita buat sebelum adalah belum suport untuk broker 5 digits .
Untuk itu kali saya akan tambahkan filter broker 5 digits
 Perbedaan antara broker 4 digits dan 5 digits terletak pada Points

Ada banyak cara untuk membuat EA agar dapat digunakan di broker 5 digits tapi saya akan beri 2 cara
sederhana, al:
1. membuat skrip langsung

kita buat deklarasi dulu , mengingat nilai point merupakan bilangan berkoma maka termasuk type data double,
double pt=0; // ini di letakkan di dklarasi.

 kita buat skrip sbb:


   if(Digits==3 || Digits==5) pt=10*Point;   else   pt=Point; 

Maksudnya adalah bila digits=3  atau  digits=5  maka pt = 10 x point  else (artinya bila tidak) maka pt =point
disisipkan di bawah int init()

jadinya

int init()
  {
//----
if(Digits==3 || Digits==5) pt=10*Point;   else   pt=Point;  
//----
   return(0);
  }
Apa maksudnya di tempat kan disini ?

int init() ini menyimpan data saat EA di attack , sebenarkan tidak mesti harus ditempatkan di dalam init() bisa
juga ditempatkan di dalam int start().

Terus apa bedanya bila di tempatkan di init() dan di start()?

Bila di tempatkan di dalam init() maka nilai pt (pont) akan di baca baik di dalam int start() maupun diluar
tetapi kalau di tempat kan di int start() maka diluar int start() tidak terbaca.

terus gimana cara merubahnya?

kita lihat bagian EA sebelumnya yang terkait dengan point

if(Jam_trade()==1){
  if(jumlahorder(0)==0 && Trade_buy)
{OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,
Ask+TP*Point,Nama_EA,Magic,0,Blue);}
  if(jumlahorder(1)==0 && Trade_sell)
{OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+SL*Point, Bid-
TP*Point,Nama_EA,Magic,0,Red);}
 }

Ini yang ada point nya kita ganti dengan pt, jadinya <\:

if(Jam_trade()==1){
  if(jumlahorder(0)==0 && Trade_buy)
{OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*pt,
Ask+TP*pt,Nama_EA,Magic,0,Blue);}
  if(jumlahorder(1)==0 && Trade_sell)
{OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+SL*pt, Bid-
TP*pt,Nama_EA,Magic,0,Red);}
 }

Sehingga bila kita masukkan kedalam EA sbb

int jumlahorder( int tipe)


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

return(total);
}

2. Dengan menggunakan fungsi

Mengingat point adalah type data bilangan berkoma maka kita mulai dengan double

double dpt()

 if(Digits==3 || Digits==5) pt=10*Point;   else   pt=Point;


 return(pt);

karena ini fungsi maka di tempatkan di luar int start(), dan untuk penerapannya tinggal poin diganti dangan
dpt()

Sehinnga jadinya EAnya sbb


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

return(total);
}

Saya yakin tidak sulit ini tinggal di Compile saja jadi deh

Mudahkan

Kali ini kita akan membahas tentang flter lots.


Kegunaannya ini untuk mencegah terjadinya error yang di sebabkan oleh parameter lots yang tidak sesuai

Di pembahasan sebelumnya kita sudah banyak membahas juga tentang penggunaan scrip secara langsung dan
juga bisa menggunakn fungsi. Jada pada dasar setiap trader dalam menuangkan kode program itu punya gaya
sendiri , dan tidak mesti sama setiap orang .

Nah untuk menambahkan   filter lots ini saya akan berbagi script dalam bentuk fungsi yang selama ini saya
gunakan, sbb:

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

Penggunaannya bagaimana?

Pada EA yang telah kita buat di part sebelumnya kita ambil bagian yang ada hubungannya dengan pengaturaun
lots yaitu  Lots dan kita tambahkan menjadi  NR(Lots)

Sehingga sebelumnya 

if(Jam_trade()==1){
  if(jumlahorder(0)==0 && Trade_buy)
{OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,
Ask+TP*Point,Nama_EA,Magic,0,Blue);}
  if(jumlahorder(1)==0 && Trade_sell)
{OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+SL*Point, Bid-
TP*Point,Nama_EA,Magic,0,Red);}
 }

Menjadi:

if(Jam_trade()==1){
  if(jumlahorder(0)==0 && Trade_buy)
{OrderSend(Symbol(),OP_BUY,NR(Lots),Ask,3,Ask-SL*Point,
Ask+TP*Point,Nama_EA,Magic,0,Blue);}
  if(jumlahorder(1)==0 && Trade_sell)
{OrderSend(Symbol(),OP_SELL,NR(Lots),Bid,3,Bid+SL*Point, Bid-
TP*Point,Nama_EA,Magic,0,Red);}
 }

Dari penamahan script diatas maka bila terjadi kekeliruan pengisian parameter lots maka EA tetap akan
melakukan eksekuri order dan tidak error.
Bila pengisian lotsnya salah dan terlalu kecil maka EA tetap melakukan order dengan menggunakan lots
terkecil yang di ijin ka oleh broker, dan juga bila di gunakan pada penggunaan lots yang salah tetap akan order
sesuai kektentuan broker , dengan tambahan filter ini maka akan terhindar dari error yang disebabkan oleh
kesaalan penggunaan lots

Kita masukkan ke dalam EA sebelumnya jadinya

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

Setelah kita belajar di part sebelumnya bahwa EA sudah bisa order buy dan sell dengan jam yang bisa
disesuaikan serta order hanya terbatas masing2 1 order pertype.
Jadi dasar Order EA sebelumnya (triger) adalah jumlah order buy=0 atau jumlah sell = 0.

Nah dasar order EA inilah yang perlu dikembangkan berdasarkan keinginan.

Untuk menambah wawaan tetntang triger ini saya akan membasar tentang Indikator
Indikator yang paling sederhan di dalam Mt4 adalah Candelistik

Coba perhatikan image berikut:

1. Harga tertinggi disebut dengan High

Untuk mengetahui harga high ini dengan cara custum sbb


         iHigh(string Symbul ,int time frime , int shit)
string symbul untuk pair yang di attack digunakan Symbul()
untuk pair langsung bisa ditulikan contoh "GBPUSD"  atau "EURUSD"

int timefreme bisa ditentukan , coba perhatikan

nah tinggal dipilih aja yang mau digunakan, tapi kalau mau membaca candel pada EA di attack maka bisa diisi
dngan angka 0

int shif ini untuk menentukan kondisi candel ,


contoh :
bila 0 artinya candel saat berlangsung,
 bila 1 artinya 1 candel sebelum sekarang 
2 artinya 2 candel sebelum sekarang

Karena harga High ini merupakan bilangan berkoma maka termasuk tipe data double, sehingga untuk
menentukan membuat variabel high ini sbb
contoh

doubel tinggi =  iHigh(Symbol(),PERIOD_H1, 1);

artinya  Harga tertinggi  pada 1  candel  sebelum sekarang (sebelumnya) dan pata time frime H1 dan saya
namakan dengan nama variabel tinggi
Time frime ini juga bisa ditulis dalam nilai (value) dalam menit ,contoh kalau  PERIOD_H1  bisa diganti
dengan 60 ,  PERIOD_H4 bisa diganti dengan 240 , PERIOD_D1  bisa diganti dengan 1440 dsb.
Tetapi bila di tulis 0 bukan berarti 0 menit tetapi timefrimenya mengikuti chart dimana EA di attack.

contoh:
doubel tinggi =  iHigh(Symbol(),0, 1);
Maka nilai tinggi candel dimana EA akan di attack , bila di attack di time frime(TF) 30 maka akan memabaca
titik tinggi 1 candel  sebelumnyam demikian juga kalau di attack di TF H4 juga candel di H4 yang akan di
bacanya.

Ada tambahan
doubel tinggi =  iHigh(Symbol(),0, 1);
kadang juga ditulis   
doubel tinggi =  High[1];

Jadi kalau  High[2]  artinya titik tertinggi pada 2 candel sebelumnya pada TF dimana EA di attack 

2, Harga pembukaan disebut Open

Sama halnya dengan High, dalam penulisan ketentuannya sama

doubel buka =  iOpen(Symbol(),PERIOD_H1, 1); 


Penjelasanya sama dengan High

3. Harga Penutupan disebut Close

doubel tutup =  iClose(Symbol(),PERIOD_H1, 1);  


 Penjelasanya sama dengan High

4. Harga terbawah disebut dengan Low

 doubel bawah =  iLow(Symbol(),PERIOD_H1, 1);  

Penjelasanya sama dengan High 

Daei penjelasan di atas mungkin sedikit bisa di pahami


Contoh dalam terapan sebuah EA yang biasanya digunakan sebagai triger

if(Close[2] <  Close[1]) { -----order buy ----- }


atau
if(iClose(Symbol(),0, 2) <  iClose(Symbol(),0, 1)) { -----order buy -----}

artinya bila harga penutupan candel 2 sebelumnya lebih kecil dengan penutupan candel 1sebelumnya maka
order buy
Bisa juga dibuat variabel
double tutup_1  = iClose(Symbol(),0, 1);
double tutup_2  = iClose(Symbol(),0, 2);

if( tutup_2< tutup_1){-----order buy -----}


 Nah dari gambaran diatas ini maka bisa silahkan dicoba di masukan ke dalam EA yang sudah dibuat di part
sebelumnya
Oke silahkan dicoba dulu deh

Setelah kita belajar di part sebelumnya bahwa kita sudah mengulas sedikit tentang Indikator
yang paling populer yaitu candelistik, sekarang  kita akan bahas tentang Custom Indikator2
standart Mt4.

Dalam pembuatan Ea secara umum banyak menggunakan indikator sebagai petimbangan dalam
membuat trigernya (pemicu ordernya), ada banyak indikator yang teredia di Mt4 , contohnya
MA (Moving Averge), MACD, Stochatik, RSI dll.

Bagamana cara membuat custom indikatornya?

Nah untuk membuat custom nya biaanya dibuat variabel duhulu (meskipun ini tidak wajib).
Karena variabel datanya biaaya berkoma maka menggunkan double.

Secara umum indikator mt4 custom indikatornya biasanya nama indikator di tambahkan huruf i
didepan nama indikatornya,
Contohnya adalah MA (Moving Average)

kita buat variabel MA, double MA (saya membuat nama MA).


MA ini custom indinya iMA 
Coba perhatikan gambar beikut:
Ketika kita menuliskan iMa(  maka Mt4 secara otomatis memberikan arahan tentang indikator
ini, ada beberapa parameter yang harus dibuat sesuai urutannya.
sepeti gambar diatas maka iMa(string symbul, int timeframe, int ma_pereod, int ma_shift, int
ma_methot, int applied_price, int shit);

kita lihat parameter Ma berikut:

string symbul (penjelaannya sama sepeti candelitsik) bisa ditulis  Symbul(), bisa juga NUL.
int timeframe (penjelaannya sama sepeti candelitsik).
int ma_pereod ini merupakan data integer (tidak berkoma) sering disebut pereodenya,
besarannya bisa ditulis langsung atau dibuat deklasi supaya bisa dirubah angkanya dengan
mudah , contoh:
extern int Pereode_Ma.

int ma_shift  , int ma_methot , int applied_price  (bisa di isi langsung atau di buat deklarasi,)
int shit ini merupakan kedudukan Ma seperti halnya candelitik kalau diisi 0 artinya pada
kedudukan yaitu nilai Ma pada candel sedang berjalan, bila diisi 1 artinya nilai Ma pada saat 1
candel sebelum sekarang dst , (bisa di isi langsung atau di buat deklarasi,)

Contoh custom indi Ma sbb:


double MA =iMA(NULL,0,Pereode_Ma,0,MODE_SMA,PRICE_CLOSE ,1);
atau 
double MA =iMA(Symbol(),0,Pereode_Ma,0,MODE_SMA,PRICE_CLOSE ,1); 

nah contoh diatas untuk pereodenya di buat deklarasi dulu 


extern int Pereode_Ma.=20;
 Terus gimana terapanya dalam triger ?
Banyak sekali cara membuat triger menggunakan indikator Ma ini , contohnya

1. bila harga diatas Ma maka buy dan sebaliknya bila dibawah Ma maka sell
    if(Ask > MA) {  order buy }
    if(Bid < MA) { order sell }

2.Bila pembukaan 1 candel sebelum sekarang   dibawah Ma dan penutupan di atas Ma maka buy
    if(Open[1] > MA  && Close[1]> MA) {  order buy }

Oke sementara sampai disini dulu , kita lanjutan nanti ya

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
}
if(OrderType()==OP_SELL) {
if((OrderOpenPrice()-Ask)>(pt*TrailingStop)){
if(OrderStopLoss()>(Ask+pt*TrailingStop) || (OrderStopLoss()==0)){
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+pt*TrailingStop,OrderT
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

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 :

}
}
double money()
{
double dp = 0;
int i;
for (i = 0; i < OrdersTotal(); i++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumbe r()!=Magic) continue;
dp += OrderProfit();
}
return(dp);
}

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

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:

}
}
double money()
{
double dp = 0;
int i;
for (i = 0; i < OrdersTotal(); i++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumbe r()!=Magic) continue;
dp += OrderProfit();
}
return(dp);
}

Oke deh semboga menambah wawasan

salam sukses

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 :

}
}
double money()
{
double dp = 0;
int i;
for (i = 0; i < OrdersTotal(); i++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumbe r()!=Magic) continue;
dp += OrderProfit();
}
return(dp);
}

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

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

/ / +------------------------------------------------------------------+
int start()
{
/ / ----
double da = iCustom(Symbol(), 0,"Donchian Bands",IPeriod, 0,0 ) ;/ / garis ata s
double db = iCustom(Symbol(), 0,"Donchian Bands",IPeriod, 1,0 ) ;/ / garis bawa
double dt = iCustom(Symbol(), 0,"Donchian Bands",IPeriod, 2,0 ) ;/ / garis tenga

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 !

Nah setelah kita pelajari cara membuat custom  indikator Donchian pada part sebelumnya , maka kita akan
coba bikin EAnya dengan indikator tersebut
Yandg belum punya indikator silahkan  download dulu di part 15

Rulenya sbb:
mode trend
Buy : Pada saat harga di atas garis merah atas
Sell : Pada saat harga di bawah garis merah bawah

mode reversal
dan rule di atas di balik

Sehingga di tambahkan
if(Mode_trend){
if(da<Ask) signal=1;// aturan buy
if(db>Bid) signal=2;//aturan sell
}

if(!Mode_trend){
if(da<Ask) signal=2;// aturan sell
if(db>Bid) signal=1;//aturan buy
}
Ini untuk mengatur sesuai selera signal mana yang mau digunakan

Untuk EA yang dibikin mengacu pada EA yang telah dibikin sebelumnya

}
}
double money()
{
double dp = 0;
int i;
for (i = 0; i < OrdersTotal(); i++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumbe r()!=Magic) continue;
dp += OrderProfit();
}
return(dp);
}

Jadi deh
Mudah2 an dengan gambaran EA di atas akan membuka wawasan bagi trader semuanya

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


"\ 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  ........

Berbicara EA martingel tentu gak ada habisnya !


Banyak trader yang anti dengan EA martingel tapi juga banyak trader penggemar martingel
Haaaaa
Biasanya banyak trader yang  kebetulan habis MC gara2 EA martingel pasti akan memberi sumpah serapah"
Dasar EA martingel heeeee kapok deh menggunakan EA martingel....."

Sebagai pengguna EA martingel tentu saja bagi saya EA martingel merupakan  EA yg profitabel terlepas dari
kekurangan dan kelemahannya , yang penting bisa memahami dan memperhitungankan risikonya  tentu tidak
menjadi masalah.

Oke pada part 19 ini saya akan bahas tentang EA martingel sederhana dengan menggunakan 2 buah indikator
yaitu  zigzag dan candel mingguan

Rulesnya :
Buy :
 Zigzag muncul dibawah (lower) 
 Harga di atas harga open candel minggu yang sedang berjalan
 op tidak dalam candel yang sama seperti pada part 18
Untuk sel kebalikannya!

Tambahan lain pada EA kali ini adalah menggunakan target Equety ( jika target equety terpenuhi maka EA
berhenti trading) EA yang akan kita gunakan masih sama seperti pada part 18...

Oke yang perlu dibahas dulu adalah indikator zigzag 


Nah pada indikator zigzag yang perlu dipahami adalah bahwa indikator ini berubah mengikuti harga tertinggi
(Uper) dan terendah (lower).
Kita buat customnya:

    double up=iCustom(Symbol(),0,"ZigZag",  ExtDepth , ExtDeviation,


ExtBackstep, MODE_UPPER,0 );
    double lo=iCustom(Symbol(),0,"ZigZag", ExtDepth , ExtDeviation,
ExtBackstep, MODE_LOWER, 0);

Jadi modenya MODE_UPPER ketika harga posisi diatas dan MODE_LOWER ketika posisi dibawah.
Kemudian mengingat kita akan mengacu pada posisi zigzag dan berapapun jarak candel maka pada shift nya
kita buat fleksibel saya tambahkan operasi for sebagai berikut

    for(int d=0; d<Bars  ; d++){


    double up=iCustom(Symbol(),0,"ZigZag",   ExtDepth , ExtDeviation,
ExtBackstep, MODE_UPPER, d);
    double lo=iCustom(Symbol(),0,"ZigZag",   ExtDepth , ExtDeviation,
ExtBackstep, MODE_LOWER,d);
    if(up!=0 || lo!=0) break;}
     if(up>0 )  aturan buy 

     if(lo>0)   aturan sell

Bars ini adalah angka yang jumlah tick candel untuk menunjukkan shift nya dalam menghitung candel  , bisa
juga diganti dengan angka 1000 atau lebih ,ini untuk menentukan dimasa candel kebelakang  keberadaan posisi
zigzag.

Sedangkan untuk membuat menentukan Open candel mingguan kita gunakan:


double  OP=iOpen(Symbol(),PERIOD_W1,0);
if(Ask>OP) aturan buy 
if(Bid<OP)  aturan sell

Nah dari uraian diatas kita gunakan aturan buy sbb

int sigz, sigc;


     if(up>0 )  sigz= 1;
     if(lo>0)    sigz= 5;

    if(Ask>OP)sigc=1;
    if(Bid<OP) sigc=5;

if(sigz+sigc==2) op buy
if(sigz+sigc==10) op sell

Penggunaan angka 1 dan 5 ini sebarang aja intinya untuk memudahkan identifikasi saja , jadi suka-suka saja!

Tambahan lain adalah target Equety  (jika target equety terpenuhi maka EA berhenti trading).

extern double Target_Equety= 1000; 


supaya bisa data balance ketika EA di attack ke chart tersimpan maka kita buat dulu data balance yang
ditempatkan di bawah int init()

int init()
  {
bal= AccountBalance();
   return(0);
  } 

dan untuk menghentikan ketika target terpenuhi maka harus dibuat coding target dibawah int start() , sbb:

   if(Target_Equety<AccountEquity()) {
    closeall(0);
    closeall(1);
   Alert("Cek Target_Equetynya ");
   return(0);
   }

Setelah di coba penampakannya sbb:


Nah silahkan  di rakit sendiri dulu ya !

Okey pada part ini saya akan coba bahas tentang EA yang terkait dengan Pending order.
Ada 6 macam type  yaitu

1. Type  0 yaitu = Buy


2. Type  1 yaitu = Sell
3. Type  2 yaitu = Buylimit
4. Type  3 yaitu = Selllimit
5. Type  4 yaitu = Buystop
6. Type  5 yaitu = Sellstop
Dari 6 macam type order tersebut type pending order ada 4 macam. (pastikan juga sudah membaca pada
bagian part awal yang juga membahas type order).
Untuk itulah kita akan bahas type  pending order

1. Buylimit
       Buy limit merupakan order pesanan dibawah harga yang sedangan berjalan , sehingga pada strkur order
yang perlu durubah adalah type order dan harga yang dipesan.
Perhatikan pada order buy berikut:

        OrderSend(Symbol(), 0, start_lot, Ask, 3, Ask-SL*Point,Ask+TP*Point,


"", Magic, 0, Blue);

Ada bagian yang  bergaris bawah merupakan bagian yang harus dirubah dalam menggunakan order Pending
tersebut.
Dan bagian yang juga harus diperhatikan adalah Jarak antara harga berjalan dengan harga yang dipesan untuk
pending ordernya (OrdersOpenprice)==>    Ask- Jarak*Point
Sehingga jadinya sbb:
  OrderSend(Symbol(), 2, start_lot, Ask- Jarak*Point, 3, Ask- Jarak*Point-
SL*Point,Ask-Jarak*Point+TP*Point, "", Magic, 0, Blue);
Bisa juga di tulis:

OrderSend(Symbol(), OP_BUYLIMIT, start_lot, Ask- Jarak*Point, 3, Ask-


Jarak*Point-SL*Point,Ask-Jarak*Point+TP*Point, "", Magic, 0, Blue);

2. Selllimit

Selllimit merupakan order pesanan di atas harga yang sedang bergerak.


Seperti halnya pada order buylimiit bagian yg penting adalah type order dan jarak,
Nah silahkan di banding kan

  OrderSend(Symbol(), 3, start_lot, Bid+Jarak*Point, 3, Bid +Jarak*Point+


SL*Point,Bid+Jarak*Point-TP*Point, "", Magic, 0, Red);

Bisa juga di tulis:

OrderSend(Symbol(), OP_SELLLIMIT, start_lot, Bid+Jarak*Point, 3, Bid+


Jarak*Point + SL*Point,Bid+Jarak*Point-TP*Point, "", Magic, 0, Red);

3. Buystop

Buystop merupakan order pesanan di atas harga yang sedang bergerak.


Silahkan di amati dan dibandingkan dengan type sebelumnya

 OrderSend(Symbol(), 4, start_lot, Ask+ Jarak*Point, 3, Ask+ Jarak*Point-


SL*Point,Ask+Jarak*Point+TP*Point, "", Magic, 0, Blue);

Bisa juga di tulis:


OrderSend(Symbol(), OP_BUYSTOP, start_lot, Ask+ Jarak*Point, 3, Ask+
Jarak*Point-SL*Point,Ask+Jarak*Point+TP*Point, "", Magic, 0, Blue);

4. Sellstop
Sellstop adalah merupakan order pesanan dibawah harga yang sedangan berjalan.
Silahkan di amati dan dibandingkan dengan type sebelumnya

  OrderSend(Symbol(), 5, start_lot, Bid-Jarak*Point, 3, Bid -


Jarak*Point+SL*Point,Bid-Jarak*Point-TP*Point, "", Magic, 0, Red);

Bisa juga di tulis:

OrderSend(Symbol(), OP_SELLSTOP, start_lot, Bid-Jarak*Point, 3, Bid-


Jarak*Point+SL*Point,Bid-Jarak*Point-TP*Point, "", Magic, 0, Red);

Nah Kita akan coba membuat EA sederhana dengan menggunakan ke 4 pending tersebut!


Namun sebelum kita buat kita harus membuat filter jumlah order sesuai typenya , Nah untuk memudahkan
saya sediakan sbuah script yang merupakan fungsi untuk menghitung type order

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

Cara memanggilnya
Contoh:
Untuk Buylimit

if(jumlahorder(OP_BUYLIMIT) ==0 )OrderSend(Symbol(), 2, start_lot, Ask-


Jarak*Point, 3, Ask- Jarak*Point-SL*Point,Ask-Jarak*Point+TP*Point, "", Magic,
0, Blue);

 atau

if(jumlahorder(2)==0) OrderSend(Symbol(), OP_BUYLIMIT, start_lot, Ask-
Jarak*Point, 3, Ask- Jarak*Point-SL*Point,Ask-Jarak*Point+TP*Point, "", Magic,
0, Blue);
Untuk Selllimit
if(jumlahorder(OP_SELLLIMIT) ==0 )OrderSend(Symbol(), 3,
start_lot, Bid+Jarak*Point, 3, Bid +Jarak*Point+SL*Point,Bid+Jarak*Point-
TP*Point, "", Magic, 0, Red);

atau

if(jumlahorder(3)==0)OrderSend(Symbol(), OP_SELLLIMIT,
start_lot, Bid+Jarak*Point, 3, Bid +Jarak*Point+SL*Point,Bid+Jarak*Point-
TP*Point, "", Magic, 0, Red);

Nah silahkan di lanjut deh

Tapi saya udah coba buatkan EA sederhananya  untuk lebih memahami


silahkan di amati

"\ n ------------------------------------------------",
"\ n :: =>+Jum+Pending<=",
"\ 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 ------------------------------------------------");
}

 
Adapun rulenya adalah pada jam tertentu langsung pasang 2 buah order buystop dan sellstop dan ketika salah
satu order pening stop tersebut tersentuh maka order pending stop yang tersisa langsung didelet.
Kemudian bila pada hari itu tidak tersentuh maka akan didelet. dan tambahan lain pada hari senin tidak trading
karena EA ini cocok untuk trend pada hari itu , kalau hari senin diperkirakan biasanya sideway.

Jadi order setiap hari hanya akan melakukan order satu kali saja.

Coba perhatikan gambar di atas pada tanda panah , jadi pada jam server kira 2 jam 0 : 30 maka order stop akan
di pasang .

Nah Kita coba buat deklarasinya sbb:

extern string  Nama_EA                 = "Jum+Profit";


extern bool    Trade_buystop           = true;
extern bool    Trade_sellstop          = true;
extern string  Jam_server              = "Set sesuai selera";
extern int     Jam                     = 0;
extern int     Menit                   = 30;
extern bool    Tp_in_Money             = false;
extern double  TP_in_money             = 5;
extern int     TP                      = 100;
extern int     SL                      = 20;
extern double  Lots                    = 0.1;
extern int     Jarak_stop              = 25;
extern bool    TrailingStop_           = true;
extern int     TrailingStop            = 12;
extern int     Magic                   = 69;
double slb,tpb,sls,tps,pt,lslb,ltpb;

Beberapa bagian yang saya coba siapkan adalah script  delet order type, disini dibuat dalam bentuk fungsi sbb :
void closeall(int m)
{
 for (int i = OrdersTotal() - 1; i >= 0; i--) {
  OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
  if (OrderSymbol() != Symbol() || OrderMagicNumber()!=Magic||  OrderType()!
=m) continue;
   if (OrderType() > 1) OrderDelete(OrderTicket());
  if (OrderType() == 0) OrderClose(OrderTicket(), OrderLots(), Bid, 3,
CLR_NONE);
  if (OrderType() == 1)OrderClose(OrderTicket(), OrderLots(), Ask, 3,
CLR_NONE);
 }
}

Untuk menentukan order pada  jam tertentu sy buat bagian sbb:

Hour()==Jam && Minute()==Menit


Untuk bagian delet ketika salah satu order stop tersenttuh adalah:

if(jumlahorder(0)==1 && jumlahorder(1)==0){ 


   closeall(5);
   }
if(jumlahorder(0)==0 && jumlahorder(1)==1){ 
   closeall(4);
   }

sedang bagian untuk mendelet orderstop yang tidak tersentuh maka pada jam tersentu di delet
contoh jam 23

if(Hour()==23){
   closeall(4);
   closeall(5);
   }

Untuk asesoris order Pending stop :

   double as = Ask + Jarak_stop*pt;


   double bi = Bid - Jarak_stop*pt;
   if(SL==0)slb=0;else slb=as-SL*pt;
   if(SL==0)sls=0;else sls=bi+SL*pt;
   if(TP==0)tpb=0;else tpb=as+TP*pt;
   if(TP==0)tps=0;else tps=bi-TP*pt;

Bagian lain untuk membuat EA libut trading hari senin adalah


DayOfWeek()!=1

Nah EA jadinya  sbb

"\ n ------------------------------------------------",
"\ n :: Spread : ", MarketInfo(Symbol(), MODE_SPREAD),
"\ n :: Leverage : 1 : ", AccountLeverage(),
"\ n :: Equity : ", AccountEquity(),
"\ n :: Jam Server :", Hour(), ":", Minute(),
"\ n ------------------------------------------------",
"\ n :: Floting buy : ",money(0),
"\ n :: Floting sell : ",money(1),
"\ n ------------------------------------------------",
"\ n :: >>By: Jum69<<",
"\ n ------------------------------------------------");
}

Nah jadi deh


Martingel yang di maksud juga mengacu pada jarak (range) order dan pergantian candel untuk mencegah
terjadinya beberapa order ketika terjadi lonjakan harga dan candel panjang , seperti pada part 18

Penambahan coding martingelnya :

1. Fungsi untuk perintah order martingelnya

if(trad()==1 && wt!=Time[0] && jumlahorder(1)==0 && jumlahorder(0)<Max_order )


{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 )
{OrderSend(Symbol(),OP_SELL,xlot(1),Bid,3,sls, tps,Nama_EA,Magic,0,Red);
wk=Time[0];  }

2. Fungsi untuk perhitungan jarak order dan  perintah ketika jarak terpenuhi

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

3. Fungsi untuk perhitungan Lots setiap pengulangan ordernya


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

Nah setelah di rakit begini deh hasilnya:


if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) c ontinue;
if (OrderSymbol() != Symbol() || OrderMagicNumbe r() != Magic ||OrderType()!=m)
dlot=OrderLots();
}
if(OrderType()==m)ylot=NR(Lots*MathPow(DiMarti,jumlahorder(m)));
return(ylot);
}

Ini hasil BTnya:

Okey seilahkan de coba ya...

Anda mungkin juga menyukai