Tutorial membuat Expert Advisor (EA

)
Bagian 1 - Pengenalan
Pengenalan MQL 4 MQL4 adalah bahasa pemrograman yang terdapat pada platform MetaTrader 4. MQL4 ini paling umum digunakan untuk membuat Expert Advisor (EA), Custom Indicator, dan Script. Expert Advisor / EA, seperti yang sudah kita ketahui, adalah program untuk mengotomasi trading anda berdasarkan logika2 dan paramater2 tertentu. Custom Indicator, hampir sama seperti EA, cuma tidak bisa melakukan trading. Dan dapat menggunakan function2 indicator. Script, sama seperti EA, hanya saja dilakukan hanya 1x saat script dijalankan. Untuk membuat program/script dengan MQL 4, caranya cukup mudah, cukup jalankan saja MetaEditor. MQL4 ini struktur dan syntax nya mirip C/C++. Jadi kalau udah kebiasa dengan C/C++, harusnya ga akan mengalami kesulitan membuat program dengan MQL4. Kesulitannya mungkin saat debugging.. Lebih lanjutnya, MQL4 dapat melakukan interkoneksi dengan file DLL. Hal tersebut memungkinkan pemrograman yang lebih kompleks dan rumit, dan tentu saja, sangat memungkinkan untuk disusupi spyware/virus oleh pembuat EA (terutama yang pakai DLL).

Bagian 2 - Contoh EA
Bahasan yang pertama, adalah EA (setelah EA, baru kita akan membahas custom indicator dan script). Untuk memulai membuat EA, setelah masuk MetaEditor, pilih File -> New -> pilih Expert Advisor, lalu masukkan Copyright dan Link lalu anda akan mendapat code kira2 seperti ini :

Code:
//+------------------------------------------------------------------+ //| ContohEA2.mq4 | //| Copyright © 2008, Forexindo | //| http://www.forexindo.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, Forexindo" #property link "http://www.forexindo.com" //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---//---return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---//---return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---//---return(0); } //+------------------------------------------------------------------+

Sedikit penjelasan, yang di dalam init() dijalankan 1x saat EA pertama kali di drag ke chart yang di dalam deinit() dijalankan 1x saat EA di remove dari chart, atau chart ditutup yang di dalam start() dijalankan tiap tick (tiap ada harga baru) nah, coba lihat EA super simple berikut ini :

Code:

Lots.1.MODE_EMA.Ask+TakeProfit*Point.PRICE_CLOSE. } } //---return(0). string txComment="Order EA1".OP_SELL.com" extern extern extern extern extern extern double Lots=0.0.OP_BUY.0.MagicNumber).1) ) { OrderSend(Symbol().0.0.MODE_EMA. Forexindo" #property link "http://www.Ask. } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---if (OrdersTotal()==0) { if (iClose(Symbol().PRICE_CLOSE. int MagicNumber=12345. Forexindo | //| http://www.Slippage.0.txComment.Slippage. int Slippage=5. } else if (iClose(Symbol().10.0.MagicNumber).mq4 | //| Copyright © 2008. int TakeProfit=150.BidTakeProfit*Point.10.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008.Bid. int StopLoss=100.1) < iMA(Symbol().1) ) { OrderSend(Symbol().txComment.Bid+StopLoss*Point.AskStopLoss*Point.Lots. } //+------------------------------------------------------------------+ .forexindo.forexindo.1) > iMA(Symbol(). } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---//---return(0).//+------------------------------------------------------------------+ //| ContohEA1. //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---//---return(0).

......7519 ya tapi intinya kira2 gitu lah coba kita telaah satu per satu bagiannya.. kira2 seperti ini lah.Logika EA ini. penjelasan di topic ini sekilas aja. buy di open candle yang gw kasih panah (karena candle sebelumnya closed di atas EMA) di 1.. string txComment="Order EA1". int StopLoss=100.. Code: extern extern extern extern extern extern double Lots=0. ehm.7369 dan TP nya . kalau candle jam lalu closenya dibawah EMA 10. spreadnya lupa gw itung di 1. jika candle jam lalu closenya diatas EMA 10. kira2 (misal EA ini diletakkan di chart GBPUSD 1 Hour).. int Slippage=5. int TakeProfit=150. Jika tidak ada posisi. maka buy. detailnya nanti akan dijelaskan di masing2 bagian.1. maka sell. dan close di 1.. int MagicNumber=12345.7516 (150 pips TP).. harusnya buy nya dapet di harga 1..7366.

nanti akan dijelaskan di bagian lain. 1 candle sebelom sekarang. ga ada error catcher nya.PRICE_CLOSE.. Ga ada money managementnya. ya simple.Slippage.MODE_EMA. dll dll . ga ada trailling stop nya. simple kan ?. Code: if (iClose(Symbol(). yang dianggap order adalah baik posisi terbuka (buy/sell) atau pending order.Lots. termasuk penggunaan error catch nya supaya tidak terjadi tragedi log file ukurannya bergiga2 else if dan yang dibawahnya itu sama.0. iMA() itu buat ambil nilai moving average..Ask. yang dalam syntax ini brarti EMA periode 10 diitung dari harga close. OrderSend() digunakan untuk melakukan order.OP_BUY.cukup jelas kan ya extern intinya supaya variable tersebut bisa diubah2 oleh end user yang tidak memiliki akses ke source code EA. cuman tanda nya aja yang dibalik.Ask+TakeProfit*Point.0.10.0. lah EA nya juga simple sekali. Code: if (OrdersTotal()==0) Jika semua order = 0.txComment. 1 jam sebelum sekarang (biar waktunya sama ama candle yang dibandingkan) Code: OrderSend(Symbol(). yang berarti perintah dibawahnya (didalem { } ) akan dieksekusi jika tidak ada order sama sekali.1) ) iClose() itu fungsi untuk mengambil harga close dari candle (detailnya akan dijelaskan di bagian lain) pada syntax ini. berarti dia ngambil harga close dari pair dimana EA di attach.AskStopLoss*Point.1) > iMA(Symbol().MagicNumber).

false dan lain2 ) 2. aaa. bool. (soalnya klo pemula jarang pakai array aturan penamaan variabel : . jadi intinya : (yang paling simple) Code: tipe_data nama_variabel=nilai. nama variable ini case sensitive. bb. extern. ada 2 cara .. true. double itu tipe data nya. Else. bisa diganti int. aaaa=1. static. tambahi aja extern jadi : Code: extern tipe_data nama_variabel=nilai.panjangnya max 31 karakter . If. dll a-f itu nama variablenya. string. Bagian 3 . f=4. oya. nantinya di bagian2 selanjutnya akan dijelaskan lebih detil mengenai fungsi2nya.harus diawali huruf besar. double d=2.Syntax dan Hal-hal dasar Syntax dari MQL4 ini mirip c/c++. Langsung saja kita bahas satu per satu 1.tapi ya itu EA paling sederhana. Case. akan dijelaskan di bagian lain. Deklarasi dan Penamaan Variabel yang valid : Code: double double double double double aa.b=1..tidak bisa menggunakan keyword contoh2 keyword : bool. kombinasi seperti diatas juga bisa dipakai klo mau dibikin biar bisa diubah2 oleh user. huruf kecil atau _ (tidak bisa angka atau simbol lain selain _ ) . Comment untuk tulis comment. a=0. color. Nama_Variabel beda ama nama_variabel untuk array. klo ude kebiasa coding. e=3.bbb.cc=2.

kalimat sesudahnya // pada baris yang sama tidak akan dibaca oleh program dan apapun yang diapit /* dan */ juga tidak akan dibaca oleh program Bagian 4 . 2. 3. untuk deklarasi menggunakan int. String (string) String = kata2/kalimat Code: string commentOrder="Order by EA1". Double (double) percis ama integer. menambahkan // di awal kalimat 2. hanya 1 huruf. dan diapit tanda petik 1 4. cuman double ini untuk bilangan berkoma . karena yang disimpen adalah nomor ascii nya Code: int char1='A'. Integer (int) Integer = bilangan tidak berkoma. Boolean (bool) Boolean cuman bisa bernilai benar atau salah (true atau false) Code: bool SpreadProtection=true. dari -2 milyar sampe +2 milyar Code: int A=1.Tipe Data Tipe Data Di MQL4 ada 7 tipe data : 1. kata2nya diapit pake tanda petik (") 5.1. Character (int) Char ini isinya cuman 1 huruf/symbol doank. menggunakan /* */ contoh Code: int stoploss=10. //stoploss dari trade atau Code: /* Stoploss diisi dalam point */ int stoploss=10.

Datetime (datetime) Datetime ini untuk menyimpan informasi tanggal & waktu ke variabel misal : Code: datetime expiredEA=D'31. Green.1..WarnaBuy). bukan seni lukis pilihan warnanya bisa di set di Web colors . atau pakai nilai integer dari RGB nya."My order #2". misalnya OrderSend Code: color WarnaBuy=Red. EA sudah expired")..Ask. OrderSend(Symbol().0.3.mm. selain itu.1.. if (TimeCurrent()>expiredEA) { Print("maap.. function2 tertentu ada paramater warna. dll)..yy HH:MM:SS' sekian pembahasan tipe data. Bagian 5 . tapi kayaknya sih warna2 umum ude cukup.Ask-25*Point. Blue..Ask+25*Point.12..Operator dan Ekspresi Operasi dan Ekspresi 1.OP_BUY. } fungsi diatas.. Color (color) Color ini buat menyimpan informasi warna. Operator Aritmatika Code: A=B+C A=B-C A=B*C A=B/c //a //a //a //a = = = = b b b b ditambah c dikurangi c dikali c dibagi c . biasanya datetime ini digunakan untuk mengatur waktu expire dari pending order formatnya D'dd.MQL4 Documentation 7.16384. kan hanya buat charting aja. membandingkan waktu sekarang dengan tanggal dan jam expired EA yang sudah disimpan dalam variabel.. warna ini paling gampang ya ditulis saja (Red.2007 00:00:00'. untuk set warna tanda panah di chartnya. 6.Code: double Lot=0.

