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
//+------------------------------------------------------------------+
//| 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,
Code:
//+------------------------------------------------------------------+
//| ContohEA1.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()
{
//----
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...
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.
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 )
contoh2 keyword : bool, color, extern, static, Case, Else, If, true, false dan lain2
2. Comment
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
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';
4. String (string)
String = kata2/kalimat
Code:
string commentOrder="Order by EA1";
5. Double (double)
percis ama integer, cuman double ini untuk bilangan berkoma
Code:
double Lot=0.1;
6. Color (color)
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
7. Datetime (datetime)
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
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
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
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
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.
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)
Sama juga seperti program. Program juga harus diperintah seperti itu, dikasih opsi
berdasarkan kriteria2 tertentu.
Contohnya dalam forex :
kalau dalam bahasa MQL4, maka penulisannya akan jadi seperti ini :
Code:
//diatas sudah
if (iClose(Symbol(),0,1)>iOpen(Symbol(),0,1) )
{
//open buy
}