Sumber dimuat naik... memuat...

Fungsi KlineChart memudahkan reka bentuk carta strategi

Penulis:Pencipta Kuantiti - Impian Kecil, Dicipta: 2022-07-01 15:54:06, Dikemas kini: 2023-09-18 20:11:05

img

Fungsi KlineChart memudahkan reka bentuk carta strategi

Apabila menggunakan bahasa JavaScript, Python, dan lain-lain. Pengguna yang tidak biasa dengan pengaturcaraan atau perpustakaan carta yang digunakan oleh platform FMZ sering mengalami kesukaran dalam merancang kod untuk melukis grafik pada carta khusus. Jadi, bagaimana anda boleh melukis carta strategi yang kaya dengan hanya menulis sedikit kod?

Ia boleh dilihat dalam bahasa Pine, yang terkenal dengan ciri gambar yang kaya. Jika anda dapat mengakses antara muka gambar bahasa Pine ke dalam strategi bahasa JavaScript, Python, maka ini sangat memudahkan pemaju untuk merancang strategi gambar. Oleh itu, platform FMZ meningkatkan fungsi gambar tersuai dan memperluaskan penggunaannya berdasarkan keperluan ini.KLineChartCara fungsi membuat grafik grafik tersuai. Lihat dokumentasi API:https://www.fmz.com/api#klinechart

Mari kita mulakan dengan menulis contoh mudah peralihan menggunakan bahasa JavaScript.

Contoh mudah

/*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)
    }
}

Contoh ini sangat mudah, hanya menggambar garis K di kawasan carta adat strategi, dan menggambar kurva transaksi pada kedudukan sub-gambar pada carta yang sepadan dengan setiap garis K BAR.

img

Kita mulakan dalam kod.var c = KLineChart()Objek grafik dicipta, yang kemudian digunakan untuk memanggil kaedahnya untuk membuat gambar. Kemudian dalam gelung, kita mendapatkan data baris K (struktur aritmatika) dan menjalankan operasi untuk melintasi Aritmatika baris K.

Operasi gambar akan bermula daric.begin(bar)Fungsi bermula.c.close()Fungsi berakhir.begincloseFungsi adalah kaedah untuk objek grafik c. Berikut adalah fungsi grafik yang paling biasa digunakan.plotLukiskan grafik jumlah transaksi pada setiap BAR.

Contoh yang agak rumit

Jika kita ingin merancang carta dengan petunjuk Brin. Oh ya! dan juga grafik garis transaksi untuk setiap BAR, kita boleh merancang seperti ini:

/*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()
        })
    
        // 策略交易逻辑
        // ...
        // ..
    }
}

Seperti yang dapat dilihat dalam kod, maklumat konfigurasi pengukuran semula kami di platform FMZ adalah:

/*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"}]
*/

Perisian ini digunakan untuk menguji semula objek pertukaran Binance, dan hasilnya adalah seperti berikut:

img

Seperti yang anda lihat, kami menggunakan cara gambar Pine untuk memudahkan kod gambar dalam bahasa JavaScript.

Menulis grafik data seperti penunjuk

Pengambilan data K-line, pengiraan penunjuk operasi ini adalah biasa dan sangat mudah dalam paradigma strategi dan dokumentasi API di Platform Strategi Square.

        // 获取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 indicator mempunyai tiga baris, jadi data yang dikembalikan oleh fungsi TA.BOLL adalah satu kumpulan dua dimensi. │boll[0],boll[1],boll[2] ialah tiga elemen dalam kumpulanboll, yang masing-masing mewakili satu baris, satu kumpulan.

  • boll[0]: Blinken dalam talian
  • boll[1]: Boll-Band tengah
  • boll[2]: Boll bawah talian

Kemudian kita akan melihat bagaimana untuk merangka data K-line kepada jumlah pertukaran, dan data Bryn indicator yang dikira pada carta.

Kita telah membuat grafik pada data baris K Bar demi Bar, jadi kita perlu melintasi seluruh artifak baris K, iaitu melintasi artifak bar dalam kod; digunakan di sini.forEachCara ini boleh digunakan untuk menyusuri, tetapi anda juga boleh menggunakannya untuk menyusuri.

        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()
        })

Perlu diingat bahawa setiap kali anda memulakan operasi mengetengahkan carta pada Bar, anda perlu melakukan ini terlebih dahulu.c.begin(bar)Fungsi panggilan,beginFungsi adalah satu kaedah untuk objek grafik kita c. Apabila operasi melukis selesai, panggilan diperlukan.c.close()◄ dalambeginFungsi dancloseAntara fungsi adalah fungsi gambar yang kita panggil seperti gambar gambar bahasa Pine.barcolor bgcolor plot fill hline plotarrow plotshape plotchar plotcandle signal, boleh menggambar garis, menggambar anak panah, menandai maklumat dan lain-lain. Parameter fungsi ini adalah sama dengan parameter fungsi yang sepadan dengan bahasa Pine, dan fungsi gambar juga sama.

Menambah gambar seperti anak panah isyarat dagangan, tanda, garis mendatar

Dalam contoh gambar indikator Brin di atas, beberapa anak panah isyarat dagangan, tanda, garis mendatar ditambah.

/*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

Oleh kerana teknik dalam bahasa Pine adalah untuk menandai isyarat secara automatik pada grafik,KLineChartObjek grafik yang dicipta oleh fungsi ini juga meluaskan fungsi yang digunakan untuk menggambar tanda membeli dan menjual:c.signal

Objek konfigurasi grafik

Satu struktur boleh dinyatakan untuk mengkonfigurasi gaya grafik, contohnya, variabel chartCfg berikut menunjukkan maklumat konfigurasi garis grid.

    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]
            }
        },
    }

Objek konfigurasi carta adalah untuk menetapkan beberapa sifat, penampilan dan struktur data carta, seperti yang digunakan dalam contoh adalah konfigurasi gaya grid. Terdapat banyak pilihan yang boleh dikonfigurasikan dan diubah, seperti tetapan yang berkaitan dengan sumbu X, sumbu Y, tetapan garis cahaya, tetapan isyarat, tetapan gaya penunjuk teknikal, tetapan gaya garis K BAR, dan sebagainya.

Jika anda belum terbiasa dengan semua ini, anda boleh menggunakan telefon bimbit.KLineChartFungsi boleh membuat objek carta tanpa menyampaikan objek konfigurasi carta. Jika tidak, grafik yang dibuat adalah gaya lalai. Fungsi API menggunakan platform FMZ.KLineChartFungsi mencipta objek grafik:

var c = KLineChart(chartCfg)

Gambar kod ujian untuk garis grid:

/*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

Contoh gaya konfigurasi grafik

Ia boleh digunakan untuk merujuk kepada tetapan gaya konfigurasi carta.

{
    // 网格线
    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'
        }
    }
}

Adakah ini akan menjadikan reka bentuk strategi grafik lebih mudah?


Berkaitan

Lebih lanjut

ShunKSyukur, terima kasih kerana berkongsi! Saya meminta satu senario, saya tidak tahu sama ada ia boleh dilakukan dengan menggunakan KlineChart pada peringkat ini. 1. Strategi adalah pelbagai jenis transaksi; 2. Menggambar grafik jenis yang ditetapkan secara lalai semasa memuat turun strategi, termasuk garis K, penunjuk, isyarat dagangan, dan lain-lain; 3. Melalui kotak penyaringan, pilih jenis dagangan lain untuk mendapatkan carta K garis sejarah sehingga garis K yang sepadan dengan masa sekarang. Tujuannya adalah untuk melihat secara langsung melalui carta sama ada pelbagai jenis dagangan adalah berpatutan untuk membuka perdagangan dan sama ada dagangan adalah normal.

ShunKBaik, terima!

Pencipta Kuantiti - Impian Kecil> 1, strategi adalah pelbagai jenis transaksi; Untuk pelbagai carta, fungsi KLineChart tidak disokong, anda boleh menggunakan antara muka carta Chart untuk merujuk kepada reka bentuk perpustakaan baris grafik pelbagai carta. > 2, Menggambar carta jenis yang ditetapkan secara lalai semasa memuat turun dasar, termasuk garis K, penunjuk, isyarat dagangan, dan lain-lain; Gambar tunggal boleh dilaksanakan. > 3, melalui kotak penyaringan, pilih jenis dagangan lain, mendapatkan carta K line sejarah sehingga garis K yang sepadan dengan masa sekarang. Grafik tunggal boleh dilaksanakan, dengan kod yang boleh ditulis untuk menyoal data K-line sejarah dan kemudian mengisi grafik. Jika ini adalah dasar pelbagai jenis, adalah disyorkan untuk menggunakan grafik fungsi Chart. Pada masa ini, fungsi KLineChart hanya dapat membuat grafik grafik tunggal.