Tutorial Membuat EA

download Tutorial Membuat EA

of 28

Transcript of Tutorial Membuat EA

Tutorial membuat Expert Advisor (EA)Bagian 1 - PengenalanPengenalan 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 EABahasan 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:

//+------------------------------------------------------------------+ //| ContohEA1.mq4 | //| Copyright 2008, Forexindo | //| http://www.forexindo.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2008, Forexindo" #property link "http://www.forexindo.com" extern extern extern extern extern extern double Lots=0.1; int StopLoss=100; int TakeProfit=150; string txComment="Order EA1"; int MagicNumber=12345; int Slippage=5;

//+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---//---return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---//---return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---if (OrdersTotal()==0) { if (iClose(Symbol(),0,1) > iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE,1) ) { OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,AskStopLoss*Point,Ask+TakeProfit*Point,txComment,MagicNumber); } else if (iClose(Symbol(),0,1) < iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE,1) ) { OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Bid+StopLoss*Point,BidTakeProfit*Point,txComment,MagicNumber); } } //---return(0); } //+------------------------------------------------------------------+

Logika EA ini, kira2 (misal EA ini diletakkan di chart GBPUSD 1 Hour), Jika tidak ada posisi, jika candle jam lalu closenya diatas EMA 10, maka buy, kalau candle jam lalu closenya dibawah EMA 10, maka sell.

kira2 seperti ini lah...... buy di open candle yang gw kasih panah (karena candle sebelumnya closed di atas EMA) di 1.7366, dan close di 1.7516 (150 pips TP)... ehm, spreadnya lupa gw itung di 1.7519 ya tapi intinya kira2 gitu lah coba kita telaah satu per satu bagiannya..... penjelasan di topic ini sekilas aja... detailnya nanti akan dijelaskan di masing2 bagian. Code:extern extern extern extern extern extern double Lots=0.1; int StopLoss=100; int TakeProfit=150; string txComment="Order EA1"; int MagicNumber=12345; int Slippage=5;

harusnya buy nya dapet di harga 1.7369 dan TP nya

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, yang berarti perintah dibawahnya (didalem { } ) akan dieksekusi jika tidak ada order sama sekali. yang dianggap order adalah baik posisi terbuka (buy/sell) atau pending order. Code:if (iClose(Symbol(),0,1) > iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE,1) )

iClose() itu fungsi untuk mengambil harga close dari candle (detailnya akan dijelaskan di bagian lain) pada syntax ini, berarti dia ngambil harga close dari pair dimana EA di attach, 1 candle sebelom sekarang. iMA() itu buat ambil nilai moving average, yang dalam syntax ini brarti EMA periode 10 diitung dari harga close, 1 jam sebelum sekarang (biar waktunya sama ama candle yang dibandingkan) Code:OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,AskStopLoss*Point,Ask+TakeProfit*Point,txComment,MagicNumber);

OrderSend() digunakan untuk melakukan order, nanti akan dijelaskan di bagian lain, termasuk penggunaan error catch nya supaya tidak terjadi tragedi log file ukurannya bergiga2 else if dan yang dibawahnya itu sama, cuman tanda nya aja yang dibalik.. simple kan ?.. ya simple, lah EA nya juga simple sekali. Ga ada money managementnya, ga ada trailling stop nya, ga ada error catcher nya, dll dll

tapi ya itu EA paling sederhana, nantinya di bagian2 selanjutnya akan dijelaskan lebih detil mengenai fungsi2nya...

Bagian 3 - Syntax dan Hal-hal dasarSyntax dari MQL4 ini mirip c/c++. Langsung saja kita bahas satu per satu 1. Deklarasi dan Penamaan Variabel yang valid : Code:double double double double double aa; aaa,bbb; aaaa=1; bb,cc=2; a=0,b=1;

double d=2, e=3, f=4;

double itu tipe data nya, bisa diganti int, string, bool, dll a-f itu nama variablenya. jadi intinya : (yang paling simple) Code:tipe_data nama_variabel=nilai;

klo ude kebiasa coding, 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, nama variable ini case sensitive. Nama_Variabel beda ama nama_variabel untuk array, akan dijelaskan di bagian lain. (soalnya klo pemula jarang pakai array aturan penamaan variabel : - panjangnya max 31 karakter - harus diawali huruf besar, huruf kecil atau _ (tidak bisa angka atau simbol lain selain _ ) - tidak bisa menggunakan keyword contoh2 keyword : bool, color, extern, static, Case, Else, If, true, false dan lain2 )

