Anda di halaman 1dari 10

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:
//+------------------------------------------------------------------+
//| ContohEA1.mq4 |
//| Copyright © 2008, Forexindo |
//| http://www.forexindo.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Forexindo"
#property link "http://www.forexindo.com"

extern double Lots=0.1;


extern int StopLoss=100;
extern int TakeProfit=150;
extern string txComment="Order EA1";
extern int MagicNumber=12345;
extern 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,Ask-
StopLoss*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,Bid-
TakeProfit*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 harusnya buy nya dapet di harga 1.7369 dan TP nya
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 double Lots=0.1;
extern int StopLoss=100;
extern int TakeProfit=150;
extern string txComment="Order EA1";
extern int MagicNumber=12345;
extern int Slippage=5;
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,Ask-
StopLoss*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 dasar


Syntax dari MQL4 ini mirip c/c++.

Langsung saja kita bahas satu per satu

1. Deklarasi dan Penamaan Variabel

yang valid :
Code:
double aa;
double aaa,bbb;
double aaaa=1;
double bb,cc=2;
double 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 Data


Tipe 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 Ekspresi


Operasi dan Ekspresi

1. Operator Aritmatika

Code:
A=B+C //a = b ditambah c
A=B-C //a = b dikurangi c
A=B*C //a = b dikali c
A=B/c //a = b 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 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. Operator Logical

cuman ada 3 yang penting


&& : dan
|| : atau
! : not

contoh penerapan :

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

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

Bagian 6 - Decision dan Looping


Decision 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
}

Anda mungkin juga menyukai