Lý Thuyết Cơ Bản Của Ngôn Ngữ MQL4 - MQL5

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Bài 07: Hàm

1. Hàm là gì?

Hàm rất giống máy làm xúc xích, bạn bỏ thịt và gia vị vào thì nó sẽ cho ra xúc xích. Thịt và gia vị là những tham số của hàm; xúc xích là giá trị trả về (return) của hàm. Chính máy xúc xích là thân hàm. Chỉ có một sự khác biệt giữa hàm và máy xúc xích là một số hàm sẽ không trả về kết quả nào (trong ngôn ngữ MQL4 gọi là void).

Ví dụ:



Theo ví dụ trên, hàm bắt đầu bằng kiểu giá trị được trả về double theo sau là tên hàm (theo sau đó là các dấu ngoặc đơn). Bên trong các dấu ngoặc đơn bạn đặt thịt và gia vị, tức là bạn đặt các tham số cho hàm. Ở đây chúng ta đặt 3 tham số double a, double b, double c. Sau đó thân hàm bắt đầu và kết thúc bằng các dấu ngoặc móc. Trong ví dụ, thân hàm sẽ tạo ra phép toán (a*b + c). Từ khóa return chịu trách nhiệm trả về kết quả cuối cùng.

2. Từ khóa return

Từ khóa return kết thúc hàm (giống như từ khóa break trong vòng lặp) và trả quyền điều khiển cho hàm gọi. Từ khóa return có thể bao gồm một biểu thức bên trong các dấu ngoặc đơn giống như ví dụ ở trên là return (a*b + c); và điều đó có nghĩa là nó kết thúc hàm và trả lại kết quả của biểu thức. Và nó cũng có thể không chứa biểu thức và việc duy nhất của nó trong trường hợp này là kết thúc hàm.

Chú ý: Không phải tất cả các hàm đều sử dụng từ khóa return, đặc biệt nếu không có giá trị trả về. Như ví dụ sau đây:



Hàm ở trên sẽ không trả về giá trị, nhưng nó sẽ in tham số s mà bạn cung cấp. Khi hàm không có giá trị trả về, bạn sử dụng void làm kiểu trả về của hàm. Những kiểu hàm thế này trong một số ngôn ngữ lập trình được gọi là phương thức (methods), nhưng ngôn ngữ MQL4 gọi chúng là hàm (functions).
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
3. Gọi hàm

Chúng ta đã biết hàm là gì. Vậy sử dụng hàm trong ngôn ngữ MQL4 như thế nào?

Có một bước phụ sau khi viết hàm để sử dụnghàm trong chương trình của bạn. Bước này gọi là gọi hàm (sử dụng hàm).

Giả sử bạn đã có một hàm tập hợp tổng hai số nguyên. Đây là hàm:

int collect (int first_number, int second_number);
{
return(first_number+second_number);
}

Sử dụng hàm trên như thế này:

int a = 10;
int b = 15;
int sum = collect(a,b);
Print(sum);

Ví dụ trên sẽ in 25. Dòng int sum = collect(a,b) định nghĩa hàm sum, nó cho biết hàm sum nhận 2 tham số kiểu số nguyên. Ở đây bạn khai báo một biến (sum) để khiến hàm trả về giá trị và cho hàm hai tham số (a,b). Về cơ bản đây được gọi là gọi hàm.

Như vậy ngôn ngữ MQL4 khi thấy tên hàm sẽ dẫn đến các tham số và đi đến hàm và sẽ sớm trả lại kết quả rồi đặt chúng ở cùng một dòng.

4. Lồng hàm trong hàm

Bạn có thể lồng một hàm (hoặc nhiều hàm) bên trong thân của một hàm khác. Đó là do dòng gọi hàm được xem như bất kỳ khai báo thông thường nào (nó thực sự là một khai báo).

Ví dụ:

Chúng ta sẽ sử dụng hàm tập hợp được mô tả ở trên bên trong một hàm mới mà công việc của nó là sử dụng kết quả của tập hợp.

void print_collection (int first_number,int second_number)
{
int sum = collect(first_number, second_number);
Print(sum);
}

Ở đây chúng ta gọi hàm collect bên trong thân hàm print_collection và in ra kết quả; void nghĩa là không có giá trị trả về.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
5. Các hàm đặc biệt trong ngôn ngữ MQL4: int(), deint(), start()

Trong ngôn ngữ MQL4, mỗi chương trình bắt đầu bằng hàm int() (tức khởi tạo) và nó xảy ra khi bạn kèm chương trình (EA hay chỉ báo tùy chỉnh) vào các biểu đồ Metatrader hoặc trong trường hợp thay đổi công cụ tài chính hoặc khung thời gian biểu đồ. Và việc làm của nó là khởi tạo các biến chính của chương trình (bạn sẽ nghiên cứu về khởi tạo các biến ở bài học kế tiếp).

Khi chương trình hoàn thành công việc hoặc bạn đóng cửa sổ biểu đồ hoặc thay đổi công cụ tài chính hoặc khung thời gian biểu đồ hoặc đóng phần mềm Metatrader thì sẽ dùng đến hàm deinit() .

Hàm thứ ba (là hàm quan trọng nhất) là start() chiếm phần lớn trong chương trình của bạn.

 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Bài 08: Biến

1. Biến là gì?

Biến là tên ám chỉ các phần của bộ nhớ ở đó dữ liệu được lưu trữ. Để giúp bạn hiểu điều này một cách trực quan, hãy hình dung bộ nhớ là một chuỗi ô có kích cỡ khác nhau. Kích cỡ ô là vùng lưu trữ bộ nhớ yêu cầu tính bằng byte.

Để sử dụng một ô lưu trữ dữ liệu, ô phải được đặt tên; quá trình này được gọi là khai báo.

Trong quá trình khai báo, bạn sử dụng một từ để cho máy tính biết loại và kích cỡ ô mà bạn muốn sử dụng, từ này gọi là từ khóa.

Sẽ có ích nếu bạn cho ô một cái tên có ý nghĩa liên hệ đến loại thông tin giúp tìm dữ liệu dễ dàng hơn, tên này là hằng biến.

Dữ liệu được đặt vào ô bằng cách gán dữ liệu cho ô.

Khi chúng ta thiết lập giá trị của ô đã tạo ra trên cùng dòng khai báo biến thì quá trình này được gọi là khởi tạo.

Khi chúng ta tạo một biến, chúng ta báo cho máy tính biết rằng chúng ta muốn gán một dung lượng bộ nhớ riêng biệt (bằng byte) cho biến, vì lưu trữ một con số, một ký tự đơn lẻ sẽ không chiếm cùng khoảng trống trong bộ nhớ, do đó máy tính sẽ hỏi kiểu dữ liệu là gì và dung lượng dữ liệu bao nhiêu.

Ví dụ nếu chúng ta báo dòng mã này cho máy tính:

int MyVariable=0;

Thì có nghĩa là chúng ta yêu cầu máy tính thiết lập một khối có dung lượng 4 byte cho biến có tên MyVariable.


2. Khai báo biến

Khai báo biến tức là giới thiệu và chỉ rõ kiểu dữ liệu của nó. Sử dụng các từ khóa mà bạn đã học ở bài kiểu dữ liệu [kiểu dữ liệu số nguyên (int), kiểu dữ liệu luận lý (bool), kiểu dữ liệu ký tự (char), kiểu dữ liệu chuỗi (string), kiểu dữ liệu dấu chấm động (double), kiểu dữ liệu màu sắc (color), kiểu dữ liệu thời gian (datetime)] để đặt tên cho biến.

Ví dụ:

int MyVariable;

Ở đây bạn khai báo một biến có tên MyVariable là kiểu số nguyên. Và trước khi có khai báo này bạn không thể sử dụng MyVariable trong mã của mình được. Nếu bạn sử dụng nó mà không khai báo thì trình biên dịch sẽ báo lỗi như thế này: 'MyVariable' - variable not defined. 1 error(s), 0 warning(s).

3. Khởi tạo biến

Khởi tạo biến nghĩa là gán cho nó một giá trị, ví dụ MyVariable=0;

Bạn có thể khởi tạo biến ở cùng dòng khai báo biến như thế này:

int MyVariable=0;

Và bạn cũng có thể khai báo biến ở một vị trí và khởi tạo nó ở một vị trí khác như thế này:

int MyVariable;
...
...
MyVariable=5;

Nhưng chú ý một điều là khai báo biến phải có trước khởi tạo biến.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
4. Phạm vi của biến

Có hai phạm vi của biến: Cục bộ và toàn cục.

Biến cục bộ nghĩa là biến không được thấy đối với bên ngoài phạm vi nó được khai báo. Ví dụ các biến được khai báo bên trong hàm là cục bộ đối với khối mã hàm và các biến được khai báo bên trong vòng lặp hoặc quyết định là cục bộ đối với các khối mã này và không thể được sử dụng hoặc nhìn thấy bên ngoài chúng.

Ví dụ:

double my_func (double a, double b, double c)
{
int d;
return (a*b+c);
}

Trong ví dụ trên, các biến a, b,c và d là biến cục bộ, chỉ có thể được sử dụng bên trong khối mã hàm (bên trong các dấu ngoặc móc) và không thể được sử dụng bởi mã bên ngoài. Vì thế chúng ta không thể viết một dòng sau hàm ở trên như thế này: d=10; bởi vì d không được nhìn thấy đối với dòng kế tiếp của hàm bởi vì nó nằm bên ngoài.

Loại phạm vi thứ hai là biến toàn cục là các biến được khai báo bên ngoài bất kỳ khối mã nào và có thể được nhìn thấy từ bất kỳ phần nào của mã.

Ví dụ:

int Global_Variable;
double my_func (double a, double b, double c)
{
return(a*b +c + Global_Variable);
}

Ở đây biến Global_Variable được khai báo bên ngoài hàm vì thế có thể được thấy bởi tất cả các hàm trong chương trình. Biến toàn cục sẽ tực động cài đặt về 0 nếu bạn không khởi tạo chúng.


5. Biến extern (biến toàn cục)

Từ khóa extern được sử dụng để khai báo một loại biến đặc biệt, được sử dụng để định nghĩa biến nhập của chương trình, mà bạn có thể thiết lập chúng từ thuộc tính của EA hoặc chỉ báo tùy chỉnh.

Ví dụ:

extern TP = 100; // đây là giá chốt lời được gắn =100 pip


Ở đây biến TP định nghĩa một biến extern mà bạn sẽ thấy lần đầu tiên khi gắn chỉ báo (hoặc EA) vào biểu đồ Metatrader và bạn có thể thay đổi nó từ giao diện điều chỉnh thuộc tính. Hãy quan sát hình minh họa giao diện thuộc tính chỉ báo đường trung bình động dưới đây:



Ở đây các biến Period, Shift, MA_method, Apply_to và Style là các biến được định nghĩa sử dụng từ khóa extern vì thế chúng xuất hiện trong giao diện thuộc tính. Bất kỳ biến nào bạn muốn người dùng chương trình có thể thay đổi và thiết lập thì hãy sử dụng biến extern.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Bài 09: Bộ tiền xử lý

1. Bộ tiền xử lý là gì?


Bộ tiền xử lý là những chỉ thị để trình biên dịch thực hiện trước khi bắt đầu xử lý mã cho chương trình.

Chẳng hạn nếu bạn sử dụng chỉ thị tiền xử lý #include <win32.h> thì có nghĩa là bạn báo cho trình biên dịch kèm nội dung của tệp win32.h vào vị trí bạn viết từ khóa include trước khi xử lý mã.

