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!
OrderSend(Symbol(),0,start_lot,Ask,3,Ask-SL*Point,Ask+TP*Point,"+Jum+oke+",Magic,0,Blue)
OrderSend(Symbol(),OP_BUY,start_lot,Ask,slipage,Ask-SL*Point,
Ask+TP*Point,"+Jum+oke+",Magic,0,Blue);
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);
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
/ / +------------------------------------------------------------------+
//| 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 :
disini
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
sehingga jadinya:
//+------------------------------------------------------------------+
//| 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:
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;
//+------------------------------------------------------------------+
//| 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 |
//+------------------------------------------------------------------+
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"
/ / +------------------------------------------------------------------+
/ / | 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)
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()
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)
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
Nah supaya bisa order sesuai rules yang kita tentukan maka kita akan program
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 ;
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);
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);
}
/ / +------------------------------------------------------------------+
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:
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.
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
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!
Sehingga
jumlahorder(OP_BUY) bisa ditulis juga jumlahorder(0)
demikian juga untuk jumlahorder(OP_SELL) bisa ditulis jumlahorder(1)
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);
Dan untuk membedakan warna order disini saya gunakan blue untuk buy dan red untuk 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);}
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:
/ / ----
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?
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
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
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
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
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!
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.
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().
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.
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);}
}
return(total);
}
Mengingat point adalah type data bilangan berkoma maka kita mulai dengan double
double dpt()
karena ini fungsi maka di tempatkan di luar int start(), dan untuk penerapannya tinggal poin diganti dangan
dpt()
return(total);
}
Saya yakin tidak sulit ini tinggal di Compile saja jadi deh
Mudahkan
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:
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
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.
Untuk menambah wawaan tetntang triger ini saya akan membasar tentang Indikator
Indikator yang paling sederhan di dalam Mt4 adalah Candelistik
nah tinggal dipilih aja yang mau digunakan, tapi kalau mau membaca candel pada EA di attack maka bisa diisi
dngan angka 0
Karena harga High ini merupakan bilangan berkoma maka termasuk tipe data double, sehingga untuk
menentukan membuat variabel high ini sbb
contoh
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
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);
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.
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)
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,)
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 }
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:
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;
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.
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()
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
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 "
Nah pada EA yang akan kita buat ini saya akan tambahkan untuk tp in money (hiden tp dengan acuan jumlah
profit daam money $ )
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
if(tiket>0) wt=Time[0];
}
ini adalah filter untuk order pada pergantian candel
}
}
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);
}
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:
}
}
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:
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
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
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
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
/ / +------------------------------------------------------------------+
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
Oke deh yang sudah mengerti silahan dibuat EAnya ya dengan mengacu pada EA pada part sebelumnya, saya
kira cuup mudah!
Semoga sukses
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
}
}
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
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);
}
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);
}
Nah saya aan tambahkan filter candel supaya kalau ada news panjang akan order setiap pergantian candel ,
dengan memanfaatan wt!=Time[0] seperti pembahasan sebelumnhya.
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 ------------------------------------------------");
}
Sepertinya EA ini udah layak di Coba deh untuk di Beck test ........
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...
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
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.
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).
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);
}
Okey pada part ini saya akan coba bahas tentang EA yang terkait dengan Pending order.
Ada 6 macam type yaitu
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:
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:
2. Selllimit
3. Buystop
4. Sellstop
Sellstop adalah merupakan order pesanan dibawah harga yang sedangan berjalan.
Silahkan di amati dan dibandingkan dengan type sebelumnya
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
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);
"\ 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 .
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);
}
}
sedang bagian untuk mendelet orderstop yang tidak tersentuh maka pada jam tersentu di delet
contoh jam 23
if(Hour()==23){
closeall(4);
closeall(5);
}
"\ 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 ------------------------------------------------");
}
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);
}