4.2 Làm thế nào để thực hiện giao dịch chiến lược trong ngôn ngữ JavaScript

Tác giả:Tốt, Tạo: 2019-04-27 11:53:15, Cập nhật:

Tóm lại

Trong bài viết trước, chúng tôi đã giới thiệu kiến thức cơ bản khi sử dụng JavaScript để viết một chương trình, bao gồm ngữ pháp cơ bản và các tài liệu.

Đưa ra chiến lược

Bollinger Band là một trong những chỉ số kỹ thuật được sử dụng phổ biến nhất, được phát minh bởi John Bollinger vào những năm 1980. Về lý thuyết, giá luôn dao động xung quanh một phạm vi giá trị nhất định. Bollinger Band dựa trên cơ sở lý thuyết này và giới thiệu khái niệm kênh giá.

Phương pháp tính toán là sử dụng nguyên tắc thống kê, đầu tiên tính toán lệch chuẩn của giá trong một khoảng thời gian, sau đó thêm hoặc trừ 2 lần lệch chuẩn của đường trung bình động để tìm khoảng thời gian tin cậy của giá. Loại cơ bản là một kênh dải bao gồm ba đường ray (trung ray, đường ray trên, đường ray dưới).

img

Do khái niệm lệch chuẩn, chiều rộng của Bollinger Band được điều chỉnh năng động dựa trên biến động giá gần đây. Khi biến động nhỏ, Bollinger Band sẽ hẹp hơn; nếu không, biến động sẽ lớn hơn và Bollinger Band sẽ rộng hơn. Khi kênh BOLL thay đổi từ hẹp sang rộng, giá dần trở lại mức trung bình. Khi kênh BOLL thay đổi từ rộng sang hẹp, điều đó có nghĩa là giá thị trường bắt đầu thay đổi. Nếu giá vượt qua đường ray trên, điều đó có nghĩa là sức mua được tăng lên. Nếu giá đi xuống đường ray dưới, điều đó cho thấy sức bán được tăng lên.

Phương pháp tính toán chỉ số Bollinger Band

Trong số tất cả các chỉ số kỹ thuật, phương pháp tính toán Bollinger Band là một trong những phương pháp phức tạp nhất, giới thiệu khái niệm lệch chuẩn trong thống kê, bao gồm tính toán quỹ đạo giữa (MB ), quỹ đạo trên (UP ) và quỹ đạo dưới (DN).

  • Đường sắt giữa = trung bình di chuyển đơn giản của thời gian N

  • Đường sắt trên = đường sắt giữa + độ lệch chuẩn của khoảng thời gian K × N

  • Đường sắt dưới = đường sắt giữa − độ lệch chuẩn của khoảng thời gian K × N

function main( ) { // program entry
    while (true) { // enter the loop
        exchange.SetContactType('this_week'); // set contact type
        var records = exchange.GetRecods(); // get the k line array
        var boll = TA.B0LL(records, 50); // get the 50-cycle BOLL indicator array
        var top = boll[0]; // get the upper-rail BOLL indicator array
        var ma = boll[l]; // get the middle-rail BOLL indicator array
        var bottom = boll[2]; // get the lower-rail BOLL indicator array
        Log(top); // print the upper-rail BOLL indicator array to the log
        Log(ma); // print the middle-rail BOLL indicator array to the log
        Log(bottom);// print the lower-rail BOLL indicator array to the log
    }
}

Chiến lược logic

Trong phần này của hướng dẫn, chúng tôi sẽ sử dụng nó theo cách dễ nhất, đó là: Khi giá vượt qua đường ray trên, mở vị trí dài; khi giá vượt qua đường ray dưới, mở vị trí ngắn.

img

Nếu giá trở lại đường ray giữa của Bollinger Band sau khi mở vị trí dài, chúng tôi tin rằng sức mạnh của sức mua đang suy yếu, hoặc sức mạnh của sức bán đang tăng cường, do đó, đây là nơi tín hiệu đóng vị trí xuất hiện.