2. Comment untuk tulis comment, ada 2 cara

1. menambahkan // di awal kalimat 2. menggunakan /* */ contoh Code:int stoploss=10; //stoploss dari trade

atau Code:/* Stoploss diisi dalam point */ int stoploss=10;

kalimat sesudahnya // pada baris yang sama tidak akan dibaca oleh program dan apapun yang diapit /* dan */ juga tidak akan dibaca oleh program

Bagian 4 - Tipe DataTipe Data Di MQL4 ada 7 tipe data : 1. Integer (int) Integer = bilangan tidak berkoma, dari -2 milyar sampe +2 milyar Code:int A=1;

2. Boolean (bool) Boolean cuman bisa bernilai benar atau salah (true atau false) Code:bool SpreadProtection=true;

3. Character (int) Char ini isinya cuman 1 huruf/symbol doank, untuk deklarasi menggunakan int, karena yang disimpen adalah nomor ascii nya Code:int char1='A';

hanya 1 huruf, dan diapit tanda petik 1 4. String (string) String = kata2/kalimat Code:string commentOrder="Order by EA1";

kata2nya diapit pake tanda petik (") 5. Double (double) percis ama integer, cuman double ini untuk bilangan berkoma

Code:double Lot=0.1;

6. Color (color) Color ini buat menyimpan informasi warna... function2 tertentu ada paramater warna, untuk set warna tanda panah di chartnya.... misalnya OrderSend Code:color WarnaBuy=Red; OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point,"My order #2",16384,0,WarnaBuy);

warna ini paling gampang ya ditulis saja (Red, Blue, Green, dll), atau pakai nilai integer dari RGB nya.. tapi kayaknya sih warna2 umum ude cukup, kan hanya buat charting aja, bukan seni lukis pilihan warnanya bisa di set di Web colors - MQL4 Documentation

7. Datetime (datetime) Datetime ini untuk menyimpan informasi tanggal & waktu ke variabel misal : Code:datetime expiredEA=D'31.12.2007 00:00:00'; if (TimeCurrent()>expiredEA) { Print("maap, EA sudah expired"); }

fungsi diatas, membandingkan waktu sekarang dengan tanggal dan jam expired EA yang sudah disimpan dalam variabel... selain itu, biasanya datetime ini digunakan untuk mengatur waktu expire dari pending order formatnya D'dd.mm.yy HH:MM:SS' sekian pembahasan tipe data..

Bagian 5 - Operator dan EkspresiOperasi dan Ekspresi 1. 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

A=B%C //a = sisa bagi b dengan c - 10 % 3 = 1 ; 8 % 3 = 2

Code:A++; //sama dengan A ditambah 1 //contoh : A=1; //A sama dengan 1 A++; Print (A); //saat ini A bernilai 2 (1+1) A++; Print (A); //saat ini A bernilai 3 (karena ditambah 1 lagi)

Code:B--; //sama kayak diatas, cuman dikurangi 1 B=1; B--; Print(B); //saat ini B nilainya 0

2. Assignment operator yang umum dipake cuman = ada banyak sih, ada +=, -=, %= dll, tapi jarang dipake & agak susah dipahami.. jadi gw jelasin di lain waktu saja Code:a=b*5; //masukkan nilai b dikali 5 ke a a+=5; //A sama dengan a+5 a-=5; //A sama dengan a-4

3. Relational operator (operator pembanding) Code:== : sama != : tidak sama < : lebih kecil dari > : lebih besar dari = : 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. Operator Logical cuman ada 3 yang penting

&& : dan || : atau ! : not contoh penerapan : Code:if (a==b && c=d) { } //jika a sama dengan b adalah salah (berarti a tidak sama dengan b) atau c lebih besar dari atau sama dengan d

========== ada beberapa operator lain, seperti bitwise operator, tapi tidak terlalu digunakan untuk EA2 yang sederhana, jadi gw jelasin belakangan aja.

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

else if (iClose(Symbol(),0,1)iOpen(Symbol(),0,1) && iClose(Symbol(),0,1)iOpen(Symbol(),0,1) < 50*Point ) { //open buy } else if (iClose(Symbol(),0,1)