Anda di halaman 1dari 53

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,AskSL*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.metaquotes.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
extern int
extern int

Nama_EA
TP
SL

= "Buy Saja";
= 11;
= 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
begini:
/ / +------------------------------------------------------------------+
//|
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
extern int TP
extern int SL
extern double Lots

="Buy Saja";
=11;
=100;
=0.1;

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

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
extern
extern
extern
extern

string
int
int
double
int

Nama_EA
TP
SL
Lots
Magic

= "Buy Saja";
= 11;
= 100;
= 0.1;
= 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

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.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;
/ / +------------------------------------------------------------------+
/ / | 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, BidTP*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, BidTP*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, BidTP*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() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==OP_BUY) J umlahbuy++;
if(OrderType()==OP_SELL) J umlahsell++;
}
if(J umlahbuy==0){ OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point, Ask
if(J umlahsell==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() || OrderMagicNumber()!=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() || OrderMagicNumber()!=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, BidTP*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
extern int

Jam_Order
Menite

=7;

= 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, BidTP*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
exter

int

22;

Akhir_Jam

4;

int

Mulai_Jam

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() || OrderMagicNumber()!=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;
//---return(0);
}

else

pt=Point;

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, BidTP*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, BidTP*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() || OrderMagicNumber()!=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() || OrderMagicNumber()!=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, BidTP*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, BidTP*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(),Bidpt*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
double
double
double

MA_1O
MA_1C
MA_2O
MA_2C

=iMA(Symbol(),0,Pereode_1,0,MODE_SMA,PRICE_OPEN ,1);
=iMA(Symbol(),0,Pereode_1,0,MODE_SMA,PRICE_CLOSE ,1);
=iMA(Symbol(),0,Pereode_2,0,MODE_SMA,PRICE_OPEN ,2);
=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() || OrderMagicNumber()!=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() || OrderMagicNumber()!=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() || OrderMagicNumber()!=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 atas
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() || OrderMagicNumber()!=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 :: =>+J um+Donchian+v2<=",
"\ n :: =>J umForex.blogspot.com<=",
"\ n ------------------------------------------------",
"\ n :: Spread
: ", MarketInfo(Symbol(), MODE_SPREAD),
"\ n :: Leverage
: 1 : ", AccountLeverage(),
"\ n :: Equity
: ", AccountEquity(),
"\ n :: J amServer
:", Hour(), ":", Minute(),
"\ n ------------------------------------------------",
"\ n :: >>By: J um69<<",
"\ 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 )
if(lo>0)

sigz= 1;
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*PointSL*Point,Ask-Jarak*Point+TP*Point, "", Magic, 0, Blue);

Bisa juga di tulis:


OrderSend(Symbol(), OP_BUYLIMIT, start_lot, Ask- Jarak*Point, 3, AskJarak*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*PointSL*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, BidJarak*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, AskJarak*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, AskJarak*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*PointTP*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*PointTP*Point, "", Magic, 0, Red);

Nah silahkan di lanjut deh


Tapi saya udah coba buatkan EA sederhananya untuk lebih memahami
silahkan di amati
"\ n ------------------------------------------------",
"\ n :: =>+J um+Pending<=",
"\ n :: =>J umForex.blogspot.com<=",
"\ n ------------------------------------------------",
"\ n :: Spread
: ", MarketInfo(Symbol(), MODE_SPREAD),
"\ n :: Leverage
: 1 : ", AccountLeverage(),
"\ n :: Equity
: ", AccountEquity(),
"\ n :: J amServer
:", Hour(), ":", Minute(),
"\ n ------------------------------------------------",
"\ n :: >>By: J um69<<",
"\ 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
extern
extern
extern
extern
extern
extern
extern
extern
extern
extern
extern
extern
extern
extern
double

string Nama_EA
bool
Trade_buystop
bool
Trade_sellstop
string Jam_server
int
Jam
int
Menit
bool
Tp_in_Money
double TP_in_money
int
TP
int
SL
double Lots
int
Jarak_stop
bool
TrailingStop_
int
TrailingStop
int
Magic
slb,tpb,sls,tps,pt,lslb,ltpb;

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

"Jum+Profit";
true;
true;
"Set sesuai selera";
0;
30;
false;
5;
100;
20;
0.1;
25;
true;
12;
69;

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 :: J amServer
:", Hour(), ":", Minute(),
"\ n ------------------------------------------------",
"\ n :: Floting buy : ",money(0),
"\ n :: Floting sell : ",money(1),
"\ n ------------------------------------------------",
"\ n :: >>By: J um69<<",
"\ 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)) continue;


if (OrderSymbol() !=Symbol() || OrderMagicNumber() !=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