Trong ngôn ngữ MQL4 có 4 chỉ thị tiền xử lý.

(1) Chỉ thị define (định nghĩa) được sử dụng để tạo một hằng. Hằng này rất giống biến, chỉ một điểm khác biệt là bạn đặt giá trị của nó chỉ một lần và không thể thay đổi giá trị của nó trong mã giống như biến được.

Ví dụ:

#define my_constant 100

Như bạn có thể thấy ở ví dụ trên, không có ký hiệu gán (=) mà chỉ có một khoảng trắng giữa tên hằng (my_constant) và giá trị của nó (100). Và bạn có thể thấy rằng dòng này không kết thúc bằng dấu chấm phẩy ( ; ) mà kết thúc bằng một ký tự xuống dòng (dòng mới).

Tên của hằng tuân thủ cùng quy tắc với việc chọn tên từ định danh (ở Bài học 02: Cú pháp), ví dụ bạn không thể bắt đầu tên hằng bằng một con số hoặc tên vượt quá 31 ký tự.

Trình biên dịch sẽ thay thế mỗi tên hằng trong nguồn mã của bạn bằng một giá trị tương ứng. Vì thế có thể sử dụng hằng ở trên như thế này:
sum = constant1 * 10;
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
(2) Chỉ thị property (thuộc tính)

Có các hằng số xác định được gọi là "biên dịch điều khiển" được kèm trong ngôn ngữ MQL4, mà bạn có thể cài đặt chúng trong chương trình.

Chúng là các thuộc tính của chương trình mà bạn có thể cài đặt chúng bằng cách sử dụng chỉ thị trình biên dịch property (thuộc tính) và trình biên dịch sẽ viết chúng dưới dạng các cài đặt chương trình thực thi (file có đuôi ex4).

Ví dụ:

#property link "http://www.sanvangonline.com.vn"
#property copyright "Anyone wants to use"

Dưới đây là danh mục các hằng số xác định trong ngôn ngữ MQL4:

(3) Chỉ thị include

Khi bạn yêu cầu trình biên dịch kèm một tên file với chỉ dẫn include thì cũng giống như khi bạn sao chép toàn bộ nội dung file và dán nó tại vị trí dòng bạn viết khai báo kèm.

Ví dụ:

#include <win32.h>

Ở ví dụ trên, bạn báo cho trình biên dịch mở tệp win32.h và đọc tất cả nội dung của nó và sao chép chúng vào cùng vị trí của khai báo kèm.

Chú ý: Ở ví dụ trên bạn kèm tên file với các dấu ngoặc nhọn (<>) và có nghĩa là bạn báo cho trình biên dịch sử dụng thư mục mặc định (thường là thư mục \experts\include) để tìm tệp win32.h và không tìm thư mục hiện hành.

Nếu tệp bạn muốn kèm nằm ở cùng đường dẫn của mã thì phải sử dụng các dấu nháy thay các dấu ngoặc nhọn như thế này:

#include "hamsudung.mqh"

Trong cả hai trường hợp, nếu tệp không thể được tìm thấy thì bạn sẽ thấy một thông báo lỗi. Bạn có thể sử dụng khai báo include ở bất kỳ đâu nhưng thường được sử dụng ở phần đầu của nguồn mã.

Chú ý: Nên viết mã được sử dụng thường xuyên trong một tệp riêng biệt và sử dụng chỉ dẫn include để đặt nó trong mã khi bạn cần (đây chỉ là khuyến nghị về thói quen lập trình).
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
(4) Chỉ thị import (nhập)

Chỉ thị import giống chỉ thị include về phương diện sử dụng tệp bên ngoài chương trình nhưng có những điểm khác giữa chúng. Bạn sử dụng chỉ thị import trong các tệp thực thi (có đuôi .ex4) hoặc tệp thư viện (có đuôi .dll) để nhập các hàm của chúng vào chương trình.

Ví dụ:

#import "user32.dll"
int MessageBoxA(int hWnd,string lpText, string lpCaption,int uType);
int MessageBoxExA(int hWnd,string lpText,string lpCaption, int uType,int wLanguageId);
#import "melib.ex4"
#import "gdi32.dll"
int GetDC(int hWnd);
int ReleaseDC(int hWnd,int hDC);
#import


Khi bạn nhập các hàm từ tệp ex4 bạn không khai báo các hàm để sẵn dùng. Trong khi nhập các hàm từ tệp .dll yêu cầu bạn khai báo các hàm bạn muốn sử dụng như thế này:

Int MessageBoxA(int hWnd,string lpText,string lpCaption,int uType);

Và chỉ các hàm bạn khai báo mới có thể sử dụng được trong mã chương trình.

Chú ý: Bạn phải kết thúc các chỉ thị import bằng một dòng nhập trống là #import (không có tham số).

Ở bài học kế tiếp chúng ta sẽ bắt đầu viết chỉ báo tùy chỉnh đầu tiên, do vậy cần ôn tập lại 9 bài học trước.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Bài 10: Viết chỉ báo kỹ thuật đầu tiên

Trước khi tiếp tục với chuỗi bài học kế tiếp, đề nghị bạn nghiên cứu lại 9 bài học trước bởi vì chúng ta sẽ sử dụng chúng nhiều trong các phần giải thích và nghiên cứu các hệ thống cố vấn (EA) và các chỉ báo tùy chỉnh được tạo ra trong chuỗi bài học sắp tới.

Ở bài này chúng ta sẽ tạo một chỉ báo đơn giản để bước đầu khám phá cách viết các chỉ báo kỹ thuật tùy chỉnh trên phần mềm MetaTrader4. Ở chỉ báo này đơn giản chỉ tính phép trừ mức giá cao nhất (High) cho mức giá thấp nhất (Low).


Công cụ MetaEditor

Đây là chương trình đi kèm phần mềm MT4 (MetaTrader4) giúp bạn viết các chương trình, đọc hướng dẫn MQL4, biên soạn chương trình và nhiều hơn thế nữa.

Có thể tạo một shortcut cho công cụ MetaEditor trên desktop để dễ dàng truy cập chương trình. Có thể chạy công cụ MetaEditor theo 3 cách như sau:

(1) Mở phần mềm MT4, click vào biểu tượng MetaEditor nằm bên phải biểu tượng vào lệnh mới (New Order).



(2) Từ thanh menu Start chọn Programs rồi chọn nhóm MetaTrader4 sau đó nhấp chọn MetaEditor.





(3) Tìm thư mục cài đặt phần mềm MT4 (thường có dạng C:\Program Files\MetaTrader4), tìm file MetaEditor.exe rồi kích vào nó (có thể tạo shortcut trên desktop cho tiện).



Hoặc đơn giản nhất là nhấn phím F4 từ MT4 là xong



Bất kỳ phương pháp nào kể trên mà bạn chọn đều mở công cụ MetaEditor như có thể thấy ở hình bên dưới, gồm 3 cửa sổ như sau:




(1) Cửa sổ công cụ biên tập để viết chương trình ở đó

(2) Cửa sổ hộp công cụ chứa 3 tab:
a. Tab lỗi (errors), nơi đây bạn có thể thấy các lỗi (nếu có) trong mã bạn viết
b. Tìm trong tab tệp, bạn có thể thấy các tệp chứa từ khóa bạn tìm để sử dụng lệnh “Find in files” hoặc bằng cách nhấp tổ hợp phím Ctrl + SHIFT + F.
c. Tab trợ giúp (help), nơi bạn có thể làm nổi bật tư khóa bạn muốn biết và nhấn F1, khi đó sẽ thấy các chủ đề trợ giúp trong tab này.

(3) Cửa sổ điều hướng (Navigator) chứa 3 tab:
a. Tab tệp (Files), để dễ truy cập các tệp được lưu trong thư mục MT4.
b. Tab từ điển (Dictionary) giúp truy cập hệ thống trợ giúp MQL4.
c. Tab tìm kiếm (Search) giúp tìm từ điển MQL4.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
TẠO FILE MQL:

Chỉ báo tùy chỉnh là chương trình giúp sử dụng các chức năng của chỉ báo kỹ thuật và không thể thực hiện các giao dịch tự động.

Để tạo một chỉ báo tùy chỉnh bạn phải bắt đầu bằng 3 bước (sau này chúng ta sẽ tìm hiểu cách lượt bỏ 3 bước cơ bản này).

Bước 1: Trên thanh thưc đơn của MetaEditor hãy chọn File >> New (có thể sử dụng tổ hợp phím Ctrl + N hoặc nhấp vào biểu tượng New trên thanh công cụ tiêu chuẩn).

Sau đó một giao diện xuất hiện dẫn đến bước kế tiếp. Tại đây chọn Custom Indicator rồi nhấp Next.




Bước 2: Sau khi nhấp Next, một giao diện mới xuất hiện giúp chỉnh sửa thuộc tính (properties) chương trình. Tại bước này có thể nhập các thuộc tính sau đây:

1. Tên (Name) chương trình, đây là tên gọi chỉ báo bạn viết và sẽ được lưu dưới dạng ten_chi_bao.mq4
2. Tên tác giả (Author), là tên người tạo ra chương trình
3. Đường dẫn (Link) đến website của bạn
4. Danh sách các biến bên ngoài (External).


Ở ví dụ chỉ báo đầu tiên này, chúng ta không cần bất kỳ biến bên ngoài nào mà chỉ cần viết các giá trị như hình bên dưới và bước sang bước thứ 3 bằng cách nhấp Next.



Bước 3: Giao diện thứ 3 sẽ xuất hiện khi bạn nhấp Next là giao diện thuộc tính công cụ vẽ (Drawing). Chức năng của nó là giúp bạn thiết lập các thuộc tính vẽ các đường của chỉ báo, ví dụ: có bao nhiêu đường, màu sắc và vị trí vẽ chỉ báo (ở biểu đồ chính hay cửa sổ riêng biệt).

Giao diện này chứa các tùy chọn sau:

1. Indicator in separate window (lựa chọn chỉ báo ở cửa số riêng biệt): khi nhấp vào lựa chọn này, chỉ báo của bạn sẽ được vẽ ở cửa sổ riêng biệt và không nằm trên cửa sổ biểu đồ chính. Nếu bạn không chọn lựa chọn này thì chỉ báo của bạn sẽ được vẽ ở cửa sổ biểu đồ chính.

2. Minimum: lựa chọn này chỉ có sẵn khi bạn chọn Indicator in separate window, và chức năng của nó là thiết lập biên đáy cho biểu đồ.

3. Maximum: lựa chọn này chỉ có sẵn khi bạn chọn Indicator in separate window và chức năng của nó là thiết lập biên đỉnh cho biểu đồ.

4. Indexes: danh mục để thêm đường chỉ báo và thiết lập màu sắc mặc định cho nó.

Chúng ta sẽ tìm hiểu những lựa chọn này ở các bài học kế tiếp, riêng đối với chỉ báo đầu tiên này, chọn Indicator in separate window và nhấn Add, sau đó giao diện sẽ thêm một đường vào danh mục Indexes như hình minh họa:





Khi bạn nhấp Finish sẽ thấy giao dịch biến mất và sẽ trở lại môi trường MetaEditor với mã của chỉ báo mà công cụ đã viết.



Ở bài học kế tiếp chúng ta sẽ khám phá từng dòng mã ở trên và thêm mã vào để tạo chỉ báo đầu tiên.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Đến đây là kết thúc rồi, giờ là lúc chi bộ sẽ tiếp xúc với lập trinh ROBOT !

Chúc chi bộ may mắn!
 
Top