47 1 681KB
Bài 1. Giới thiệu ngôn ngữ lập trình MQL4, ứng dụng trong giao dịch MT4 Ngày nay, máy tính đã trở thành không thể thiếu cho tất cả mọi người. Sự phát triển nhanh chóng của Internet và hiệu suất của máy tính hiện đại đã mở ra triển vọng mới trong nhiều lĩnh vực hoạt động của con người.
Mười năm trước, thị trường tài chính chỉ dành cho các ngân hàng và cho một cộng đồng hạn chế của các chuyên gia tài chính trên thế giới. Ngày nay, bất cứ ai cũng có thể tham gia vào thế giới của các trader chuyên nghiệp và bắt đầu kinh doanh độc lập bất cứ lúc nào. Hàng trăm ngàn trader trên toàn thế giới đã đánh giá cao MetaTrader 4 Client Terminal trên giá trị & và việc sử dụng ngôn ngữ lập trình nhúng của nó. MQL4 đưa các trader lên 1 cấp độ mới về kinh doanh Để giao dịch tự động Bây giờ, một trader có thể thực hiện ý tưởng của mình như là một chương trình ứng dụng - viết một chỉ số tùy chỉnh, một kịch bản để thực hiện các hoạt động duy nhất, hoặc tạo ra một cố vấn chuyên gia - một hệ thống giao dịch tự động (kinh doanh robot) mà không cần sự can thiệp của con người. Thực tế này đã được chứng minh bởi các giải thi đấu giao dịch tự động vô địch hàng năm, trong đó hàng trăm hệ thống giao dịch tự động thi đấu liên tục trong 3 tháng đến 1 năm. Phát triển các ứng dụng cho MetaTrader 4 Client Terminal đòi hỏi kiến thức về MQL4. Ngôn ngữ lập trình MQL4 ( Ngôn ngữ MetaQuotes 4) là một ngôn ngữ thế hệ thứ tư. MQL4 là ngôn ngữ lập trình đầu tiên trên thị trường tài chính. Tài liệu về ngôn ngữ có sẵn trên trang web của công ty, ngoài ra rất nhiều thông tin do cộng đồng MQL4 phát triển. Bạn có thể liên hệ với các trader khác, hãy đọc bài viết & các mã nguồn chương trình MQL4 của họ. Với giáo trình này chúng tôi sẽ từng bước giúp bạn thiết kế riêng các EA (chuyên gia cố vấn - Robot), Script (các kịch bản) và Indicators (các chỉ số) theo các ý tưởng & chiến lược giao dịch của bạn.
Bài 2. Ghi chú trong MQL4 Ghi chú là phần rất quan trọng trong lập trình.
Đối với các lập trình viên chuyên nghiệp thì phần ghi chú là không thể thiếu. Do code 1 phần mềm lớn thường chứa rất nhiều các đoạn code nhỏ. Mổi đoạn, mổi hàm thực hiện 1 nhiệm vụ. Ghi chú giúp gợi nhớ về nội dung code, ngoài ra rất hữu ích trong việc gỡ lỗi (debug) khi chạy chương trình. Ghi chú theo hàng có dạng // Ghi chú nhiều hàng: Mở đầu ghi chú /* và kết thức ghi chú */
Bài 3. Các biến và hằng trong MQL4
Biến số (số biến đổi) và hằng số (số không đổi) là 2 thành phần không thể thiếu trong bất cứ ngôn ngữ lập trình nào. Trong hình trên thì A, B là biến số Kết thúc câu lệnh dấu chấm phẩy ;
Bài 4. Các kiểu dữ liệu trong MQL4
1. int (kiểu số nguyên)
2. Kiểu thập phân
3. Kiểu logic: chỉ có 1 giá trị True(đúng hoặc 1) & false (sai hoặc 0) lưu ý không phân biệt chữ Hoa / thường bool aa = True; // Boolean variable аа has the value of true bool B17 = TRUE; // Boolean variable B17 has the value of true bool Hamma = 1; // Boolean variable Hamma has the value of true bool Asd = False; // Boolean variable Asd has the value of false bool Nol = FALSE; // Boolean variable Nol has the value of false bool Prim = 0; // Boolean variable Prim has the value of false
4. Kiểu chuỗi ký tự: khai bao trong ngoặc kép " " kết thúc câu lệnh luôn là dấu chấm phẩy ;
5. Kiểu màu: dưới dạng RGB hoặc tên
6. Kiểu thời gian:
Bài 5. Tìm hiểu cấu trúc câu lệnh trong MQL4 Đây là ví dụ 1 câu lệnh trong MQL4 Y = 5; // cho giá trị Y = 5 X = Y - 2; // Giá trị X = 3 Day_Next= TimeDayOfWeek(Mas_Big[n][0]+60); // 1 câu lệnh 1 dòng Go_My_Function_ind(); // 1 câu lệnh 1 dòng a=3; b = a * x + n; i++; // Nhiều câu lệnh 1 dòng Print(" Day= ",TimeDay(Mas_Big[s][0]), // các dòng sau vẩn trong lệnh print " Hour=",TimeHour(Mas_Big[s][0]), " Minute=",TimeMinute(Mas_Big[s][0]), " Mas_Big[s][0]= ",Mas_Big[s][0], " Mas_Big[s][1]= ",Mas_Big[s][1]);
Tăng giá trị cho biến X X = X + 1; // Example of a counter
Bài 6. Định nghĩa hàm trong MQL5 Hàm đầy đủ như sau //----------------------------------------------------------------------int Gipo(int a, int b) // User-defined function { int c2 = a*a + b*b; // Sum of the squares of catheti int c = MathSqrt(c2); // Hypotenuse return(c); // Function exit operator } //-----------------------------------------------------------------------
Giải thích //----------------------------------------------------------------------int Gipo(int a, int b) // int: khai báo hàm kiểu số nguyên // Gipo là tên hàm phân biệt chữ HOA và chữ thường // a,b là 2 biến của hàm Gipo kiểu số nguyên // kết thúc tên hàm không có dấu chấm phẩy { int c2 = a*a + b*b; // c2 là tổng bình phương a & b int c = MathSqrt(c2); // Căn bậc 2 của c2 // kết thúc 1 dòng lệnh luôn có chấm phẩy return(c); // trả về kết quả của hàm } //-----------------------------------------------------------------------
Bài 7. Các loại chương trình trong ngôn ngữ MQL4 Trước khi bắt đầu lập trình bạn phải biết được là mình sẽ viết code MQL4 theo hướng nào EA (Robot), Script (Kịch bản) hay Indicator (Công cụ)
Expert Advisor (EA) - Robot là 1 chương trình chạy trên máy tính cá nhân chủ yếu liên quan đến kiểm soát các giao dich của trader Script (kịch bản) là chương trình chỉ thực hiện các lệnh nào đó 1 lần Indicator (Công cụ chỉ báo) Ứng dụng chủ yếu trong phân tích kỹ thuật để thể hiện tình trạng của thị trường theo thời gian thực và theo những yêu cầu cụ thể của người lập trình.
Đặc điểm
EA
Script
Thời gian hoạt động
Dài
Thực hiện giao dịch
Cho phép Cho phép Không
Hiển thì các dòng
Không
Không
Có
Cho phép liên tục sử dụng nhiều chương trình 1 lúc
Không
Không
Có
Cho phép thực hiện các câu lệnh gọi nội bộ trong chương trình Không
Không
Không
Bài 8. Metaeditor – Trình biên soạn code MQL4
MetaEditor
1 lần
Indicator Dài
MetaEditor là 1 trình biên soạn ngôn ngữ MQL4 nhằm thực hiện việc chỉnh sửa, viết, biên tập code MQL4. Với giao diện thân thiện người dùng, chúng ta hoàn toàn có thể viết các chương trình giao dịch chuyên nghiệp như các chuyên gia trên thế giới. MetaEditor thực hiện 2 nhiệm vụ sau: • File hệ thống MetaEditor lưu trữ mã nguồn của MQL4 (Robot, Script, Indicator) vào ổ cứng sau đó thực thi chúng • Tạo và sử dụng các chương trình Rất dễ để tạo các chương trình trong các công cụ xây dựng sẵn của MQL4. Bạn có thể thay đổi Script, Indicator, hoặc Robot (EA). Code được tạo ra sẽ tự động lưu trữ trong máy tính.
Bài 9. Sử dụng Metaeditor cơ bản
Sử dụng chương trình cơ bản
Tạo mới file
Click OK để tiếp tục. Chương trình & code sẽ xuất hiện như sau
//+------------------------------------------------------------------+ //| create.mq4 | //| John Smith | //| www.company.com | //+------------------------------------------------------------------+ #property copyright "John Smith" #property link "www.company.com" //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---//--- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //----
//--- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---//--- return(0); } //+------------------------------------------------------------------+
Phải bấm biên dịch
để xuất ra file chạy chương trình (file *.ex4). Thông tin file sẽ xuất hiện ở cửa
sổ Navigator Một đoạn code ví dụ. Bạn hãy copy và chạy thử trong MetaEditor4 //-------------------------------------------------------------------// create.mq4 // To be used as an example in MQL4 book. //-------------------------------------------------------------------int Count=0; // Global variable //-------------------------------------------------------------------int init() // Spec. funct. init() { Alert ("Funct. init() triggered at start"); // Alert return; // Exit init() } //-------------------------------------------------------------------int start() // Spec. funct. start() { double Price = Bid; // Local variable Count++; // Ticks counter Alert("New tick ",Count," Price = ",Price);// Alert return; // Exit start() } //-------------------------------------------------------------------int deinit() // Spec. funct. deinit() { Alert ("Funct. deinit() triggered at exit"); // Alert
return; // Exit deinit() } //--------------------------------------------------------------------
Bài 10. Cấu trúc chương trình MQL4
Cấu trúc của chương trình MQL4 gồm các thành phần:
1. 2. 3. 4.
Các khối lớn nhất trong MQL4 Head part: phần đầu chương trình chủ yếu chứa các thông tin tổng quát về chương trình Special function init(): Hàm đặc biệt khởi động chương trình. Sẽ học chi tiết các phần sau Special function start(): Hàm đặc biệt khởi động chương trình Special function deinit(): Hàm đặc biệt khởi động chương trình
5.
User-defined functions: Hàm do người dùng tự định nghĩa Vị trí chuẩn của các hàm
Các hàm vẩn có thể thay đổi vị trí với nhau
Trong MQL4 không cho phép cấu trúc hàm lồng trong hàm. Khi biên dịch sẽ xảy ra lỗi
Bài 11. Một ví dụ cấu trúc EA (Robot) trong MQL4
Bạn copy & chạy thử trong MetaEditor //-------------------------------------------------------------------// simple.mq4
// To be used as an example in MQL4 book. //-------------------------------------------------------------------int Count=0; // Global variable //-------------------------------------------------------------------int init() // Spec. funct. init() { Alert ("Function init() triggered at start"); // Alert return; // Exit init() } //-------------------------------------------------------------------int start() // Spec. funct. start() { double Price = Bid; // Local variable Count++; // Tick counter Alert("New tick ",Count," Price = ",Price);// Alert return; // Exit start() } //-------------------------------------------------------------------int deinit() // Spec. funct. deinit() { Alert ("Function deinit() triggered at deinitialization"); // Alert return; // Exit deinit() } //--------------------------------------------------------------------
Giải thích 1. Phần đầu: chỉ bao gồm 1 dòng lệnh int Count=0; // Biến Count toàn cục, giá trị là 0
2. Phần thân: gồm 2 câu lệnh int init() // Spec. funct. init() { Alert ("Function init() triggered at start"); // Xuất thông báo chương trình bắt đầu Function init() triggered at start return; // Exit init() }
3. Thực thi trên máy tính cá nhân: int start() // Special funct. start() { double Price = Bid; // Price là biến số, kiểu số thập phân Count++; // Tăng biến số Count lên 1 đơn vị // Chuỗi ký tự để trong dấu ngoặc kép
// New tick là ký tự để xuất ra màn hình, không phải là biến // Price =
là ký tự để xuất ra màn hình, không phải là biến
// Mổi lần khi MT4 có 1 bar mới thì sẽ xuất hiện thông báo về giá Bid của bar đó Alert("New tick ",Count," Price = ",Price);// Xuất thông báo return; // Exit start() }
4. Phần deinit(): int deinit() // Special funct. deinit() { Alert ("Function deinit() triggered at exit"); // Xuất dòng : Function deinit() triggered at exit ra màn hình return; // Exit deinit() }
Kết quả hiển thị ra màn hình
Bài 12. Ví dụ cấu trúc EA đúng và sai.
Cấu trúc đúng //-------------------------------------------------------------------// possible.mq4 // To be used as an example in MQL4 book. //-------------------------------------------------------------------int Count=0; // Global variable //-------------------------------------------------------------------int start() // Special funct. start() { double Price = Bid; // Local variable Count++; Alert("New tick ",Count," Price = ",Price);// Alert return; // exit start() } //-------------------------------------------------------------------int init() // Special funct. init() { Alert ("Function init() triggered at start");// Alert return; // Exit init() } //-------------------------------------------------------------------int deinit() // Special funct. deinit() { Alert ("Function deinit() triggered at exit");// Alert return; // Exit deinit() } //--------------------------------------------------------------------
Cấu trúc sai //-------------------------------------------------------------------// incorrect.mq4 // To be used as an example in MQL4 book. //-------------------------------------------------------------------int start() // Special funct. start() { double Price = Bid; // Local variable Count++; Alert ("New tick ",Count," Price = ",Price);// Alert return; // Exit start() } //-------------------------------------------------------------------int Count=0; // Global variable //-------------------------------------------------------------------int init() // Special funct. init()
{ Alert ("Function init() triggered at start");// Alert return; // Exit init() } //-------------------------------------------------------------------int deinit() // Special funct. deinit() { Alert ("Function deinit() triggered at exit");// Alert return; // Exit deinit() } //--------------------------------------------------------------------
Do chưa khai báo biến Count mà đã thực thi câu lệnh Count++. Các biến mới không phải biến mặc định của MQL4 phải khai báo ở trên cùng của chương trình. int Count=0; // Global variable
Kết quả chương trình thông báo lỗi :
Bài 13. Khai báo biến và gán giá trị cho biến
Ví dụ khai báo biến int In = 3;
// The constant value is assigned to variable In
double Do = 2.0;
// The constant value is assigned to variable Do
bool Bo = true;
// The constant value is assigned to variable Bo
color Co = 0x008000;
// The constant value is assigned to variable Co
string St = "sss";
// The constant value is assigned to variable St
datetime Da= D'01.01.2004';// The constant value is assigned to variable Da
Biến chỉ khai báo 1 lần, sẽ báo lỗi nếu khai báo 2 lần cho 1 biến int In; int In = In_2;
// Declaration of the type of variable In // The repeated declaration (In) is not allowed
In = 7;
// The constant value is assigned to variable In
Do = 23.5;
// The constant value is assigned to variable Do
Bo = 0;
// The constant value is assigned to variable Bo
Giá trị của biến có thể là 1 hàm do người dùng định nghĩa In = My_Function();
// My_Function() là hàm do người dùng định nghĩa
Do = Gipo(Do1,Do1);
// Gipo là hàm do người dùng định nghĩa
Bo = IsConnected();
// The value of standard function is assigned to variable Bo
St = ObjectName(0);
// The value of standard function is assigned to variable St
Da = TimeCurrent();
// The value of standard function is assigned to variable Da
Bài 14. Hàm If Else trong MQL4
Cấu trúc lệnh có điều kiện if... else if ( Condition ) { Block 1 of operators composing body 1 }else { Block 2 of operators composing body 2 }
// Header of the operator and condition // If the condition is true, then.. //..the operators composing body 1 are executed // If the condition is false.. // ..then the operators.. // ..of body 2 are executed
1. Thực hiện khối lệnh 1 (Block 1) theo điều kiện (Condition) if ( Condition ) // Header of the operator and condition { Block 1 of operators // If the condition is true, then.. composing body 1 //..the operators composing body 1 are executed }else // If the condition is false.. { Block 2 of operators // ..then the operators.. composing body 2 // ..of body 2 are executed } 2. Thực hiện khối lệnh 2: Nếu điều kiện (Condition) không đúng thực hiện khối lệnh còn lại (Block 2): // If the condition is false.. { Block 2 of operators // ..then the operators..
composing body 2 }
// ..of body 2 are executed
Bài 15. Ví dụ 1 hàm If Else thực thi lệnh có điều kiện trong MQL4
Ví dụ 1 hướng dẩn cách sử dụng hàm if else đơn giản //--------------------------------------------------------------------------------------// onelevel.mq4 // The code should be used for educational purpose only. //--------------------------------------------------------------------------------------int start()
// Special function 'start'
{ double Level,
// Alert level
Price;
// Current price
Level=1.2753;
// Set the level
Price=Bid;
// Request price
//--------------------------------------------------------------------------------------if (Price>Level)
// Operator 'if' with a condition
{ Alert("The price has exceeded the preset level");// Message to the trader } //--------------------------------------------------------------------------------------return;
// Exit start()
} //---------------------------------------------------------------------------------------
Xuất hiện thông báo khi giá (Bid) lớn hơn Level=1.2753 Kết quả hiển thị ra màn hình: The price has exceeded the preset level ---------------------Lưu đồ thể hiện cấu trúc câu lệnh if
Bài 16. Ví dụ 2 hàm if else trong MQL4
Ví dụ 2 //----------------------------------------------------------------------// twolevel.mq4 // The code should be used for educational purpose onlyl. //----------------------------------------------------------------------int start()
// Special function 'start'
{ double Level_1,
// Alert level 1
Level_2,
// Alert level 2
Price;
// Current price
Level_1=1.2850;
// Set level 1
Level_2=1.2800;
// Set level 2
Price=Bid;
// Request price
//----------------------------------------------------------------------if (Price > Level_1)
// Check level 1
{ Alert("The price is above level 1");
// Message to the trader
} //----------------------------------------------------------------------if (Price < Level_2)
// Check level 2
{ Alert("The price is below level 2");
// Message to the trader
} //-----------------------------------------------------------------------
return;
// Exit start()
} //-----------------------------------------------------------------------
Kết quả - Khi giá Bid lớn hơn Level_1 xuất hiện thông báo The price is above level 1 - Khi giá Bid nhỏ hơn Level_2 xuất hiện thông báo The price is below level 2
Lưu đồ cấu trúc lệnh if else
Ghi chú: Câu lệnh trên sẽ tự thoát nếu giá nằm ngoài 2 khoảng điều kiện Level 1 & Level 2. Bởi vậy chúng ta cần hàm if else chứ không phải chỉ hàm if thông thường
Bài 17. Ví dụ 3 hàm if else trong MQL4
Ví dụ 3 hàm if else //--------------------------------------------------------------------------------// compoundcondition.mq4 // The code should be used for educational purpose only. //--------------------------------------------------------------------------------int start()
// Special function 'start'
{ double Level_1,
// Alert level 1
Level_2,
// Alert level 2
Price;
// Current price
Level_1=1.2850;
// Set level 1
Level_2=1.2800;
// Set level 2
Price=Bid;
// Request price
//-------------------------------------------------------------------------------if (Price>Level_1 || PriceB && (BB+3)) )
// Example of a complex condition
&& Điều kiện đồng thời (và) || Điền kiện hoặc (hoặc điều kiện này hoặc điều kiện kia) != Điều kiện khác. N!=K (Điều kiện N khác K) > Điều kiện so sánh F > B+3. So sánh giá trị F với giá trị (B+3) chứ không phải so sánh F với B Muốn điều kiện nào thực hiện trước thì để giữa 2 ngoặc đơn ()
Bài 18. Câu lệnh while vòng lặp có điều kiện trong MQL4
Cấu trúc lệnh while while ( Condition ) // Header of the cycle operator { // Opening brace Block of operators // The body of a cycle operator may consist.. that compose the cycle body } // Closing brace ----
Giải thích: 1. Điều kiện: Condition giữa 2 ngoặc đơn ở tại while () 2. Thực thi khối lệnh: vòng lặp sẽ tiếp tục thực thi mãi mãi đến khi điều kiện sai thì thoát khỏi.
Lưu đồ cấu trúc lệnh như sau
Bài 19. Ví dụ 1 – vòng lặp while hiện chuỗi Fibonaci ra màn hình
Bạn copy ví dụ và chạy thử trong MetaEditor //-----------------------------------------------------------------// fibonacci.mq4 // The code should be used for educational purpose only. //-----------------------------------------------------------------int start()
// Special function start()
{ //-----------------------------------------------------------------int i;
// Formal parameter, counter
double A,B,C,
// Numbers in the sequence
Delta,
// Real difference between coefficients
D;
// Preset accuracy
//-----------------------------------------------------------------A=1;
// Initial value
B=1;
// Initial value
C=2;
// Initial value
D=0.0000000001;
// Set accuracy
Delta=1000.0;
// Initial value
//-----------------------------------------------------------------while(Delta > D) {
// Cycle operator header // Opening brace of the cycle body
i++;
// Counter
A=B;
// Next value
B=C;
// Next value
C=A + B;
// Next value
Delta=MathAbs(C/B - B/A);
// Search difference between coefficients
}
// Closing brace of the cycle body
//-----------------------------------------------------------------Alert("C=",C," Fibonacci number=",C/B," i=",i);//Display on the screen return;
// Exit start()
} //------------------------------------------------------------------
Giải thích 1. Thoát lệnh: Vòng lặp sẽ thoát khi điều kiện không còn đúng 2. Điều kiện: Delta > 0.0000000001 3. Biến i: đếm số lần lệnh while đã thực thi ----
Lưu đồ lệnh while