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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful