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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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