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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful