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:

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

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

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

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

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

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

//masukkan nilai b dikali 5 ke a a+=5.A=B%C //a = sisa bagi b dengan c . B--. Assignment operator yang umum dipake cuman = ada banyak sih. //saat ini A bernilai 2 (1+1) A++. //A sama dengan 1 A++. cuman dikurangi 1 B=1. 8 % 3 = 2 Code: A++. -=. //A sama dengan a-4 3. Print (A). Operator Logical cuman ada 3 yang penting .. //saat ini B nilainya 0 2. tapi jarang dipake & agak susah dipahami. Print(B). 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. //sama kayak diatas.10 % 3 = 1 . //saat ini A bernilai 3 (karena ditambah 1 lagi) Code: B--. //sama dengan A ditambah 1 //contoh : A=1. %= dll. //A sama dengan a+5 a-=5. ada +=. jadi gw jelasin di lain waktu saja Code: a=b*5. Print (A).

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

semisal kalau candle nya terlalu panjang (lebih dari 50 pips).1) && iClose(Symbol(). cuman bahasa dan tata cara penulisannya saja yang beda. untuk branching juga.2 SWITCH Switch fungsinya sama ama if.1)iClose(Symbol().1)>iOpen(Symbol().1) < 50*Point ) { //open buy } else if (iClose(Symbol(). . tidak trade.else if (iClose(Symbol(). jika misalnya perlu 2 kondisi..1) && iOpen(Symbol().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.0.0.Operator dan Ekspresi) contoh : Code: //diatas sudah if (iClose(Symbol().0.0.1)<iOpen(Symbol()..1)<iOpen(Symbol(). yang variabelnya sama.0. maka kita bisa menggunakan Operator Logical (Bagian 5 .0.0. Bedanya switch digunakan untuk membandingkan hal2 yang sebanding.0. (di perpus kampus IT biasanya ada) 1.1) ) { //open sell } else { //ga trade } kurang lebih sama seperti kita nyuruh orang.1)iOpen(Symbol(). bisa baca2 buku logika & algoritma.0.0.

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

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

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

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

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

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

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

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

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

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

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

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

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

..kebetulan indikator range1 tadi cuman 1 kluaran outputnya.. seperti yang di bagian 8 (Bagian 8 ."namaindi".5. ya mode nya diisi 5 Code: iCustom(Symbol().... 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....(inputan)..0) nah.Menyusun EA) .0... bagaimana klo indikatornya ada inputan.. kebetulan juga indikator range1 tadi tidak ada inputan.

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

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

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

Sign up to vote on this title
UsefulNot useful