Operator Logical cuman ada 3 yang penting . Print (A). Relational operator (operator pembanding) Code: == : sama != : tidak sama < : lebih kecil dari > : lebih besar dari <= : lebih kecil dari atau sama dengan >= : lebih besar dari atau sama dengan contoh penerapan Code: if (a==b) { } //kalau a sama dengan b if (a>b) { } // kalau a lebih besar dari b if (a!=b) { } // kalau a tidak sama dengan b 4. //A sama dengan 1 A++. %= dll. //A sama dengan a+5 a-=5. Assignment operator yang umum dipake cuman = ada banyak sih. ada +=. //masukkan nilai b dikali 5 ke a a+=5. //A sama dengan a-4 3. tapi jarang dipake & agak susah dipahami. Print (A). //saat ini A bernilai 3 (karena ditambah 1 lagi) Code: B--.10 % 3 = 1 .. //saat ini B nilainya 0 2. //sama dengan A ditambah 1 //contoh : A=1. 8 % 3 = 2 Code: A++. //sama kayak diatas. Print(B). B--. jadi gw jelasin di lain waktu saja Code: a=b*5. -=. //saat ini A bernilai 2 (1+1) A++. cuman dikurangi 1 B=1.A=B%C //a = sisa bagi b dengan c .

&& : dan || : atau ! : not contoh penerapan : Code: if (a==b && c<d) { } //jika a sama dengan b dan c lebih kecil dari d if (!a==b || c>=d) { } //jika a sama dengan b adalah salah (berarti a tidak sama dengan b) atau c lebih besar dari atau sama dengan d ========== ada beberapa operator lain. jadi gw jelasin belakangan aja. sekarang ini EA harusnya open buy. Program juga harus diperintah seperti itu. tapi ternyata dia malah diem aja. Sesuai atau tidaknya program komputer berjalan tergantung dari kebenaran anda menulis/menyusun perintah2 decision dan looping Begitu juga dengan EA. kalau lebih mahal ya ga usah beli.1) ) { //open buy } .1 IF ..0.0. U bilang. maka penulisannya akan jadi seperti ini : Code: //diatas sudah if (iClose(Symbol().Decision dan Looping Decision dan Looping Pada bagian ini kita akan membahas decision dan looping. kalau salah dalam menyusun decision & looping. dikasih opsi berdasarkan kriteria2 tertentu. dan sebaliknya) kalau dalam bahasa MQL4. nah itu bisa jadi. akan dipecah menjadi 2 opsi : opsi 1 : kalau harga 5000 beli 2 opsi 2 : kalau harga diatas 5000. Misalnya menurut kehendak kita.1)>iOpen(Symbol(). kesalahannya terletak pada bagian ini.(ELSE) Decision berarti membagi alur program menjadi 2. maka buy Kalau candle ditutup bearish. 1. Itu termasuk branching. maka kinerjanya akan tidak sesuai yang kita kehendaki. Decision/Branching 1. karena dari 1. ga usah beli Sama juga seperti program. walau tidak 100% pasti. kalau harganya 5000 beliin 2 ya. Simplenya begini. maka sell Kalau candle close=open.. Bagian 6 . Contohnya dalam forex : Kalau candle ditutup bullish. maka tidak usah trade (bullish berarti close lebih tinggi dari open. seperti bitwise operator. Decision dan looping adalah inti dari sebuah program komputer. tapi tidak terlalu digunakan untuk EA2 yang sederhana. u suruh temen u beliin nasi empal.