Điều kiện giao dịch

  • Vị trí mở dài: Nếu không có vị trí, và giá đóng lớn hơn đường sắt trên.

  • Vị trí ngắn: Nếu không có vị trí, và giá đóng thấp hơn đường sắt dưới.

  • Đóng vị trí dài: Nếu giữ vị trí dài, và giá đóng cửa thấp hơn đường ray giữa,

  • Đóng vị trí ngắn: Nếu giữ vị trí ngắn, và giá đóng lớn hơn đường ray giữa,

Thực hiện bộ quy tắc chiến lược

Để đạt được chiến lược, đầu tiên chúng ta cần xem xét những gì dữ liệu chúng ta cần? thông qua API để có được? sau đó làm thế nào để tính toán logic giao dịch? cuối cùng, cách nào để đặt lệnh? hãy thực hiện nó từng bước:

Bước 1: Sử dụng Khung chiến lược CTA

CTA Framework là một tập hợp các khung tiêu chuẩn được FMZ Quant thiết kế chính thức. Bằng cách sử dụng khung này, bạn có thể bỏ qua các vấn đề lập trình tầm thường và tập trung trực tiếp vào logic lập trình. Ví dụ, nếu bạn không sử dụng khung này, bạn sẽ cần phải xem xét thay đổi giá lệnh, loại lệnh, thu hồi lệnh và vân vân.

function main() {
    $.CTA("this_week", function(st) {
        // write your strategy here
    })
}

Trên đây là khung chiến lược CTA sử dụng công cụ FMZ Quant. Đây là định dạng mã cố định, và tất cả mã logic giao dịch bắt đầu từ dòng 3.

Lưu ý rằng mã đa dạng giao dịch ở trên là this_week có nghĩa là nó đại diện cho việc sử dụng đường k hàng tuần, dữ liệu giao dịch sử dụng dữ liệu hàng tuần.

Bước 2: Thu thập tất cả các loại dữ liệu

Hãy suy nghĩ về nó, những loại dữ liệu chúng ta cần? Từ chiến lược giao dịch logic của chúng tôi, trước tiên chúng ta cần phải có được tình trạng vị trí hiện tại, và sau đó so sánh giá đóng với các đường ray trên, giữa và dưới của chỉ số Bollinger Band.

  • Nhận dữ liệu đường K

Đầu tiên là lấy mảng dữ liệu đường K và giá đóng đường K trước đó, với mảng đường K, chúng ta có thể tính toán chỉ số Bollinger Band. nó có thể được viết như thế này:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

    })
}

Như được thể hiện ở trên:

Dòng 4: lấy mảng đường K, đó là một định dạng cố định.

Dòng 5: lọc chiều dài của đường K, bởi vì tham số để tính toán chỉ số Bollinger Band là 20, khi đường K nhỏ hơn 20, không thể tính toán chỉ số Bollinger Band. Vì vậy, ở đây chúng ta cần lọc chiều dài của đường K. Nếu đường K nhỏ hơn 20, nó sẽ quay trở lại trực tiếp và tiếp tục chờ đợi đường K tiếp theo.

Dòng 6: Từ mảng K-line thu được, trước tiên lấy đối tượng của mảng K-line trước đó, và sau đó lấy giá đóng từ đối tượng này.

Các yếu tố mảng K-line là tất cả các đối tượng, đối tượng chứa giá mở, cao nhất, thấp nhất và đóng; cũng như khối lượng giao dịch và thời gian.

Ví dụ, để có được giá đóng cửa, chỉ cần thêm ". " theo sau tên thuộc tính (r[r.length - 2].Close).

  • Nhận dữ liệu thời gian đường K

Vì đây là một chiến lược trong ngày, chúng ta cần phải đóng tất cả các vị trí trước một thời gian nhất định ((hầu hết các sàn giao dịch tiền điện tử thường mở 24/7)), vì vậy chúng ta phải đánh giá xem đường K hiện tại có gần với thời gian nhất định đó khi chúng ta dừng giao dịch hay nghỉ ngơi không. Nếu nó gần với thời gian đóng K, hãy đóng tất cả các vị trí. Nếu không, hãy tiếp tục chiến lược. Mã được viết như sau:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
    })
}

Như được thể hiện ở trên:

Dòng 8: lấy các đối tượng thuộc tính K timestamp và sau đó tạo một đối tượng time ((new Date (timestamp)).

Dòng 9: Tính toán giờ và phút theo đối tượng thời gian, và xác định xem thời gian của đường K hiện tại là 14:45.

  • Nhận dữ liệu vị trí

Thông tin vị trí là một điều kiện rất quan trọng trong chiến lược giao dịch định lượng. Khi các điều kiện giao dịch được thiết lập, cần phải đánh giá liệu có nên đặt lệnh theo tình trạng vị trí và số lượng vị trí. Ví dụ: khi các điều kiện để mở các vị trí dài được thiết lập, nếu có vị trí giữ, không đặt lệnh; nếu không có vị trí giữ, đặt lệnh như thế này:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

    })
}

Như được thể hiện ở trên:

Dòng 11: Nhận trạng thái vị trí hiện tại. Nếu có vị trí dài, giá trị là 1; nếu có vị trí ngắn, giá trị là -1; nếu không có vị trí, giá trị là 0.

  • Nhận dữ liệu Bollinger Band

Tiếp theo chúng ta cần tính toán giá trị của các đường ray trên, giữa và dưới của chỉ số Bollinger Band. chúng ta cần lấy mảng Boolean trước tiên, và sau đó lấy giá trị của các đường ray trên, giữa và dưới từ mảng này. Trong công cụ lượng tử FMZ, rất đơn giản để lấy mảng Boolean, chỉ cần gọi trực tiếp API Bollinger Band, đó là một mảng hai chiều.

nó dễ dàng để hiểu mảng hai chiều, đó là mảng trong một mảng. Trật tự để lấy giá trị là: đầu tiên lấy mảng được chỉ định trong mảng, và sau đó lấy phần tử được chỉ định từ mảng được chỉ định, như được hiển thị bên dưới:

var arr = [[100, 200, 300],[10,20,30],[1,2,3]]; // this is a two-dimensional array
var test = arr[0]; //first obtain the specified array in the array and assign the value to variable "test"
var demo1 = test[0]; //then get a value from the test array
demo1; // the result is : 100

var demo2 = arr[0][0]; // you also can write like this
demo2; // the result is the same : 100

Dưới đây, từ đường 13 đến đường 19 đang nhận được phần mã hóa đường ray Bollinger Band trên, giữa và dưới, trong đó đường 13 sử dụng công cụ FMZ Quant API, có thể truy cập trực tiếp vào mảng băng Bollinger; đường 14 đến đường 16 đang nhận được mảng hai chiều tương ứng cho mảng đường ray trên, giữa và dưới; đường 17 đến đường 19 đang nhận được giá trị xác định từ mảng đường ray trên, giữa và dưới.

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2];  // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

    })
}

Bước 3: đặt hàng và giao dịch

Với dữ liệu trên, chúng ta có thể viết logic giao dịch và đặt lệnh phần bây giờ. Nó cũng rất đơn giản, phổ biến nhất được sử dụng là câu nói if, có thể được mô tả như sau: nếu điều kiện 1 và điều kiện 2 là đúng, đặt lệnh; nếu điều kiện 3 hoặc điều kiện 4 là đúng, đặt lệnh. Như được hiển thị dưới đây:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.

    })
}

Trong hình trên, các dòng 21 đến 24 là logic giao dịch và đặt lệnh mã hóa phần. từ trên xuống dưới chúng là: đóng vị trí dài, đóng vị trí ngắn, mở vị trí dài và mở vị trí ngắn.

