Anda di halaman 1dari 36

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 :

//+------------------------------------------------------------------+

//|

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 :

//+------------------------------------------------------------------+

//|

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.

kalau candle jam lalu closenya dibawah EMA 10, maka sell. kira2 seperti ini lah sebelumnya closed

kira2 seperti ini lah

sebelumnya closed di atas EMA) di 1.7366, dan close di 1.7516 (150 pips TP)

buy di open candle yang gw kasih panah (karena candle

ehm, spreadnya lupa gw itung 1.7519 ya tapi intinya kira2 gitu lah harusnya buy nya

ehm, spreadnya lupa gw itung

1.7519

ya tapi intinya kira2 gitu lah

lupa gw itung 1.7519 ya tapi intinya kira2 gitu lah harusnya buy nya dapet di harga

harusnya buy nya dapet di harga 1.7369 dan TP nya di

coba kita telaah satu per satu bagiannya nanti akan dijelaskan di masing2 bagian.

Code:

penjelasan di topic ini sekilas aja

detailnya

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;

This image has been resized. Click this bar to view the full image. The original
This image has been resized. Click this bar to view the full image. The original image is sized 624x308 and
weights 24KB.
The original image is sized 624x308 and weights 24KB. cukup jelas kan ya extern intinya supaya
The original image is sized 624x308 and weights 24KB. cukup jelas kan ya extern intinya supaya

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

nya supaya tidak terjadi tragedi log file ukurannya bergiga2 else if dan yang dibawahnya itu sama,

else if dan yang dibawahnya itu sama, cuman tanda nya aja yang dibalik

simple kan ?

ada trailling stop nya, ga ada error catcher nya, dll dll

ya simple, lah EA nya juga simple sekali. Ga ada money managementnya, ga

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

ude cukup, kan hanya buat charting aja, bukan seni lukis pilihan warnanya bisa di set di

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 jelasin di lain waktu saja

Code:

jadi gw

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 pasti, kesalahannya terletak pada bagian ini.

nah itu bisa jadi, walau tidak 100%

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
//diatas sudah
if (iClose(Symbol(),0,1)>iOpen(Symbol(),0,1) )
{
//open buy
}
else if (iClose(Symbol(),0,1)<iOpen(Symbol(),0,1) )
{
//open sell
}
else
{
//ga trade
}

kurang lebih sama seperti kita nyuruh orang, cuman bahasa dan tata cara penulisannya saja yang beda. jika misalnya perlu 2 kondisi, semisal kalau candle nya terlalu panjang (lebih dari 50 pips),

tidak trade, maka kita bisa menggunakan Operator Logical (Bagian 5 - Operator dan Ekspresi)

contoh :

Code:

//diatas sudah if (iClose(Symbol(),0,1)>iOpen(Symbol(),0,1) && iClose(Symbol(),0,1)- iOpen(Symbol(),0,1)
//diatas sudah
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)<iOpen(Symbol(),0,1) &&
iOpen(Symbol(),0,1)-iClose(Symbol(),0,1) < 50*Point )
{
//open sell
}
else
{
//ga trade
}

cukup jelas kan ya?

gw cuman coba jelasin syntax2 & penulisannya saja

manusia ke bahasa algoritma yang dimengerti komputer, bisa baca2 buku logika &

algoritma

dimengerti komputer, bisa baca2 buku logika & algoritma kalau misalnya translasi dari bahasa (di perpus kampus

kalau misalnya translasi dari bahasa

(di perpus kampus IT biasanya ada)

1.2 SWITCH

Switch fungsinya sama ama if, untuk branching juga. Bedanya switch digunakan untuk membandingkan hal2 yang sebanding, yang variabelnya sama.

Misal, jika 1 EA punya 3 pilihan filtrasi harga (untuk memfilter false signal), maka bisa menggunakan switch. inputan 1 untuk filter menggunakan RSI, 2 untuk panjang candle, dst

syntaxnya seperti ini :

Code:

switch(x)

{

case 'A':

Print("CASE A"); break; case 'B':

Print("CASE B"); case 'C':

Print("CASE B or C"); break; default:

Print("NOT A, B or C"); break;

}

perhatikan, bahwa setiap selesai operasi, harus diakhiri dengan break; kalau tidak, maka perintah di case selanjutnya akan dieksekusi juga.

jadi misal pada code diatas, kalau x=B, maka yang keluar adalah CASE B, CASE B or C (yang dibawah case C juga dieksekusi, walau x bukan C)

Code:

switch(x)

{

case '1':

bolehTrade=cekRSI(); break; case '2':

bolehTrade=cekCandle();

break;

default:

Print("Unknown Option"); break;

}

cekRSI(), cekCandle(), dan bolehTrade adalah boolean x=integer

default adalah nilai jika x tidak memenuhi semua kriteria di case (kayak else nya statement If)

2. Looping

Selain branching/percabangan, looping juga merupakan jantung dari program komputer dan EA. Looping intinya mengulang. Dengan batasan2 tertentu, seperti mengulang sebanyak X kali, atau mengulang sepanjang kondisi x terpenuhi.

Misal

"Ayo, push up 10x !"

"Push up terussssss sampai saya bilang stop"

looping di EA ini paling sering digunakan untuk manajemen order (jika ordernya lebih dari 1, misal pakai strategi grid/martingale), membaca rentetan candle (misal untuk mengecek 3 candle terakhir), dan keperluan2 lainnya

tapi seinget gw yang paling sering ya 2 itu

candle terakhir), dan keperluan2 lainnya tapi seinget gw yang paling sering ya 2 itu 2.1 For

2.1 For contoh syntax :

Code:

int j;

for(j=0; j<5; j++)

{

Print(j);

}

klo di jalankan, maka akan keluar 0,1,2,3,4 penjelasannya gini :

for (inisialisasi index ; kondisi ; increment index) for itu butuh 1 variabel untuk index, dalam hal ini, kita pake j

pertama2 j di nol kan dulu. kalau mau dimulai dari angka yang besar juga bisa

j<5 adalah kriteria dari looping tersebut, dimana itu harus terpenuhi, baru perintah yang di { } itu dijalankan.

j++ ada increment untuk j (supaya index nya naik). Kalau misalnya j dimulai dari angka besar, ke 0, maka diganti jadi j-- (tiap putaran, j nya dikurangi 1 )

contoh script simple untuk cek candle

Code:

bool allBullCandle=true;

//untuk cek 3 candle terakhir for (int a=1;a<4;a++)

{

if (iClose(Symbol(),0,a) - iOpen(Symbol(),0,a)<0) //kalau range negatif, berarti close dibawah open

{

 

allBullCandle=false;

break;

}

}

if (allBullCandle) { Print("Bull"); } else { Print ("Tidak Bull"); }

penjelasan

allBullCandle bertipe boolean dideklarasikan terlebih dahulu. lalu for, dari 1 hingga lebih kecil dari 4 (which is 3), cek harga close candle a sebelum sekarang - harga open candle a sebelum sekarang ; kalau hasilnya dibawah 0 (berarti close lebih rendah), maka variabel allBullCandle langsung diisi nilai false. break berguna untuk menghentikan looping. (kalau ude ketemu 1 candle yang tidak bullish kan otomatis jadi tidak bull, jadi looping tidak perlu dilanjutkan)

2.2 While

fungsinya sama persis dengan for, untuk mengulang bedanya, kalau kita tau persis berapa kali pengulangannya, kita bisa pake for masih ga jelas mau diulang berapa kali, maka kita pake while

tapi kalau

penggunaan while ini cukup jarang

contoh syntax nya

Code:

(jadi gw jelasin ntar'an aja ye

)
)

while(k<n)

{

y=y*x;

k++;

}

artinya, selama k lebih kecil dari n, maka jalankan 2 baris yang didalem { } nya itu

--------

gw cuman coba jelasin syntax2nya aja, sekali lagi, untuk transform dari bahasa manusia ke

bahasa programming, silakan baca2 buku algoritma & logika

programming, silakan baca2 buku algoritma & logika oya, kalau pakai looping ini ati2 ye karena ukuran
programming, silakan baca2 buku algoritma & logika oya, kalau pakai looping ini ati2 ye karena ukuran

oya, kalau pakai looping ini ati2 ye

karena ukuran log file yang jadi bergiga2

klo loop nya keliru, bisa2 space harddisk tiba2 abis

klo loop nya keliru, bisa2 space harddisk tiba2 abis lebih parah lagi kalau order berkali2 sampai

lebih parah lagi kalau order berkali2 sampai marginnya abis

Bagian 7 - Fungsi Order dan Indikator Teknikal

Fungsi Order dan Analisa Teknikal

Bagian ini membahas beberapa fungsi yang penting, yang dipakai dalam hampir setiap EA. Sebetulnya fungsi pada MQL 4 itu banyak sekali, tapi mari kita membahas 2 fungsi dasar dulu saja, yaitu fungsi order dan fungsi analisa teknikal.

1. Fungsi Order

Fungsi ini pasti ada di semua EA. Gunanya adalah untuk buka, tutup, atau ubah posisi (sebetulnya fungsinya banyak sih)

lebih lengkapnya ada di help nya MQL4, di bagian "Trading Functions"

disini kita bahas beberapa aja (sisanya bisa dibaca sendiri), kan yang penting ngerti gimana cara baca & pakainya

OrderSend() : untuk membuka order

Code:

int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)

contoh, untuk buka buy 1 lot, tanpa tp dan sl :

Code:

OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order #1",1,0,Green);

symbol itu diisi Symbol() jika mau yang diorderkan sama dengan chart dimana EA jalan kalau misalnya mau order pair tertentu, ya tulis aja "GBPUSD" atau "EURUSD" misalnya

cmd itu ada 6 : OP_BUY, OP_SELL, OP_SELLSTOP, OP_SELLLIMIT, OP_BUYLIMIT, OP_BUYSTOP

volume itu jumlah lotnya

price, kalau buy, pastikan pricenya Ask, kalau sell, pricenya Bid. Kalau ga ntar error.

slippage itu isi aja 0-5 pip, biar ga kena requote. Tapi tergantung strateginya juga, kalau TP cuman 3 pip ya otomatis slippagenya jangan besar2

stoploss = harga stoploss (bukan pips SL) takeprofit = harga takeprofitnya

comment = terserah mau diisi apa

magic = magic ini magicnumber, gunanya untuk mengidentifikasi posisi. Misalnya saja, EA hanya di program untuk memanage order dengan magic number tertentu, 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

cuman keterangan aja untuk user

fungsi OrderSend() ini akan mengembalikan nilai -1 kalau ordernya gagal, klo ordernya

berhasil, maka akan mengembalikan nomor ordernya untuk mengetahui gagal ordernya karena apa, bisa pake fungsi getLastError()

contohnya begini :

Code:

int ticket;

if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25)

{

ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point,"My

order #2",16384,0,Green);

if(ticket<0)

{

 

Print("OrderSend failed with error #",GetLastError());

return(0);

}

}

nomor kode error nya bisa diliat di help nya, di MQL4 Reference -> Standard constants -> Error codes

nah, setelah order dibuka, order juga bisa di modify (diubah SL/TP nya) dengan fungsi OrderModify()

Code:

bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)

OrderModify() ini akan bernilai true jika modifikasinya berhasil, dan false jika modifikasinya gagal

contoh :

Code:

if(TrailingStop>0)

{

OrderSelect(12345,SELECT_BY_TICKET);

if(Bid-OrderOpenPrice()>Point*TrailingStop)

{

if(OrderStopLoss()<Bid-Point*TrailingStop)

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-

Point*TrailingStop,OrderTakeProfit(),0,Blue);

return(0);

}

}

}

oya, ada 1 function lagi yang penting, yaitu OrderSelect() OrderSelect() ini gunanya untuk memilih order yang akan dimodifikasi/diclose

Code:

bool OrderSelect( int index, int select, int pool=MODE_TRADES)

OrderSelect() ini bisa digunakan untuk memilih (men-select - bahasa indo yang tepat apa ya? ) order baik yang sudah tertutup, lagi terbuka, atau masih pending (limit/stop order)

index = adalah index order (0,1,2,3,dst) pada mode SELECT_BY_POS ; atau nomor ticket pada mode SELECT_BY_TICKET select = ya itu tipe select nya, bisa SELECT_BY_POS (memilih berdasarkan posisi, kalau ga tau nomor ticketnya, pakai yang ini), atau SELECT_BY_TICKET (kalau uda tau nomor ticketnya pake yang ini)

pool = MODE_TRADES itu untuk milih order yang aktif (limit/stop order/order yang masih kebuka), MODE_HISTORY untuk memilih order yang udah ditutup/dihapus.

contoh :

Code:

if(OrderSelect(12470, SELECT_BY_TICKET)==true)

{

Print("order #12470 open price is ", OrderOpenPrice()); Print("order #12470 close price is ", OrderClosePrice());

}

else Print("OrderSelect returned the error of ",GetLastError());

oya, setelah di-select, kita bisa pakai fungsi2 untuk mengetahui informasi mengenai order tersebut, seperti jumlah lot, SL, TP, Symbol, dll

fungsi2nya antara laen :

OrderLots() = mengetahui jumlah lot OrderTakeProfit() = mengetahui TP OrderStopLoss() = mengetahui SL OrderSymbol() = mengetahui pair nya

lengkapnya

langsung aje cek di MQL4 Reference -> Trading functions ; kalau kurang jelas

tentang cara pakainya, bisa di post di topic ini

------

ok, order udah bisa di modify, bisa di select, sekarang saatnya untuk menutup order atau menghapus pending order yang tidak jadi

untuk menutup posisi yang kebuka, pakai OrderClose() (atau OrderCloseBy() kalau hedging)

untuk menghapus pending order, pakai OrderDelete()

Code:

bool OrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE)

ticket = nomor ticket lots = jumlah lot yang ditutup

price = kalau mau nutup sell, pakai harga Ask, kalau mau nutup buy, ketik Bid slippage = isi 0-5 sesuai keinginan color = warna tanda di chartnya

kalau misalnya mau ditutup semua ya isi aja OrderLots()

sama seperti OrderModify(), OrderClose() ini akan bernilai True kalau berhasil nutup, dan bernilai false kalau gagal nutup posisi

untuk OrderDelete(), jauh lebih simple dari OrderClose()

Code:

bool OrderDelete( int ticket, color Color=CLR_NONE)

contoh :

Code:

if(Ask>var1)

{

 

OrderDelete(order_ticket);

return(0);

}

4 fungsi tadi adalah fungsi2 dasar untuk trade

untuk membaca nilai dari indikator teknikal seperti Moving Average, MACD, dll

nah selanjutnya, kita akan bahas fungsi2

setelah pembahasan fungsi indikator teknikal ini, harusnya sudah bisa bikin EA yang

sederhana (untuk latihan

)
)

2. Fungsi Indikator Teknikal

Di help mql4, bisa di cek di MQL4 Reference - Technical indicators

This image has been resized. Click this bar to view the full image. The original
This image has been resized. Click this bar to view the full image. The original image is sized 1150x700 and
weights 53KB.

gw kasih contoh moving average aja

functionnya iMA()

Code:

double iMA( string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)

misalnya sesuai gambar diatas, rulenya kalau close candle sebelomnya diatas EMA 144, gw buka buy

Code:

//pertama musti siapin variabel double ma1=0;

ma1=iMA(Symbol(),0,144,0,MODE_EMA,PRICE_CLOSE,1);

if (iClose(Symbol(),0,1)>ma1)

{

//open buy

}

untuk ma_method, itu ada 4 (bisa di klik sih di help nya), ada MODE_SMA, MODE_EMA, MODE_SMMA, MODE_LWMA untuk applied_price, itu ada 7, klik aja di link helpnya untuk detailnya (daripada gw tulis lagi )

contoh laen, strategi paling populer sepanjang masa, MA cross

laen, strategi paling populer sepanjang masa, MA cross kalau EMA 10 motong EMA 20 dari atas,

kalau EMA 10 motong EMA 20 dari atas, open sell

klo diterjemahin ke perintah2 komputer, 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, dan EMA 10 lebih rendah dari EMA 20 pada candle 1, berarti terjadi cross

ya tinggal di coding aje

Code:

double ma10_1, ma20_1, ma10_2, ma20_2=0;

//1) cek EMA 10 dan 20 pada candle 2 sebelom sekarang

ma10_2=iMA(Symbol(),0,144,0,MODE_EMA,PRICE_CLOSE,2);

ma20_2=iMA(Symbol(),0,144,0,MODE_EMA,PRICE_CLOSE,2);

//2) cek EMA 10 dan 20 pada candle 1 sebelom sekarang

ma10_1=iMA(Symbol(),0,144,0,MODE_EMA,PRICE_CLOSE,1);

ma20_1=iMA(Symbol(),0,144,0,MODE_EMA,PRICE_CLOSE,1);

//3) klo EMA 10 lebih tinggi dari EMA 20 pada candle 2, dan EMA 10 lebih rendah dari EMA 20 pada candle 1, berarti terjadi cross

if ( ma10_2 > ma20_2 && ma10_1 < ma20_1 )

{

//open sell

}

kurang canggih

Code:

mau dikasih filter RSI buat detek overbought (supaya lebih klop)

double ma10_1, ma20_1, ma10_2, ma20_2=0; double rsi1=0;

//1) cek EMA 10 dan 20 pada candle 2 sebelom sekarang

ma10_2=iMA(Symbol(),0,144,0,MODE_EMA,PRICE_CLOSE,2);

ma20_2=iMA(Symbol(),0,144,0,MODE_EMA,PRICE_CLOSE,2);

//2) cek EMA 10 dan 20 pada candle 1 sebelom sekarang

ma10_1=iMA(Symbol(),0,144,0,MODE_EMA,PRICE_CLOSE,1);

ma20_1=iMA(Symbol(),0,144,0,MODE_EMA,PRICE_CLOSE,1);

rsi1=iRSI(Symbol(),0,14,PRICE_CLOSE,1);

//3) klo EMA 10 lebih tinggi dari EMA 20 pada candle 2, dan EMA 10 lebih rendah dari EMA 20 pada candle 1, berarti terjadi cross

if ( ma10_2 > ma20_2 && ma10_1 < ma20_1 && rsi1 > 70 )

{

//open sell

}

gampang kan

&& rsi1 > 70 ) { //open sell } gampang kan untuk indikator2 laen seperti macd,

untuk indikator2 laen seperti macd, par-sar, sto, envelope, dll bisa dibaca sendiri di referencenya

bahasan selanjutnya adalah membuat EA sederhana yang komplit (bisa dicompile & bisa

jalan) (tapi ga tau profitable atau ga

)

Bagian 8 - Menyusun EA

gw kasih X karena gw masih blom tau nomer berapa

8 ) karena sebelum bab ini, ada 3-4 bagian lagi yang membahas operasi, loop & decision, dan

function, dan

(sekarang ude dikasih nomer, nomor

belum inget

function, dan (sekarang ude dikasih nomer, nomor belum inget ok, pada dasarnya, sebuah EA yang sederhana/standard

ok, pada dasarnya, sebuah EA yang sederhana/standard (bukan EA yang kompleks seperti neural network, atau yang misalnya terdiri dari beberapa modul yang mengontrol trade

sendiri2)

tersendiri, agar coding terlihat rapi, sekaligus mempermudah debugging

terdiri atas beberapa bagian/struktur

bagian ini biasanya dibikinkan fungsi

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, karena dapat menggunakan TP/SL sebagai closingnya) 4) CloseSellSignal : sama seperti CloseBuySignal

5) MoneyManagement : buat itung lotsize secara otomatis 6) Trail : buat trailling posisi, klo misalnya diperlukan

7) Confirmator : kalau misalnya EA cuman trade hari senin-kamis, maka biasanya ditaruh di bagian ini

Klo 7 bagian itu sudah ketemu, bikin EA nya jadi lebih gampang

misalnya begini, gw mau bikin EA yang kayak di Bagian 2 - Contoh EA

Quote:

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. 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 candle sebelumnya 3) ga ada 4) ga ada

5) Lotnya otomatis diitung berdasarkan SL dan persen risiko. 6) Ga pake trail, jadi ga ada 7) Posis baru dibuka kalau sedang tidak ada posisi, dan juga tidak trade di hari Jumat (gw tambahi rulenya)

kira2 source code nya jadi begini

Code:

//+------------------------------------------------------------------+

//|

ContohEA3.mq4 |

//|

Copyright © 2008, Forexindo |

//|

http://www.forexindo.com |

//+------------------------------------------------------------------+ #property copyright "Copyright © 2008, Forexindo"

#property link

"http://www.forexindo.com"

extern double RiskPercent=5; 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 (bolehTrade()) //kalau boleh trade

{

if (BuySignal() ) //kalau ada signal buy

{

OrderSend(Symbol(),OP_BUY,itungLot(),Ask,Slippage,Ask-

StopLoss*Point,Ask+TakeProfit*Point,txComment,MagicNumber);

}

else if (SellSignal() ) //kalau ada signal sell

{

OrderSend(Symbol(),OP_SELL,itungLot(),Bid,Slippage,Bid+StopLoss*Point,Bid-

TakeProfit*Point,txComment,MagicNumber);

}

}

//----

return(0);

}

//+------------------------------------------------------------------+

bool BuySignal()

{

//kalau harga close candle sebelumnya lebih besar/diatas EMA 10 pada

candle sebelumnya if (iClose(Symbol(),0,1) > iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE,1) )

{

return(true);

}

else

{

return(false);

}

}

bool SellSignal()

{

//kalau harga close candle sebelumnya lebih kecil/dibawah EMA 10 pada candle sebelumnya

if (iClose(Symbol(),0,1) < iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE,1) )

{

return(true);

}

else

{

return(false);

}

}

bool bolehTrade()

{

//kalau jumat, EA ga trade ; atau kalau ada order terbuka, EA juga ga trade if (DayOfWeek()==5 || OrdersTotal()>0) { return (false); } else { return(true); }

}

double itungLot()

{

//ini untuk itung lot secara otomatis berdasarkan SL dan persen risk double xLots=0; xLots=NormalizeDouble(AccountBalance()*RiskPercent/100 /StopLoss / 10,1); return (xLots);

}

logikanya jadi rapi dan jelas

oya, sekilas mengenai operator || berarti atau

&& berarti dan (nanti akan dijelaskan di bagian tentang operator)

EA ini kelihatannya simple sekali di backtest, profitable lho codingnya paling butuh 5-10 menit doank

EA ini kelihatannya simple sekali

di backtest, profitable lho

codingnya paling butuh 5-10 menit doank

profitable lho codingnya paling butuh 5-10 menit doank (terlepas dari dradownnya yang gede) tapi kalau This

(terlepas dari dradownnya yang gede)

tapi kalau

This image has been resized. Click this bar to view the full image. The original
This image has been resized. Click this bar to view the full image. The original image is sized 862x654 and
weights 37KB.
Click this bar to view the full image. The original image is sized 862x654 and weights

padahal iseng bikinnya

Click this bar to view the full image. The original image is sized 862x654 and weights
Click this bar to view the full image. The original image is sized 862x654 and weights

Bagian 9 - Implementasi Custom Indikator

iCustom

Jika anda memiliki indikator sendiri, dan ingin membuat EA berdasarkan indikator tersebut, maka ada 2 solusi yang bisa dipakai.

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)

fungsi lengkapnya :

Code:

double iCustom( string symbol, int timeframe, string name, shift)

, int mode, int

ok, sebagai contoh, gw punya indikator range1 (gw attach ex4 nya). indikator ini menampilkan bar range seperti ini :

ex4 nya). indikator ini menampilkan bar range seperti ini : nah, gw mau mengimplementasikan nilai dari

nah, gw mau mengimplementasikan nilai dari indikator ini (range=absolute(high-low)) ke EA gw.

kita pake aja contoh EA yang di bagian 8.

Quote:

tambahi rulenya)

gw tambahi jadi

Quote:

7) Posisi baru dibuka kalau sedang tidak ada posisi, dan juga tidak trade di hari Jumat, dan range candle jam sekarang dan jam sebelumnya tidak boleh lebih dari 100 pip.

nah, gimana caranya untuk mendapatkan nilai dari iCustom

contoh sekarang, custom indikatornya bernama range1.ex4 (ada di folder expert/indicator)

maka, syntaxnya begini :

[code] double range0, range1=0; range0=iCustom(Symbol(),0,"range1",0,0); //range pada candle jam sekarang range1=iCustom(Symbol(),0,"range1",0,1); //range pada candle jam sebelom sekarang [code]

sedangkan di EA nya, asalnya :

Code:

bool bolehTrade()

{

//kalau jumat, EA ga trade ; atau kalau ada order terbuka, EA juga ga trade if (DayOfWeek()==5 || OrdersTotal()>0) { return (false); } else { return(true); }

}

ditambahi jadi begini

Code:

bool bolehTrade()

{

//kalau jumat, EA ga trade ; atau kalau ada order terbuka, EA juga ga trade //klo range diatas 100 untuk candle sekarang dan sebelomnya, juga ga trade range0=iCustom(Symbol(),0,"range1",0,0); //range pada candle jam sekarang range1=iCustom(Symbol(),0,"range1",0,1); //range pada candle jam sebelom sekarang if (DayOfWeek()==5 || OrdersTotal()>0 || range0>100 || range1>100 ) { return (false); } else { return(true); }

}

gampang kan

) { return (false); } else { return(true); } } gampang kan pada iCustom : Symbol()

pada iCustom :

Symbol() = symbol dimana ea dipasang 0 = timeframe dimana ea dipasang (kalau mau fix 30 menit, ya isi aja PERIOD_M30) range1 = nama ex4 custom indikatornya (range1.ex4)

0 = mode 0,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)

kebetulan indikator range1 tadi cuman 1 kluaran outputnya, jadi ya pilih mode 0

This image has been resized. Click this bar to view the full image. The original
This image has been resized. Click this bar to view the full image. The original image is sized 696x363 and
weights 11KB.

contoh indikator yang kasih keluaran 6 output : (gw ambil dari indikator member di bagian

8)

This image has been resized. Click this bar to view the full image. The original
This image has been resized. Click this bar to view the full image. The original image is sized 696x363 and
weights 12KB.
maka klo mo ambil nilai DownTrendLine misalnya, ya mode nya diisi 5 Code: iCustom(Symbol(),0,"namaindi",

maka klo mo ambil nilai DownTrendLine misalnya, ya mode nya diisi 5

Code:

iCustom(Symbol(),0,"namaindi",

(inputan)

,5,0)

nah, kebetulan juga indikator range1 tadi tidak ada inputan, bagaimana klo indikatornya ada inputan, seperti yang di bagian 8 (Bagian 8 - Menyusun EA)

This image has been resized. Click this bar to view the full image. The original
This image has been resized. Click this bar to view the full image. The original image is sized 1200x800 and
weights 87KB.
nah paramater2 inputannya ditaruh seperti itu (garis2 biru) (moga2 ngerti klo liat gambarnya) terus mode

nah

paramater2 inputannya ditaruh seperti itu (garis2 biru) (moga2 ngerti klo liat gambarnya)

terus mode yang gw maksud itu untuk mendapatkan nilai yang gw kasih garis ijo

jadi begitu

untuk mendapatkan nilai yang gw kasih garis ijo jadi begitu iCustom ini cukup luas penerapannya tapi

iCustom ini cukup luas penerapannya

tapi basicnya ya seperti contoh2 diatas

klo ada pertanyaan silakan di post

Bagian 10 - Money Management

pada tutorial kali ini saya akan coba menambahkan money management pada sebuah ea. ea yang akan diutak-atik adalah ea standard metatrader yaitu "MACD Sample". saya akan mencoba supaya setiap ordernya hanya menggunakan 1% dari balance. jadi kalau total ordernya ada 5 bersamaan berarti margin yang terpakai cuma 5%.

"misalnya balance kita 10.000 maka 1% nya berarti 100 usd. nah di sini kita akan menghitung 100 usd itu berapa lot."

supaya settingan persen nya bisa diubah sesuai keinginan, maka pertama kita tambahkan extern input seperti ini:

Code:

extern int Risk=1; // dalam percent extern double lotDigit=1; //berapa decimal lot yang diijinkan. kalau fxopen 1 digit.

untuk menghitung persentase margin, kita juga harus mengetahui berapa margin yang dibutuhkan untuk order 1 lot, untuk itu akan kita definisikan seperti ini:

Code:

double margin=MarketInfo(Symbol(), MODE_MARGINREQUIRED) ;

nah sekarang kita masuk dalam code MM nya, yaitu menghitung berapa lot untuk order 1 persen dari balance.

Code:

double LotSize()

{

double lot=0; lot=NormalizeDouble((AccountBalance()*Risk/100)/margin, lotDigit) ; // di sini kita sudah mendapatkan nilai lotnya if (lot>MarketInfo(Symbol(),MODE_MAXLOT)) { lot=MarketInfo(Symbol(),MODE_MAXLOT); } // di sini di filter supaya jika lotnya lebih besar dari batas maximum lot yang ditentukan broker, maka lotnya diubah sesuai batas maximum lot if (lot<MarketInfo(Symbol(),MODE_MINLOT)) { lot=MarketInfo(Symbol(),MODE_MINLOT); } // di sini juga di filter supaya jika lotnya lebih kecil dari batas minimum yang sudah ditentukan oleh broker, maka lotnya diubah sesuai batas minimum tersebut return (lot);

}

selanjutnya tinggal mengaplikasikan kode2 di atas ke dalam EA MACD Sample. semua perintah ordersend dalam ea tersebut, bagian lotnya diubah jadi LotSize() untuk memanggil fungsi MoneyManagement yang sudah kita buat di atas contoh yang ini

Code:

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd

sample",16384,0,Green);

diubah jadi

Code:

ticket=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,0,Ask+TakeProfit*Point,"macd

sample",16384,0,Green);

Money Management dengan risk dari Stop loss

jika di atas kita menerapkan Money Management dari balance, di sini kita akan mencoba menghitung Money Management dari StopLoss. misalnya kita memberikan risk 5% dari balance, maka jika order tersebut kena stop loss hanya menghabiskan 5% dari balance kita.

formula yang digunakan seperti ini

Code:

Lot=(balance*risk/100)/(stop loss * nilai per point)

sekarang kita akan coba menerapkannya di EA "MACD Sample" pertama kita tambahkan dulu extern input seperti ini

Code:

extern int Risk=5; // dalam percent extern int StopLoss=100;

lalu buat code money managementnya

Code:

double LotSize()

{

double lot=0;

lot=NormalizeDouble((AccountBalance()*Risk/100)/(StopLoss*(MarketInfo(Symbol(

),MODE_TICKVALUE)*100000/MarketInfo(Symbol(),MODE_LOTSIZE))),2); // di sini kita sudah mendapatkan nilai lotnya if (lot>MarketInfo(Symbol(),MODE_MAXLOT)) { lot=MarketInfo(Symbol(),MODE_MAXLOT); } // di sini di filter supaya jika lotnya lebih besar dari batas maximum lot yang ditentukan broker, maka lotnya diubah sesuai batas maximum lot if (lot<MarketInfo(Symbol(),MODE_MINLOT)) { lot=MarketInfo(Symbol(),MODE_MINLOT); } // di sini juga di filter supaya jika lotnya lebih kecil dari batas minimum yang sudah ditentukan oleh broker, maka lotnya diubah sesuai batas minimum tersebut return (lot);

}

ket:(MarketInfo(Symbol(),MODE_TICKVALUE)*100000/MarketInfo(Symbol(),MODE_LOTSIZ

E)) adalah kode untuk mendapatkan nilai profit per point untuk 1 lot.

berikutnya tinggal menambahkan code-code di atas ke dalam EA MACD Sample. perlu diperhatikan untuk mengubah semua fungsi order send dalam EA tersebut untuk menggunakan LotSize() dan StopLoss. contoh:

Code:

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd

sample",16384,0,Green);

menjadi

Code:

ticket=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,Ask-

StopLoss*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);

bagaimana cukup mudah kan

silahkan kalau ingin aplikasikan kode MM tersebut ke EA anda

sample",16384,0,Green); bagaimana cukup mudah kan silahkan kalau ingin aplikasikan kode MM tersebut ke EA anda
sample",16384,0,Green); bagaimana cukup mudah kan silahkan kalau ingin aplikasikan kode MM tersebut ke EA anda