yang variabelnya sama.1)iClose(Symbol(). (di perpus kampus IT biasanya ada) 1.1) ) { //open sell } else { //ga trade } kurang lebih sama seperti kita nyuruh orang.0.1)>iOpen(Symbol()..1) && iClose(Symbol().0.0.0. cuman bahasa dan tata cara penulisannya saja yang beda.0.1) < 50*Point ) { //open sell } else { //ga trade } cukup jelas kan ya? gw cuman coba jelasin syntax2 & penulisannya saja kalau misalnya translasi dari bahasa manusia ke bahasa algoritma yang dimengerti komputer.Operator dan Ekspresi) contoh : Code: //diatas sudah if (iClose(Symbol().1)iOpen(Symbol().2 SWITCH Switch fungsinya sama ama if.0. untuk branching juga.1)<iOpen(Symbol(). semisal kalau candle nya terlalu panjang (lebih dari 50 pips). jika misalnya perlu 2 kondisi.0.0.0. .1) < 50*Point ) { //open buy } else if (iClose(Symbol(). maka kita bisa menggunakan Operator Logical (Bagian 5 .1)<iOpen(Symbol(). tidak trade. Bedanya switch digunakan untuk membandingkan hal2 yang sebanding.else if (iClose(Symbol()..1) && iOpen(Symbol(). bisa baca2 buku logika & algoritma.0.

maka perintah di case selanjutnya akan dieksekusi juga. case '2': bolehTrade=cekCandle(). CASE B or C (yang dibawah case C juga dieksekusi. case 'C': Print("CASE B or C"). maka yang keluar adalah CASE B. dst syntaxnya seperti ini : Code: switch(x) { case 'A': Print("CASE A"). jika 1 EA punya 3 pilihan filtrasi harga (untuk memfilter false signal). break. . atau mengulang sepanjang kondisi x terpenuhi. B or C"). dan bolehTrade adalah boolean x=integer default adalah nilai jika x tidak memenuhi semua kriteria di case (kayak else nya statement If) 2. default: Print("Unknown Option"). looping juga merupakan jantung dari program komputer dan EA. Looping Selain branching/percabangan. break. default: Print("NOT A. kalau tidak. maka bisa menggunakan switch. harus diakhiri dengan break. } cekRSI(). break. inputan 1 untuk filter menggunakan RSI. jadi misal pada code diatas. break. cekCandle(). kalau x=B. walau x bukan C) Code: switch(x) { case '1': bolehTrade=cekRSI(). 2 untuk panjang candle. break. seperti mengulang sebanyak X kali. bahwa setiap selesai operasi. Looping intinya mengulang. Dengan batasan2 tertentu.Misal. } perhatikan. case 'B': Print("CASE B"). break.

dimana itu harus terpenuhi. for(j=0. Kalau misalnya j dimulai dari angka besar. dan keperluan2 lainnya.. j nya dikurangi 1 ) contoh script simple untuk cek candle Code: bool allBullCandle=true.. j<5 adalah kriteria dari looping tersebut. j<5. dalam hal ini. increment index) for itu butuh 1 variabel untuk index. tapi seinget gw yang paling sering ya 2 itu. maka akan keluar 0. j++) { Print(j)... baru perintah yang di { } itu dijalankan. looping di EA ini paling sering digunakan untuk manajemen order (jika ordernya lebih dari 1. .Misal. maka diganti jadi j-. "Ayo.4 penjelasannya gini : for (inisialisasi index .. push up 10x !" "Push up terussssss sampai saya bilang stop".. misal pakai strategi grid/martingale). membaca rentetan candle (misal untuk mengecek 3 candle terakhir). 2..1 For contoh syntax : Code: int j. j++ ada increment untuk j (supaya index nya naik). kita pake j pertama2 j di nol kan dulu. kondisi .2...1. ke 0. } klo di jalankan. kalau mau dimulai dari angka yang besar juga bisa..(tiap putaran.3.

. kalau hasilnya dibawah 0 (berarti close lebih rendah). (jadi gw jelasin ntar'an aja ye contoh syntax nya Code: while(k<n) { y=y*x. bisa2 space harddisk tiba2 abis karena ukuran log file yang jadi bergiga2 lebih parah lagi kalau order berkali2 sampai marginnya abis...0. berarti close dibawah open { allBullCandle=false.a++) { if (iClose(Symbol(). -------gw cuman coba jelasin syntax2nya aja. untuk mengulang bedanya. dari 1 hingga lebih kecil dari 4 (which is 3).//untuk cek 3 candle terakhir for (int a=1. } } if (allBullCandle) { Print("Bull"). break berguna untuk menghentikan looping..a)<0) //kalau range negatif. oya.. untuk transform dari bahasa manusia ke bahasa programming..Fungsi Order dan Indikator Teknikal Fungsi Order dan Analisa Teknikal Bagian ini membahas beberapa fungsi yang penting. break. kita bisa pake for. maka kita pake while penggunaan while ini cukup jarang... kalau pakai looping ini ati2 ye klo loop nya keliru. tapi kalau masih ga jelas mau diulang berapa kali. } else { Print ("Tidak Bull"). k++. } penjelasan allBullCandle bertipe boolean dideklarasikan terlebih dahulu.0.a<4. Bagian 7 .iOpen(Symbol().harga open candle a sebelum sekarang . silakan baca2 buku algoritma & logika.a) . yang dipakai dalam hampir setiap . lalu for. maka jalankan 2 baris yang didalem { } nya itu..2 While fungsinya sama persis dengan for.. } ) artinya. sekali lagi. jadi looping tidak perlu dilanjutkan). maka variabel allBullCandle langsung diisi nilai false. selama k lebih kecil dari n. 2. kalau kita tau persis berapa kali pengulangannya. (kalau ude ketemu 1 candle yang tidak bullish kan otomatis jadi tidak bull.. cek harga close candle a sebelum sekarang .

ya tulis aja "GBPUSD" atau "EURUSD" misalnya. OP_BUYSTOP volume itu jumlah lotnya price.. double volume.0. Kalau ga ntar error. OP_BUYLIMIT. int cmd. Fungsi Order Fungsi ini pasti ada di semua EA.. EA hanya di program untuk memanage order dengan magic number tertentu.0. bisa pake fungsi getLastError() contohnya begini : Code: ... cmd itu ada 6 : OP_BUY. string comment=NULL. maka EA tersebut ga akan modify/close order manual u (karena order manual tidak ada magic number) expiration = khusus untuk pending order color = warna tanda di chartnya fungsi OrderSend() ini akan mengembalikan nilai -1 kalau ordernya gagal.Green). Misalnya saja.. double takeprofit. double stoploss. symbol itu diisi Symbol() jika mau yang diorderkan sama dengan chart dimana EA jalan.0. color arrow_color=CLR_NONE) contoh. maka akan mengembalikan nomor ordernya untuk mengetahui gagal ordernya karena apa. biar ga kena requote."My order #1". lebih lengkapnya ada di help nya MQL4. cuman keterangan aja untuk user magic = magic ini magicnumber. kalau TP cuman 3 pip ya otomatis slippagenya jangan besar2. kalau sell. int magic=0. OP_SELLSTOP. tutup... di bagian "Trading Functions" disini kita bahas beberapa aja (sisanya bisa dibaca sendiri). 1. Gunanya adalah untuk buka. slippage itu isi aja 0-5 pip.OP_BUY.. tapi mari kita membahas 2 fungsi dasar dulu saja.Ask. kan yang penting ngerti gimana cara baca & pakainya OrderSend() : untuk membuka order Code: int OrderSend( string symbol. klo ordernya berhasil. OP_SELL.1..1.. takeprofit = harga takeprofitnya comment = terserah mau diisi apa. untuk buka buy 1 lot. stoploss = harga stoploss (bukan pips SL). Sebetulnya fungsi pada MQL 4 itu banyak sekali.. int slippage. double price. tanpa tp dan sl : Code: OrderSend(Symbol(). kalau misalnya mau order pair tertentu. gunanya untuk mengidentifikasi posisi. Tapi tergantung strateginya juga. pricenya Bid. yaitu fungsi order dan fungsi analisa teknikal.. pastikan pricenya Ask.EA. datetime expiration=0.. atau ubah posisi (sebetulnya fungsinya banyak sih). kalau buy. OP_SELLLIMIT.3.

double price. contoh : Code: if(TrailingStop>0) { OrderSelect(12345. int select.BidPoint*TrailingStop.1.0)<25) { ticket=OrderSend(Symbol().2. atau SELECT_BY_TICKET (kalau uda tau nomor . setelah order dibuka.int ticket.GetLastError()).OP_BUY.Ask+25*Point. return(0). lagi terbuka. ada 1 function lagi yang penting.Ask.16384.. di MQL4 Reference -> Standard constants > Error codes nah. order juga bisa di modify (diubah SL/TP nya) dengan fungsi OrderModify() Code: bool OrderModify( int ticket. atau masih pending (limit/stop order). double takeprofit.1. dan false jika modifikasinya gagal.. index = adalah index order (0. int pool=MODE_TRADES) OrderSelect() ini bisa digunakan untuk memilih (men-select . if(ticket<0) { Print("OrderSend failed with error #".. } } nomor kode error nya bisa diliat di help nya.OrderTakeProfit(). kalau ga tau nomor ticketnya.Blue).PRICE_CLOSE. if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket().Green). datetime expiration. color arrow_color=CLR_NONE) OrderModify() ini akan bernilai true jika modifikasinya berhasil. } } } oya.OrderOpenPrice().0.Ask-25*Point.3. yaitu OrderSelect() OrderSelect() ini gunanya untuk memilih order yang akan dimodifikasi/diclose Code: bool OrderSelect( int index. if(iRSI(NULL.bahasa indo yang tepat apa ya? ) order baik yang sudah tertutup.3. atau nomor ticket pada mode SELECT_BY_TICKET select = ya itu tipe select nya.0.14.dst) pada mode SELECT_BY_POS . pakai yang ini)."My order #2". bisa SELECT_BY_POS (memilih berdasarkan posisi. double stoploss.SELECT_BY_TICKET).0. return(0).