Lấy một ví dụ về vị trí mở dài. Đây là một câu lệnh if. Nếu chỉ một dòng mã được thực thi trong câu lệnh này, các dấu ngoặc xoăn " {} " có thể bị bỏ qua. Câu lệnh được dịch thành văn bản có nghĩa là: nếu vị trí hiện tại là 0 và giá đóng lớn hơn đường ray trên, và thời gian k-line không phải 14:45, thì " trả về 1 "

bạn có thể thấy rằng các dòng này có " trả về 1 " và " trả về -1 ", đó là một định dạng cố định, có nghĩa là: nếu đó là hướng mua, viết " trả về 1 "; nếu đó là hướng bán, viết " trả về -1 ".

Mã chiến lược đầy đủ

Tại thời điểm này, một mã chiến lược hoàn chỉnh được viết. Nếu khung giao dịch, dữ liệu giao dịch, logic giao dịch và đặt lệnh được viết riêng biệt, nó rất đơn giản.

function main() {
    $.CTA("this_week", function(st) {
        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price
        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
        var mp = st.position.amount; // get the holding position information
        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value
        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.
    })
}

Có hai điều cần phải được thông báo:

  1. Cố gắng (nhưng không nhất thiết) viết logic chiến lược khi điều kiện K-line hiện tại được thiết lập, sau đó đặt lệnh trên k-line tiếp theo. Hoặc điều kiện k-line trước được thiết lập, đặt lệnh trên k-line hiện tại, theo cách này, kết quả của backtest và hiệu suất thị trường thực tế không khác nhiều.

  2. Nói chung, logic của vị trí đóng nên được viết trước logic vị trí mở. Mục đích của điều này là cố gắng làm cho logic chiến lược đáp ứng mong đợi của bạn. Ví dụ, nếu logic chiến lược chỉ đáp ứng tình huống mà nó cần phải làm theo hướng ngược lại của giao dịch sau khi chỉ đóng một vị trí, quy tắc của tình huống này là đóng vị trí đầu tiên và sau đó mở vị trí mới. Nếu chúng ta viết logic vị trí đóng trước logic vị trí mở, nó sẽ hoàn toàn hoàn thành quy tắc này.

Tóm lại

Trên đây chúng tôi đã học được từng bước phát triển một chiến lược giao dịch định lượng trong ngày hoàn chỉnh, bao gồm: giới thiệu chiến lược, phương pháp tính toán chỉ số Bollinger, logic chiến lược, điều kiện giao dịch, thực hiện mã chiến lược, vv Thông qua trường hợp chiến lược này, chúng tôi không chỉ quen thuộc với các phương pháp lập trình của các công cụ FMZ Quant, mà còn có thể xây dựng một số chiến lược khác được điều chỉnh theo mẫu này.

Chiến lược giao dịch định lượng không gì hơn là một tóm tắt của kinh nghiệm hoặc hệ thống giao dịch chủ quan. Nếu chúng ta viết ra kinh nghiệm hoặc hệ thống được sử dụng trong giao dịch chủ quan trước khi viết chiến lược định lượng, và sau đó dịch nó thành mã một lần một lần, bạn sẽ thấy rằng việc viết một chiến lược định lượng sẽ dễ dàng hơn nhiều.

Thông báo phần tiếp theo

Trong phát triển chiến lược giao dịch định lượng, nếu chỉ có thể chọn một ngôn ngữ lập trình, mà không ngần ngại, nó phải là Python. Từ việc lấy dữ liệu để backtesting, thậm chí cả phần đặt đơn đặt hàng, Python đã bao gồm toàn bộ chuỗi kinh doanh. Trong lĩnh vực đầu tư định lượng tài chính, Python đã chiếm một vị trí cực kỳ quan trọng, phần tiếp theo của khóa học chúng ta sẽ bắt đầu học ngôn ngữ Python.

Các bài tập sau giờ học

  1. Cố gắng sử dụng kiến thức trong phần này để thực hiện chiến lược trung bình di chuyển kép.

  2. Cố gắng thực hiện chiến lược chỉ số KDJ bằng ngôn ngữ JavaScript trên nền tảng FMZ Quant.


Thêm nữa