Bắt đầu với ngôn ngữ M
Ngôn ngữ M là gì? Ngôn ngữ M được gọi là một tập hợp các chức năng lập trình mở rộng từ các chỉ số kỹ thuật giao dịch chứng khoán ban đầu.
Nó áp dụng chế độ xây dựng của "ngữ pháp nhỏ, hàm lớn", giúp cải thiện đáng kể hiệu quả lập trình. Việc viết chiến lược hơn 100 câu trong các ngôn ngữ khác có thể được biên dịch chỉ với một vài dòng trong ngôn ngữ M. Thư viện chức năng thống kê tài chính và cấu trúc dữ liệu kết hợp với công cụ FMZ Quant cũng có thể hỗ trợ một số logic giao dịch phức tạp.
Để giúp bạn nhanh chóng hiểu các kiến thức chính của phần này, trước khi giới thiệu ngôn ngữ FMZ Quant M, trước tiên hãy có một sự hiểu biết sơ bộ về khái niệm danh từ của phần này. Chúng tôi vẫn sẽ sử dụng đường trung bình động dài hạn 50 ngày và đường trung bình động ngắn hạn 10 ngày như trường hợp cơ bản, và xem xét trường hợp chiến lược hoàn chỉnh được đề cập trong chương trước:
Mở vị trí dài: Nếu hiện không có vị trí, và giá đóng lớn hơn trung bình di chuyển ngắn hạn, và giá đóng lớn hơn trung bình di chuyển dài hạn, và trung bình di chuyển ngắn hạn lớn hơn trung bình di chuyển dài hạn, và trung bình di chuyển dài hạn đang tăng.
Mở vị trí ngắn: Nếu hiện không có vị trí, và giá đóng là thấp hơn trung bình động ngắn hạn, và giá đóng là thấp hơn trung bình động dài hạn, và trung bình động ngắn hạn thấp hơn trung bình động dài hạn, và trung bình động dài hạn đang giảm.
Đóng vị trí dài: Nếu hiện đang nắm giữ vị trí dài, và giá đóng là thấp hơn trung bình động dài hạn, hoặc trung bình động ngắn hạn thấp hơn trung bình động dài hạn, hoặc trung bình động dài hạn đang giảm.
Khóa vị trí ngắn: Nếu hiện tại giữ vị trí ngắn, và giá đóng cửa lớn hơn trung bình động dài hạn, hoặc trung bình động ngắn hạn lớn hơn trung bình động dài hạn, hoặc trung bình động dài hạn đang tăng.
Nếu bạn viết nó bằng ngôn ngữ M, nó sẽ là:
MA10:=MA(CLOSE,10); // Get the 10-cycle moving average of the latest K-line and save the result in variable MA10
MA50:=MA(CLOSE,50); // Get the 50-cycle moving average of the latest K-line and save the result in variable MA50
MA10_1:=REF(MA10,1); //Get the 10-cycle moving average of the pervious K line and save the result to variable MA10_1
MA50_1:=REF(MA50,1); //Get the 50-cycle moving average of the pervious K line and save the result to variable MA50_1
MA10_2:=REF(MA10,2); //Get the 10-cycle moving average of the latest K line and save the result to variable MA10_2
MA50_2:=REF(MA50,2); //Get the 50-cycle moving average of the latest K line and save the result to variable MA50_2
MA50_ISUP:=MA50>MA50_1 AND MA50_1>MA50_2; //Determine whether the current 50-line moving average of the K line is rising
MA50_ISDOWN:=MA50<MA50_1 AND MA50_1<MA50_2; //Determine whether the current 50-line moving average of the K line is falling
CLOSE>MA10 AND CLOSE>MA50 AND MA10>MA50 AND MA50_ISUP,BK; //open long position
CLOSE<MA10 AND CLOSE<MA50 AND MA10<MA50 AND MA50_ISUP,SK; //open short position
CLOSE<MA50 OR MA10<MA50,SP;//close long position
CLOSE>MA50 OR MA10>MA50,BP;//close short position
Để viết một chiến lược giao dịch hoàn chỉnh, bạn sẽ cần: thu thập dữ liệu, tính toán dữ liệu, tính toán logic và đặt lệnh. Như đã thấy ở trên, trong toàn bộ mã, chỉ có một API để có được dữ liệu cơ bản được sử dụng, đó là " CLOSE " trong dòng đầu tiên và thứ hai; sau đó các dòng đầu tiên đến thứ chín là các phần tính toán dữ liệu; Các dòng 11 đến 14 là các tính toán logic và đặt lệnh.
Lưu ý rằng MA10, MA50, MA10_1, MA50_1, MA10_2, và MA50_2 là các biến; trong các dòng đầu tiên đến thứ chín, " := " là một ký hiệu phân bổ, và dữ liệu ở bên phải của ký hiệu phân bổ được gán cho biến bên trái của ký hiệu phân bổ;
Các dữ liệu cơ bản (giá mở, giá cao nhất, giá thấp nhất, giá đóng, khối lượng) là một phần không thể thiếu của giao dịch định lượng. Để có được dữ liệu cơ bản mới nhất trong chiến lược, bạn chỉ cần gọi API của FMZ Quant. Nếu bạn muốn có được dữ liệu cơ bản của giá lịch sử, bạn có thể sử dụng " REF ", chẳng hạn như: REF (CLOSE, 1) là để có được giá đóng ngày hôm qua.
Các biến có thể được thay đổi. Tên của một biến có thể được hiểu như là một tên mã. Tên của nó được hỗ trợ bởi các chữ cái, số và dòng tiếng Anh. Tuy nhiên, chiều dài phải được kiểm soát trong vòng 31 ký tự. Tên biến không thể được lặp lại với một chữ cái khác, không thể được trùng lặp với tên tham số, không thể được lặp lại với tên hàm (API), và mỗi câu phải kết thúc bằng dấu chấm bán chấm. Viết bình luận sau " // ". Như được hiển thị dưới đây:
INT:=2; //Integer type
FLOAT:=3.1; //Floating point
ISTRUE:=CLOSE>OPEN; //Boolean type
Việc gán biến có nghĩa là giá trị ở bên phải của ký hiệu gán được đưa ra cho biến ở bên trái. Có bốn loại gán, có thể kiểm soát xem giá trị có được hiển thị trên biểu đồ hay vị trí của màn hình. Chúng là " : ", " := ", " ^^ ", "... ", và các bình luận mã bên dưới giải thích ý nghĩa của chúng một cách chi tiết.
CC1: C; //Assign the closing price to the variable CC1 and display it in the sub-chart
CC2:=C; //Assign the closing price to variable CC2, but not display in the status bar and chart
CC3^^C; //Assign the closing price to the variable CC3 and display it in the main chart
CC4..0; //Assign the closing price to the variable CC4 and display it in the status bar, but not in the chart
Có một số loại dữ liệu trong ngôn ngữ M, phổ biến nhất là các loại số, các loại chuỗi và các loại boolean. Loại số là số, bao gồm số nguyên, số thập phân, số dương và âm, v.v., chẳng hạn như: 1, 2, 3, 1,1234, 2.23456...; loại chuỗi có thể được hiểu là văn bản, tiếng Trung, tiếng Anh, số cũng có thể là chuỗi, chẳng hạn như:
Các toán tử quan hệ, như tên gọi cho thấy, là các toán tử được sử dụng để so sánh mối quan hệ của hai giá trị. Chúng bằng, lớn hơn, nhỏ hơn, lớn hơn hoặc bằng, nhỏ hơn hoặc bằng, không bằng, như được hiển thị dưới đây:
CLOSE = OPEN; //when closing price equals to opening price, return 1 (true), otherwise return 0 (false)
CLOSE > OPEN; //when closing price greater than opening price, return 1 (true), otherwise return 0 (false)
CLOSE < OPEN; //when closing price less than opening price, return 1 (true), otherwise return 0 (false)
CLOSE >= OPEN; //when closing price greater than or equal to opening price, return 1 (true), otherwise return 0 (false)
CLOSE <= OPEN; //when closing price less than or equal to opening price, return 1 (true), otherwise return 0 (false)
CLOSE <> OPEN; //when closing price is not equal to opening price, return 1 (true), otherwise return 0 (false)
Các hoạt động logic có thể kết hợp các câu lệnh loại Boolean riêng biệt vào tổng thể, phổ biến nhất được sử dụng là " AND " và " OR ". Giả sử có hai giá trị loại Boolean,
AA:=2>1; //return true
BB:=4>3; //return true
CC:=6>5; //return true
DD:=1>2; //return false
Xin chú ý:
" AND " là khi tất cả các điều kiện là "true" và điều kiện cuối cùng là "true";
"OR" có nghĩa là trong tất cả các điều kiện, miễn là bất kỳ điều kiện nào là
"Và" có thể được viết là "&&", và "hoặc" có thể được viết là "go".
Không có sự khác biệt giữa các toán tử số học (" +
AA:=1+1; //the result is 2
BB:=2-1; //the result is 1
CC:=2*1; //the result is 2
DD:=2/1; //the result is 2
Nếu có một biểu thức 100*(10-1)/(10+5, bước nào được tính toán đầu tiên?
1, Nếu nó là cùng một mức độ hoạt động, nó thường được tính từ trái sang phải. 2, Nếu có cộng và trừ, và nhân và chia, đầu tiên tính toán nhân và chia, sau đó cộng và trừ. 3, Nếu có ngoặc kép, đầu tiên tính bên trong ngoặc kép. 4, Nếu luật vận hành dễ dàng được đáp ứng, luật có thể được sử dụng để tính toán.
Điều tương tự cũng đúng với ngôn ngữ M, như được hiển thị dưới đây:
100*(10-1)/(10+5) //the result is 60
1>2 AND (2>3 OR 3<5) //the result is false
1>2 AND 2>3 OR 3<5 //the result is true
Trong ngôn ngữ M của công cụ FMZ Quant, có hai chế độ thực thi chương trình, cụ thể là chế độ giá đóng và chế độ giá thời gian thực.
Nếu đó là một chiến lược giao dịch trong ngày, bạn cần sử dụng chức năng thời gian "TIME" khi bạn cần đóng vị trí vào cuối. Chức năng này nằm trên chu kỳ thứ hai và dưới chu kỳ ngày, được hiển thị dưới dạng bốn chữ số: HHMM (1450 - 14: 50).
CLOSE>OPEN && TIME<1450,BK; //if it is a positive k-line and the time is less than 14:50, opening position.
TIME>=1450,CLOSEOUT; //if the time is beyond 14:50, closing all position.
Có hai loại phân loại mô hình trong ngôn ngữ M: mô hình không lọc và mô hình lọc. Điều này thực sự được hiểu rất rõ: mô hình không lọc cho phép các tín hiệu mở hoặc đóng liên tục, có thể được sử dụng để thêm và giảm vị trí. Mô hình lọc không cho phép các tín hiệu mở hoặc đóng liên tục, tức là khi tín hiệu mở xuất hiện, tín hiệu mở tiếp theo sẽ được lọc cho đến khi tín hiệu đóng xuất hiện. Trật tự của mô hình không lọc là: vị trí mở - vị trí đóng - vị trí mở - vị trí đóng - vị trí mở...
Nếu bạn cần viết một chiến lược giao dịch phức tạp hơn, bạn có thể tham khảo tài liệu API ngôn ngữ M của nền tảng FMZ Quant, hoặc trực tiếp tham khảo dịch vụ khách hàng chính thức để viết cho bạn.
Giao dịch trong ngày cũng là một chế độ giao dịch phổ biến. Phương pháp này không giữ vị trí qua đêm. Do đó, nó có rủi ro thấp về biến động thị trường. Một khi các điều kiện thị trường bất lợi xảy ra, nó có thể được điều chỉnh kịp thời. Trong phần tiếp theo, chúng tôi sẽ đưa bạn viết một chiến lược giao dịch trong ngày khả thi.