double lots. sekarang saatnya untuk menutup order atau menghapus pending order yang tidak jadi untuk menutup posisi yang kebuka. kalau misalnya mau ditutup semua ya isi aja OrderLots() price = kalau mau nutup sell. color = warna tanda di chartnya.ticketnya pake yang ini). contoh : Code: if(OrderSelect(12470. color Color=CLR_NONE) . dll fungsi2nya antara laen : OrderLots() = mengetahui jumlah lot OrderTakeProfit() = mengetahui TP OrderStopLoss() = mengetahui SL OrderSymbol() = mengetahui pair nya . SL. OrderClose() ini akan bernilai True kalau berhasil nutup.. -----ok.lengkapnya langsung aje cek di MQL4 Reference -> Trading functions . sama seperti OrderModify(). pakai harga Ask. OrderClosePrice())... bisa di post di topic ini. TP.. oya. ketik Bid slippage = isi 0-5 sesuai keinginan.. Print("order #12470 close price is ".. kalau kurang jelas tentang cara pakainya. pool = MODE_TRADES itu untuk milih order yang aktif (limit/stop order/order yang masih kebuka). dan bernilai false kalau gagal nutup posisi untuk OrderDelete().GetLastError()). } else Print("OrderSelect returned the error of ". jauh lebih simple dari OrderClose() Code: bool OrderDelete( int ticket. SELECT_BY_TICKET)==true) { Print("order #12470 open price is ". kalau mau nutup buy. Symbol. kita bisa pakai fungsi2 untuk mengetahui informasi mengenai order tersebut.. setelah di-select. pakai OrderClose() (atau OrderCloseBy() kalau hedging) untuk menghapus pending order. double price. bisa di select. OrderOpenPrice()). color Color=CLR_NONE) ticket = nomor ticket lots = jumlah lot yang ditutup. seperti jumlah lot.. order udah bisa di modify.. int slippage. pakai OrderDelete() Code: bool OrderClose( int ticket.. MODE_HISTORY untuk memilih order yang udah ditutup/dihapus.

dll setelah pembahasan fungsi indikator teknikal ini. int ma_shift. nah selanjutnya.. int period.. kita akan bahas fungsi2 untuk membaca nilai dari indikator teknikal seperti Moving Average. harusnya sudah bisa bikin EA yang sederhana (untuk latihan.Technical indicators gw kasih contoh moving average aja. Code: .... gw buka buy... int shift) misalnya sesuai gambar diatas. MACD. Fungsi Indikator Teknikal Di help mql4. int timeframe.. } 4 fungsi tadi adalah fungsi2 dasar untuk trade. return(0). ) 2. functionnya iMA() Code: double iMA( string symbol..... rulenya kalau close candle sebelomnya diatas EMA 144. bisa di cek di MQL4 Reference . int applied_price.contoh : Code: if(Ask>var1) { OrderDelete(order_ticket). int ma_method.

1).14.PRICE_CLOSE.PRICE_CLOSE. mau dikasih filter RSI buat detek overbought (supaya lebih klop).2).0.0. ma1=iMA(Symbol(). berarti terjadi cross if ( ma10_2 > ma20_2 && ma10_1 < ma20_1 ) { //open sell.1). rsi1=iRSI(Symbol().0.0. ma20_1=iMA(Symbol().MODE_EMA.PRICE_CLOSE..PRICE_CLOSE.. ma20_1.MODE_EMA.. ada MODE_SMA.MODE_EMA. ma20_1=iMA(Symbol(). //2) cek EMA 10 dan 20 pada candle 1 sebelom sekarang ma10_1=iMA(Symbol(). dan EMA 10 lebih rendah dari EMA 20 pada candle 1.//pertama musti siapin variabel double ma1=0. //3) klo EMA 10 lebih tinggi dari EMA 20 pada candle 2.PRICE_CLOSE.MODE_EMA.PRICE_CLOSE.0..PRICE_CLOSE. itu ada 4 (bisa di klik sih di help nya).1).2).0. kira2 kayak gini 1) cek EMA 10 dan 20 pada candle 2 sebelom sekarang 2) cek EMA 10 dan 20 pada candle 1 sebelom sekarang 3) klo EMA 10 lebih tinggi dari EMA 20 pada candle 2. //1) cek EMA 10 dan 20 pada candle 2 sebelom sekarang ma10_2=iMA(Symbol(). } kurang canggih..) contoh laen. ma20_2=0. MA cross kalau EMA 10 motong EMA 20 dari atas..0. ma20_1... MODE_EMA. klik aja di link helpnya untuk detailnya (daripada gw tulis lagi. } untuk ma_method.0.0. ma10_2..0. ma20_2=iMA(Symbol(). dan EMA 10 lebih rendah dari EMA 20 pada candle 1.1). double rsi1=0.1)>ma1) { //open buy.MODE_EMA.PRICE_CLOSE. ma20_2=iMA(Symbol(). berarti terjadi cross ya tinggal di coding aje.0.144. itu ada 7..0.PRICE_CLOSE.0.. .. ma20_2=0.144.2).144. Code: double ma10_1.MODE_EMA.144...MODE_EMA. MODE_LWMA untuk applied_price.1)..144.2)..0.0..144.0.MODE_EMA. if (iClose(Symbol().1). ma10_2..0. Code: double ma10_1. open sell klo diterjemahin ke perintah2 komputer.. MODE_SMMA. //2) cek EMA 10 dan 20 pada candle 1 sebelom sekarang ma10_1=iMA(Symbol().144..0.MODE_EMA.0.0.PRICE_CLOSE. strategi paling populer sepanjang masa.144.144. //1) cek EMA 10 dan 20 pada candle 2 sebelom sekarang ma10_2=iMA(Symbol().

envelope. maka sell.. belum inget. dan EMA 10 lebih rendah dari EMA 20 pada candle 1. karena dapat menggunakan TP/SL sebagai closingnya) 4) CloseSellSignal : sama seperti CloseBuySignal 5) MoneyManagement : buat itung lotsize secara otomatis 6) Trail : buat trailling posisi. pada dasarnya.. TP nya 150 dan SL nya 100 pips kalau di breakdown jadi 7 bagian tadi : 1) BuySignal : kalau harga close candle sebelumnya lebih besar/diatas EMA 10 pada candle sebelumnya 2) SellSignal : kalau harga close candle sebelumnya lebih kecil/dibawah EMA 10 pada . ada 3-4 bagian lagi yang membahas operasi. nomor 8. dan function.. (sekarang ude dikasih nomer.. terdiri atas beberapa bagian/struktur. ok.) karena sebelum bab ini. atau yang misalnya terdiri dari beberapa modul yang mengontrol trade sendiri2)..Menyusun EA gw kasih X karena gw masih blom tau nomer berapa. loop & decision. kalau candle jam lalu closenya dibawah EMA 10. dll bisa dibaca sendiri di referencenya. } gampang kan untuk indikator2 laen seperti macd. gw mau bikin EA yang kayak di Bagian 2 .Contoh EA Logika EA ini.. sekaligus mempermudah debugging bagian2nya : 1) BuySignal : pada kondisi apa EA buka buy 2) SellSignal : pada kondisi apa EA buka sel 3) CloseBuySignal : pada kondisi apa EA nutup posisi buy (yang ini tidak harus ada. berarti terjadi cross if ( ma10_2 > ma20_2 && ma10_1 < ma20_1 && rsi1 > 70 ) { //open sell.. par-sar...) Bagian 8 .... jika candle jam lalu closenya diatas EMA 10. bikin EA nya jadi lebih gampang misalnya begini... bagian ini biasanya dibikinkan fungsi tersendiri. Jika tidak ada posisi..//3) klo EMA 10 lebih tinggi dari EMA 20 pada candle 2. bahasan selanjutnya adalah membuat EA sederhana yang komplit (bisa dicompile & bisa jalan) (tapi ga tau profitable atau ga.... agar coding terlihat rapi. sebuah EA yang sederhana/standard (bukan EA yang kompleks seperti neural network. sto... Klo 7 bagian itu sudah ketemu.. maka biasanya ditaruh di bagian ini. dan.. kira2 (misal EA ini diletakkan di chart GBPUSD 1 Hour).. maka buy. klo misalnya diperlukan 7) Confirmator : kalau misalnya EA cuman trade hari senin-kamis.

txComment.mq4 | //| Copyright © 2008. 6) Ga pake trail.MagicNumber).OP_BUY.com" extern extern extern extern extern extern double RiskPercent=5. int Slippage=5. int TakeProfit=150.Slippage. Forexindo | //| http://www. string txComment="Order EA1". Forexindo" #property link "http://www.Ask.forexindo.itungLot().com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008.Ask+TakeProfit*Point. } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---if (bolehTrade()) //kalau boleh trade { if (BuySignal() ) //kalau ada signal buy { OrderSend(Symbol(). int StopLoss=100. int MagicNumber=12345.forexindo. //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---//---return(0). } else if (SellSignal() ) //kalau ada signal sell { . dan juga tidak trade di hari Jumat (gw tambahi rulenya) kira2 source code nya jadi begini Code: //+------------------------------------------------------------------+ //| ContohEA3.AskStopLoss*Point. } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---//---return(0).candle sebelumnya 3) ga ada 4) ga ada 5) Lotnya otomatis diitung berdasarkan SL dan persen risiko. jadi ga ada 7) Posis baru dibuka kalau sedang tidak ada posisi.

atau kalau ada order terbuka. } else { return(true).0. } else { return(false).OrderSend(Symbol(). EA ga trade . oya. } } double itungLot() { //ini untuk itung lot secara otomatis berdasarkan SL dan persen risk double xLots=0.1) < iMA(Symbol().0.MagicNumber).1) ) { return(true). } //+------------------------------------------------------------------+ bool BuySignal() { //kalau harga close candle sebelumnya lebih besar/diatas EMA 10 pada candle sebelumnya if (iClose(Symbol(). EA juga ga trade if (DayOfWeek()==5 || OrdersTotal()>0) { return (false). sekilas mengenai operator || berarti atau && berarti dan (nanti akan dijelaskan di bagian tentang operator) .0.PRICE_CLOSE.txComment.. } logikanya jadi rapi dan jelas.1) ) { return(true)..Slippage. return (xLots). xLots=NormalizeDouble(AccountBalance()*RiskPercent/100 /StopLoss / 10.1).itungLot().Bid.BidTakeProfit*Point.MODE_EMA.10.OP_SELL.0.0. } } //---return(0).MODE_EMA.1) > iMA(Symbol(). } } bool SellSignal() { //kalau harga close candle sebelumnya lebih kecil/dibawah EMA 10 pada candle sebelumnya if (iClose(Symbol().0.PRICE_CLOSE. } } bool bolehTrade() { //kalau jumat.10. } else { return(false).Bid+StopLoss*Point.

indikator ini menampilkan bar range seperti ini : nah. dan ingin membuat EA berdasarkan indikator tersebut. 1) menggunakan function iCustom() 2) mengembed algoritma indikator ke EA nya menggunakan iCustom lebih simpel dan rapi daripada mengembed algoritma indikator ke dalam EA (karena EA nya nanti jadi panjang codingnya). string name.. 7) Posisi baru dibuka kalau sedang tidak ada posisi. gw punya indikator range1 (gw attach ex4 nya). ... kita pake aja contoh EA yang di bagian 8. int timeframe. dan range candle jam sekarang dan jam sebelumnya tidak boleh lebih dari 100 pip.. fungsi lengkapnya : Code: double iCustom( string symbol. . int shift) ok. sebagai contoh.Bagian 9 . dan juga tidak trade di hari Jumat. maka ada 2 solusi yang bisa dipakai. int mode.Implementasi Custom Indikator iCustom Jika anda memiliki indikator sendiri. gw mau mengimplementasikan nilai dari indikator ini (range=absolute(high-low)) ke EA gw. dan juga tidak trade di hari Jumat (gw tambahi rulenya) gw tambahi jadi 7) Posisi baru dibuka kalau sedang tidak ada posisi.

