Sử dụng KlineChart để tạo ra biểu đồ chính sách đơn giản hơn

Tác giả:Giấc mơ nhỏ, Tạo: 2022-07-01 15:54:06, Cập nhật: 2023-09-18 20:11:05

img

Sử dụng KlineChart để tạo ra biểu đồ chính sách đơn giản hơn

Khi sử dụng ngôn ngữ JavaScript, ngôn ngữ Python để viết các biểu đồ chính sách. Người dùng không quen thuộc với lập trình hoặc các thư viện biểu đồ được sử dụng trên nền tảng FMZ thường gặp khó khăn trong việc thiết kế mã vẽ biểu đồ trên biểu đồ tùy chỉnh. Vậy làm thế nào để có thể vẽ một biểu đồ chính sách phong phú với chỉ một ít mã viết?

Ngôn ngữ Pine được biết đến với nhiều tính năng đồ họa phong phú. Ngôn ngữ này rất đơn giản và có tính năng mạnh mẽ. Nếu có thể truy cập giao diện đồ họa của ngôn ngữ Pine vào các chiến lược của ngôn ngữ JavaScript, Python, thì nó sẽ rất thuận tiện cho các nhà phát triển thiết kế chiến lược đồ họa.KLineChartCác chức năng có thể tạo ra các biểu đồ tùy chỉnh.https://www.fmz.com/api#klinechart

Chúng ta sẽ viết một ví dụ đơn giản về việc chuyển đổi bằng ngôn ngữ JavaScript.

Ví dụ đơn giản

/*backtest
start: 2022-03-21 09:00:00
end: 2022-06-21 15:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

function main() {
    var c = KLineChart()
    while (true) {
        var bars = _C(exchange.GetRecords)
        for (var i = 0 ; i < bars.length ; i++) {
            var bar = bars[i]
            c.begin(bar)
            c.plot(bar.Volume, "volume")
            c.close()
        }
        Sleep(1000)
    }
}

Ví dụ rất đơn giản, chỉ cần vẽ đường K trong khu vực đồ họa tùy chỉnh của chính sách và vẽ đường cong giao dịch ở vị trí đồ họa phụ của biểu đồ tương ứng với mỗi đường K BAR.

img

Chúng tôi sẽ sử dụng nó trong mã.var c = KLineChart()Tạo một đối tượng biểu đồ, sau đó sử dụng phương pháp của nó để gọi biểu đồ. Sau đó trong vòng lặp, chúng ta lấy dữ liệu đường K (các cấu trúc mảng) và thực hiện các thao tác đi qua mảng K. Có thể sử dụng đường vòng lặp for đơn giản như trong ví dụ, hoặc có thể đi qua các phương pháp khác.

Hình ảnh hoạt động từc.begin(bar)Các hàm bắt đầu.c.close()Chế độ kết thúc.begincloseCác hàm là các phương thức đối tượng biểu đồ c. Sau đây là các hàm biểu đồ được sử dụng phổ biến nhất.plotHãy vẽ đường cong giao dịch trên mỗi BAR.

Một ví dụ phức tạp hơn

Nếu chúng ta muốn thiết kế một biểu đồ với các chỉ số Brinh kèm theo. Ồ đúng rồi!

/*backtest
start: 2022-03-21 09:00:00
end: 2022-06-21 15:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

function main() {
    var c = KLineChart()

    // 策略主循环
    while(true) {
        // 轮询间隔
        Sleep(500)
        
        // 获取K线数据
        let bars = exchange.GetRecords()
        if (!bars || bars.length <= 20) {
            continue
        }
        
        // 计算布林指标
        var boll = TA.BOLL(bars)
        
        bars.forEach(function(bar, index) {
            c.begin(bar)
            // 画图操作
            c.plot(boll[0][index], "Boll_Up", {overlay: true})     // 画在图表主图
            c.plot(boll[1][index], "Boll_Mid", {overlay: true})    // 画在图表主图
            c.plot(boll[2][index], "Boll_Down", {overlay: true})   // 画在图表主图
            c.plot(bar.Volume, "volume")                           // 画在图表副图
            c.close()
        })
    
        // 策略交易逻辑
        // ...
        // ..
    }
}

Bạn có thể thấy trong mã, thông tin cấu hình của chúng tôi trên nền tảng FMZ là:

/*backtest
start: 2022-03-21 09:00:00
end: 2022-06-21 15:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

Các cấu hình này được sử dụng để kiểm tra lại các đối tượng trên sàn giao dịch Binance và kết quả là như sau:

img

Bạn có thể thấy rằng chúng tôi đã sử dụng hình vẽ của Pine để đơn giản hóa mã hình vẽ trong ngôn ngữ JavaScript.

Viết biểu đồ dữ liệu như chỉ số

Thu thập dữ liệu K-line, tính toán các chỉ số. Những hoạt động này rất phổ biến và rất đơn giản trong các mô hình chiến lược của quảng trường chiến lược nền tảng và tài liệu API.

        // 获取K线数据
        let bars = exchange.GetRecords()
        if (!bars || bars.length <= 20) {   
            // 如果获取K线失败,即!bar为真则执行continue,忽略之后的代码,重新执行循环
            // 如果bars.length小于等于20,即K线BAR(柱)数量小于20,无法计算指标,也执行continue
            continue
        }
        
        // 计算布林指标
        var boll = TA.BOLL(bars)

布林指标计算函数TA.BOLL,如果不指定布林指标参数,就使用默认参数BOLL(20, 2)Boll chỉ số có ba đường, vì vậy các dữ liệu được trả về bởi hàm TA.BOLL là một tập hợp hai chiều. Boll[0],boll[1] vàboll[2] là ba phần tử của tập hợp Boll, mỗi phần tử đại diện cho một đường, một tập hợp.

  • boll[0]: Brin đã được đưa lên mạng
  • boll[1]: Đường trung của Vành đai Brin
  • boll[2]: Brin dây chuyền dưới

Sau đó, chúng ta sẽ xem cách vẽ dữ liệu khối lượng của K-line thành khối lượng giao dịch, và dữ liệu chỉ số Brinh được tính trên biểu đồ.

Chúng ta vẽ dữ liệu K-line từng Bar, vì vậy chúng ta phải đi qua toàn bộ K-line, nghĩa là đi qua các bar trong mã.forEachCác phương pháp được đi qua, hoặc có thể sử dụng chữ viết vòng tròn for để đi qua.

        bars.forEach(function(bar, index) {
            c.begin(bar)
            // 画图操作
            c.plot(boll[0][index], "Boll_Up", {overlay: true})     // {overlay: true}参数控制,画在图表主图
            c.plot(boll[1][index], "Boll_Mid", {overlay: true})    // 画在图表主图
            c.plot(boll[2][index], "Boll_Down", {overlay: true})   // 画在图表主图
            c.plot(bar.Volume, "volume")                           // 画在图表副图
            c.close()
        })

Lưu ý rằng mỗi khi bạn bắt đầu vẽ biểu đồ trên Bar, bạn phải thực hiện điều này trước tiên.c.begin(bar)Các ứng dụng khác cũng có thể được sử dụng.beginChức năng là một phương pháp đối tượng biểu đồ c của chúng tôi.c.close()◎ ởbeginChức năng vàcloseGiữa các hàm là các hàm đồ họa mà chúng ta gọi tương tự như cách vẽ đồ họa của ngôn ngữ Pine.barcolor bgcolor plot fill hline plotarrow plotshape plotchar plotcandle signal, có thể vẽ đường, vẽ mũi tên, đánh dấu thông tin, v.v. Các tham số của các hàm này phù hợp với các tham số của hàm tương ứng của ngôn ngữ Pine, và chức năng vẽ cũng phù hợp.

Thêm hình ảnh, ví dụ như mũi tên tín hiệu giao dịch, dấu, đường ngang

Trong ví dụ đồ họa của chỉ số Brin trên, thêm một số mũi tên, dấu hiệu, đường ngang của tín hiệu giao dịch.

/*backtest
start: 2022-03-21 09:00:00
end: 2022-06-21 15:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

function main() {
    var c = KLineChart()

    // 策略主循环
    while(true) {
        // 轮询间隔
        Sleep(500)
        
        // 获取K线数据
        let bars = exchange.GetRecords()
        if (!bars || bars.length <= 20) {
            continue
        }
        
        // 计算布林指标
        var boll = TA.BOLL(bars)
        
        bars.forEach(function(bar, index) {
            c.begin(bar)
            // 画图操作
            c.plot(boll[0][index], "Boll_Up", {overlay: true})     // 画在图表主图
            c.plot(boll[1][index], "Boll_Mid", {overlay: true})    // 画在图表主图
            c.plot(boll[2][index], "Boll_Down", {overlay: true})   // 画在图表主图
            c.plot(bar.Volume, "volume")                           // 画在图表副图
            
            c.hline(bar.Open, {overlay: true})                                         // 水平线
            c.plotarrow(bar.Close - bar.Open, {overlay: true})                         // 箭头
            c.plotshape(bar.Close - bar.Open > 0, {style: 'square', overlay: true})    // 画方块标记
            c.plotchar(bar.Close - bar.Open < 0, {char: '❄', size: "20px", overlay: true})           // 画出字符❄
            if (boll[0][index] && bar.Close > boll[0][index]) {
                c.signal("long", bar.Close, 1.5)
            } else if (boll[2][index] && bar.Close < boll[2][index]) {
                c.signal("closelong", bar.Close, 1.5)
            }
            
            c.close()
        })
    
        // 策略交易逻辑
        // ...
        // ..
    }
}

img

Vì các lệnh chính sách của ngôn ngữ Pine sẽ tự động đánh dấu tín hiệu trên biểu đồ,KLineChartCác đối tượng biểu đồ được tạo ra bởi hàm cũng mở rộng một hàm để vẽ dấu hiệu mua bán:c.signal

Các đối tượng cấu hình biểu đồ

Một cấu trúc có thể được tuyên bố để cấu hình phong cách biểu đồ, ví dụ như biến ChartCfg dưới đây cho biết thông tin cấu hình của một đường lưới.

    var chartCfg = {
        grid: {
            show: true,
            // 网格水平线
            horizontal: {
                show: true,
                size: 2,
                color: '#FF0000',    // 水平网格线的颜色
                // 'solid'|'dash'
                style: 'dash',       // 线的类型
                dashValue: [2, 2]
            },
   	        // 网格垂直线
            vertical: {
                show: true,
                size: 2,
                color: '#32CD32',
                // 'solid'|'dash'
                style: 'solid',
                dashValue: [2, 2]
            }
        },
    }

Các đối tượng cấu hình biểu đồ là các cấu trúc dữ liệu để thiết lập một số thuộc tính của biểu đồ, ngoại hình, v.v., ví dụ như cấu hình kiểu lưới được sử dụng trong ví dụ. Có rất nhiều tùy chọn có thể được cấu hình để sửa đổi, chẳng hạn như các thiết lập liên quan đến trục X, trục Y, thiết lập đường đèn, thiết lập thông báo gợi ý, thiết lập kiểu chỉ số kỹ thuật, thiết lập kiểu K-line BAR, v.v.

Nếu bạn chưa quen thuộc với những điều này, bạn đang gọiKLineChartCác hàm tạo đối tượng biểu đồ không thể truyền vào đối tượng cấu hình biểu đồ. Nếu không, biểu đồ sẽ được tạo theo kiểu mặc định.KLineChartChức năng tạo đồ thị:

var c = KLineChart(chartCfg)

Một số người đã sử dụng các mã này để thử nghiệm các đường lưới:

/*backtest
start: 2022-03-21 09:00:00
end: 2022-06-21 15:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

function main() {
    var chartCfg = {
        grid: {
            show: true,
            // 网格水平线
            horizontal: {
                show: true,
                size: 2,
                color: '#FF0000',
                // 'solid'|'dash'
                style: 'dash',
                dashValue: [2, 2]
            },
   	        // 网格垂直线
            vertical: {
                show: true,
                size: 2,
                color: '#32CD32',
                // 'solid'|'dash'
                style: 'solid',
                dashValue: [2, 2]
            }
        },
    }

    var c = KLineChart(chartCfg)

    // 策略主循环
    while(true) {
        // 轮询间隔
        Sleep(500)
        
        // 获取K线数据
        var bars = _C(exchange.GetRecords)
        bars.forEach(function(bar, index) {
            c.begin(bar)
            c.close()
        })
    
        // 策略交易逻辑
        // ...
        // ..
    }
}

img

Ví dụ về kiểu cấu hình biểu đồ

Có thể sử dụng để tham khảo các thiết lập kiểu cấu hình biểu đồ.

{
    // 网格线
    grid: {
        show: true,
        // 网格水平线
        horizontal: {
            show: true,
            size: 1,
            color: '#393939',
            // 'solid'|'dash'
            style: 'dash',
            dashValue: [2, 2]
        },
        // 网格垂直线
        vertical: {
            show: false,
            size: 1,
            color: '#393939',
            // 'solid'|'dash'
            style: 'dash',
            dashValue: [2, 2]
        }
    },
    // 蜡烛图
    candle: {
        // 蜡烛图上下间距,大于1为绝对值,大于0小余1则为比例
        margin: {
            top: 0.2,
            bottom: 0.1
        },
        // 蜡烛图类型 'candle_solid'|'candle_stroke'|'candle_up_stroke'|'candle_down_stroke'|'ohlc'|'area'
        type: 'candle_solid',
        // 蜡烛柱
        bar: {
            upColor: '#26A69A',
            downColor: '#EF5350',
            noChangeColor: '#888888'
        },
        // 面积图
        area: {
            lineSize: 2,
            lineColor: '#2196F3',
            value: 'close',
            backgroundColor: [{
                offset: 0,
                color: 'rgba(33, 150, 243, 0.01)'
            }, {
                offset: 1,
                color: 'rgba(33, 150, 243, 0.2)'
            }]
        },
        priceMark: {
            show: true,
            // 最高价标记
            high: {
                show: true,
                color: '#D9D9D9',
                textMargin: 5,
                textSize: 10,
                textFamily: 'Helvetica Neue',
                textWeight: 'normal'
            },
            // 最低价标记
            low: {
                show: true,
                color: '#D9D9D9',
                textMargin: 5,
                textSize: 10,
                textFamily: 'Helvetica Neue',
                textWeight: 'normal',
            },
            // 最新价标记
            last: {
                show: true,
                upColor: '#26A69A',
                downColor: '#EF5350',
                noChangeColor: '#888888',
                line: {
                    show: true,
                    // 'solid'|'dash'
                    style: 'dash',
                    dashValue: [4, 4],
                    size: 1
                },
                text: {
                    show: true,
                    size: 12,
                    paddingLeft: 2,
                    paddingTop: 2,
                    paddingRight: 2,
                    paddingBottom: 2,
                    color: '#FFFFFF',
                    family: 'Helvetica Neue',
                    weight: 'normal',
                    borderRadius: 2
                }
            }
        },
        // 提示
        tooltip: {
            // 'always' | 'follow_cross' | 'none'
            showRule: 'always',
            // 'standard' | 'rect'
            showType: 'standard',
            labels: ['时间', '开', '收', '高', '低', '成交量'],
            values: null,
            defaultValue: 'n/a',
            rect: {
                paddingLeft: 0,
                paddingRight: 0,
                paddingTop: 0,
                paddingBottom: 6,
                offsetLeft: 8,
                offsetTop: 8,
                offsetRight: 8,
                borderRadius: 4,
                borderSize: 1,
                borderColor: '#3f4254',
                backgroundColor: 'rgba(17, 17, 17, .3)'
            },
            text: {
                size: 12,
                family: 'Helvetica Neue',
                weight: 'normal',
                color: '#D9D9D9',
                marginLeft: 8,
                marginTop: 6,
                marginRight: 8,
                marginBottom: 0
            }
        }
    },
    // 技术指标
    technicalIndicator: {
        margin: {
            top: 0.2,
            bottom: 0.1
        },
        bar: {
            upColor: '#26A69A',
            downColor: '#EF5350',
            noChangeColor: '#888888'
        },
        line: {
            size: 1,
            colors: ['#FF9600', '#9D65C9', '#2196F3', '#E11D74', '#01C5C4']
        },
        circle: {
            upColor: '#26A69A',
            downColor: '#EF5350',
            noChangeColor: '#888888'
        },
        // 最新值标记
        lastValueMark: {
            show: false,
            text: {
                show: false,
                color: '#ffffff',
                size: 12,
                family: 'Helvetica Neue',
                weight: 'normal',
                paddingLeft: 3,
                paddingTop: 2,
                paddingRight: 3,
                paddingBottom: 2,
                borderRadius: 2
            }
        },
        // 提示
        tooltip: {
            // 'always' | 'follow_cross' | 'none'
            showRule: 'always',
            // 'standard' | 'rect'
            showType: 'standard',
            showName: true,
            showParams: true,
            defaultValue: 'n/a',
            text: {
                size: 12,
                family: 'Helvetica Neue',
                weight: 'normal',
                color: '#D9D9D9',
                marginTop: 6,
                marginRight: 8,
                marginBottom: 0,
                marginLeft: 8
            }
        }
    },
    // x轴
    xAxis: {
        show: true,
        height: null,
        // x轴线
        axisLine: {
            show: true,
            color: '#888888',
            size: 1
        },
        // x轴分割文字
        tickText: {
            show: true,
            color: '#D9D9D9',
            family: 'Helvetica Neue',
            weight: 'normal',
            size: 12,
            paddingTop: 3,
            paddingBottom: 6
        },
        // x轴分割线
        tickLine: {
            show: true,
            size: 1,
            length: 3,
            color: '#888888'
        }
    },
    // y轴
    yAxis: {
        show: true,
        width: null,
        // 'left' | 'right'
        position: 'right',
        // 'normal' | 'percentage' | 'log'
        type: 'normal',
        inside: false,
        reverse: false,
        // y轴线
        axisLine: {
            show: true,
            color: '#888888',
            size: 1
        },
        // y轴分割文字
        tickText: {
            show: true,
            color: '#D9D9D9',
            family: 'Helvetica Neue',
            weight: 'normal',
            size: 12,
            paddingLeft: 3,
            paddingRight: 6
        },
        // y轴分割线
        tickLine: {
            show: true,
            size: 1,
            length: 3,
            color: '#888888'
        }
    },
    // 图表之间的分割线
    separator: {
        size: 1,
        color: '#888888',
        fill: true,
        activeBackgroundColor: 'rgba(230, 230, 230, .15)'
    },
    // 十字光标
    crosshair: {
        show: true,
        // 十字光标水平线及文字
        horizontal: {
            show: true,
            line: {
                show: true,
                // 'solid'|'dash'
                style: 'dash',
                dashValue: [4, 2],
                size: 1,
                color: '#888888'
            },
            text: {
                show: true,
                color: '#D9D9D9',
                size: 12,
                family: 'Helvetica Neue',
                weight: 'normal',
                paddingLeft: 2,
                paddingRight: 2,
                paddingTop: 2,
                paddingBottom: 2,
                borderSize: 1,
                borderColor: '#505050',
                borderRadius: 2,
                backgroundColor: '#505050'
            }
        },
        // 十字光标垂直线及文字
        vertical: {
            show: true,
            line: {
                show: true,
                // 'solid'|'dash'
                style: 'dash',
                dashValue: [4, 2],
                size: 1,
                color: '#888888'
            },
            text: {
                show: true,
                color: '#D9D9D9',
                size: 12,
                family: 'Helvetica Neue',
                weight: 'normal',
                paddingLeft: 2,
                paddingRight: 2,
                paddingTop: 2,
                paddingBottom: 2,
                borderSize: 1,
                borderColor: '#505050',
                borderRadius: 2,
                backgroundColor: '#505050'
            }
        }
    },
    // 图形
    shape: {
        point: {
            backgroundColor: '#2196F3',
            borderColor: '#2196F3',
            borderSize: 1,
            radius: 4,
            activeBackgroundColor: '#2196F3',
            activeBorderColor: '#2196F3',
            activeBorderSize: 1,
            activeRadius: 6
        },
        line: {
            // 'solid'|'dash'
            style: 'solid'
            color: '#2196F3',
            size: 1,
            dashValue: [2, 2]
        },
        polygon: {
            // 'stroke'|'fill'
            style: 'stroke',
            stroke: {
                // 'solid'|'dash'
                style: 'solid',
                size: 1,
                color: '#2196F3',
                dashValue: [2, 2]
            },
            fill: {
                color: 'rgba(33, 150, 243, 0.1)'
            }
        },
        arc: {
            // 'stroke'|'fill'
            style: 'stroke',
            stroke: {
                // 'solid'|'dash'
                style: 'solid',
                size: 1,
                color: '#2196F3',
                dashValue: [2, 2]
            },
            fill: {
                color: '#2196F3'
            }
        },
        text: {
            style: 'fill',
            color: '#2196F3',
            size: 12,
            family: 'Helvetica Neue',
            weight: 'normal',
            offset: [0, 0]
        }
    },
    annotation: {
        // 'top' | 'bottom' | 'point'
        position: 'top',
        offset: [20, 0]
        symbol: {
            // 'diamond' | 'circle' | 'rect' | 'triangle' | 'custom' | 'none'
            type: 'diamond',
            size: 8,
            color: '#2196F3',
            activeSize: 10,
            activeColor: '#FF9600'
        }
    },
    tag: {
        // 'top' | 'bottom' | 'point'
        position: 'point',
        offset: 0,
        line: {
            show: true,
            style: LineStyle.DASH,
            dashValue: [4, 2],
            size: 1,
            color: '#2196F3'
        },
        text: {
            color: '#FFFFFF',
            backgroundColor: '#2196F3',
            size: 12,
            family: 'Helvetica Neue',
            weight: 'normal',
            paddingLeft: 2,
            paddingRight: 2,
            paddingTop: 2,
            paddingBottom: 2,
            borderRadius: 2,
            borderSize: 1,
            borderColor: '#2196F3'
        },
        mark: {
            offset: 0,
            color: '#FFFFFF',
            backgroundColor: '#2196F3',
            size: 12,
            family: 'Helvetica Neue',
            weight: 'normal',
            paddingLeft: 2,
            paddingRight: 2,
            paddingTop: 2,
            paddingBottom: 2,
            borderRadius: 2,
            borderSize: 1,
            borderColor: '#2196F3'
        }
    }
}

Có phải đó là cách đơn giản hơn để thiết kế các bản đồ chiến lược?


Có liên quan

Thêm nữa