"range1".0.0).1 (paling belakang) = shift (penjelasannya ada di bagian fungsi indikator) mode Mode dalam iCustom itu untuk memilih mendapatkan nilai dari buffer yang mane (buffer 0-7) . EA ga trade . atau kalau ada order terbuka. atau kalau ada order terbuka. EA ga trade . } } ditambahi jadi begini Code: bool bolehTrade() { //kalau jumat.0. juga ga trade range0=iCustom(Symbol(). gimana caranya untuk mendapatkan nilai dari iCustom.0. } else { return(true). custom indikatornya bernama range1.0. EA juga ga trade //klo range diatas 100 untuk candle sekarang dan sebelomnya.1).ex4 (ada di folder expert/indicator) maka. ya isi aja PERIOD_M30) range1 = nama ex4 custom indikatornya (range1.0. asalnya : Code: bool bolehTrade() { //kalau jumat. range1=0."range1". //range pada candle jam sebelom sekarang if (DayOfWeek()==5 || OrdersTotal()>0 || range0>100 || range1>100 ) { return (false)."range1". contoh sekarang.ex4) 0 = mode 0.1). } else { return(true).0).0. //range pada candle jam sekarang range1=iCustom(Symbol(). syntaxnya begini : [code] double range0."range1".. //range pada candle jam sebelom sekarang [code] sedangkan di EA nya.nah.0. range0=iCustom(Symbol(). EA juga ga trade if (DayOfWeek()==5 || OrdersTotal()>0) { return (false). } } gampang kan pada iCustom : Symbol() = symbol dimana ea dipasang 0 = timeframe dimana ea dipasang (kalau mau fix 30 menit. //range pada candle jam sekarang range1=iCustom(Symbol().0.

. bagaimana klo indikatornya ada inputan.0.5.(inputan)."namaindi".. jadi ya pilih mode 0 contoh indikator yang kasih keluaran 6 output : (gw ambil dari indikator member di bagian 8) maka klo mo ambil nilai DownTrendLine misalnya. kebetulan juga indikator range1 tadi tidak ada inputan...kebetulan indikator range1 tadi cuman 1 kluaran outputnya..... ya mode nya diisi 5 Code: iCustom(Symbol(). seperti yang di bagian 8 (Bagian 8 .0) nah.....Menyusun EA) ..

tapi basicnya ya seperti contoh2 diatas.mq4 (5. 227 views) range1..nah.2 KB..0 KB.. klo ada pertanyaan silakan di post. indikator2 terlampir Attached Files   bband-forexindo......ex4 (2. 193 views) Senior Member Join Date . jadi begitu paramater2 inputannya ditaruh seperti itu (garis2 biru) (moga2 ngerti klo liat gambarnya). terus mode yang gw maksud itu untuk mendapatkan nilai yang gw kasih garis ijo iCustom ini cukup luas penerapannya.

diubah jadi Code: . // dalam percent extern double lotDigit=1." supaya settingan persen nya bisa diubah sesuai keinginan. } // di sini juga di filter supaya jika lotnya lebih kecil dari batas minimum yang sudah ditentukan oleh broker.OP_BUY. kalau fxopen 1 digit. bagian lotnya diubah jadi LotSize() untuk memanggil fungsi MoneyManagement yang sudah kita buat di atas contoh yang ini Code: ticket=OrderSend(Symbol(). MODE_MARGINREQUIRED) . maka pertama kita tambahkan extern input seperti ini: Code: extern int Risk=1. saya akan mencoba supaya setiap ordernya hanya menggunakan 1% dari balance.16384.0.MODE_MAXLOT)) { lot=MarketInfo(Symbol(). // di sini kita sudah mendapatkan nilai lotnya if (lot>MarketInfo(Symbol(). maka lotnya diubah sesuai batas maximum lot if (lot<MarketInfo(Symbol().0. jadi kalau total ordernya ada 5 bersamaan berarti margin yang terpakai cuma 5%. maka lotnya diubah sesuai batas minimum tersebut return (lot). nah di sini kita akan menghitung 100 usd itu berapa lot. nah sekarang kita masuk dalam code MM nya. untuk itu akan kita definisikan seperti ini: Code: double margin=MarketInfo(Symbol().MODE_MINLOT)) { lot=MarketInfo(Symbol(). "misalnya balance kita 10."macd sample". ea yang akan diutak-atik adalah ea standard metatrader yaitu "MACD Sample". kita juga harus mengetahui berapa margin yang dibutuhkan untuk order 1 lot.Ask. Code: double LotSize() { double lot=0.3.Aug 2008 Posts 526 Bagian 10 . //berapa decimal lot yang diijinkan. untuk menghitung persentase margin.Ask+TakeProfit*Point. lot=NormalizeDouble((AccountBalance()*Risk/100)/margin. } selanjutnya tinggal mengaplikasikan kode2 di atas ke dalam EA MACD Sample.MODE_MINLOT).000 maka 1% nya berarti 100 usd. semua perintah ordersend dalam ea tersebut.Money Management pada tutorial kali ini saya akan coba menambahkan money management pada sebuah ea.Green).MODE_MAXLOT). } // di sini di filter supaya jika lotnya lebih besar dari batas maximum lot yang ditentukan broker. lotDigit) .Lots. yaitu menghitung berapa lot untuk order 1 persen dari balance.

3."macd sample".mq4 (6.16384. code finalnya seperti ini: Attached Files  MACD Sample+MM.0. 86 views) .0.Ask+TakeProfit*Point.OP_BUY.ticket=OrderSend(Symbol().Ask.Green).LotSize().3 KB.

Sign up to vote on this title
UsefulNot useful