avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada Pesan pribadi
4
fokus pada
1271
Pengikut

Implementasi dan penggambaran bahasa JavaScript indikator Fisher di FMZ

Dibuat di: 2021-12-27 09:51:39, diperbarui pada: 2024-12-02 21:37:27
comments   0
hits   1434

Implementasi dan penggambaran bahasa JavaScript indikator Fisher di FMZ

Implementasi dan penggambaran bahasa JavaScript indikator Fisher di FMZ

Ketika melakukan analisis teknis dalam perdagangan, pedagang menganalisis dan mempelajari data harga saham sebagai data yang terdistribusi normal. Namun, distribusi data harga saham tidak sesuai dengan distribusi normal standar.Fisher TransformationIni adalah metode yang dapat mengubah data harga menjadi distribusi normal.Fisher TransformationMemperhalus data pasar dan menghilangkan beberapa osilasi siklus kecil yang tajam. Sinyal perdagangan dapat dihasilkan dengan menggunakan persilangan indikator untuk hari ini dan hari sebelumnya.

tentangFisher TransformAda banyak informasi tentang Baidu dan Zhihu, jadi saya tidak akan membahas detailnya di sini.

Algoritma indikator:

  • Harga tengah hari ini:

mid=(low + high) / 2

  • Tentukan periode perhitungannya, Anda dapat menggunakan 10 hari sebagai periodenya. Hitung harga tertinggi dan terendah dalam periode:

lowestLow = 周期内最低价highestHigh = 周期内最高价

  • Tentukan parameter perubahan harga (dimanaratioadalah konstanta antara 0 dan 1, misalnya 0,5 atau 0,33):

Implementasi dan penggambaran bahasa JavaScript indikator Fisher di FMZ

  • Parameter perubahan hargaxmenggunakanFisherTransformasi, dapatkanFisherindeks:

Implementasi dan penggambaran bahasa JavaScript indikator Fisher di FMZ

Menerapkan algoritma menggunakan JavaScript

Terapkan langkah demi langkah sesuai dengan algoritma indikator. Perlu dicatat bahwa algoritma ini adalah algoritma iteratif.preXpreFishAwalnya ditetapkan ke 0. untukMath.logYaitu mencari logaritma dengan konstanta alami e sebagai basis. Selain itu, algoritma di atas tidak menyebutkan koreksi x, dan saya hampir mengabaikan masalah ini saat menulisnya:

Perbaiki nilai x. Jika lebih besar dari 0,99, maka akan dipaksa menjadi 0,999. Hal yang sama berlaku jika kurang dari -0,99.

        if (x > 0.99) {
            x = 0.999
        } else if (x < -0.99) {
            x = -0.999
        }

Pertama kali saya melihat algoritma dan indikator ini, saya memindahkannya sesuai dengan algoritma tersebut. Saya belum memverifikasi implementasi ini. Mahasiswa yang tertarik dalam penelitian dapat memverifikasi apakah ada kesalahan. Terima kasih banyak telah menunjukkan kesalahannya.

Fisher TransformKode sumber algoritma indikator:

function getHighest(arr, period) {
    if (arr.length == 0 || arr.length - period < 0) {
        return null 
    }
    var beginIndex = arr.length - period
    var ret = arr[beginIndex].High
    for (var i = 0 ; i < arr.length - 1 ; i++) {
        if (arr[i + 1].High > ret) {
            ret = arr[i + 1].High
        }
    }
    return ret
}

function getLowest(arr, period) {
    if (arr.length == 0 || arr.length - period < 0) {
        return null 
    }
    var beginIndex = arr.length - period
    var ret = arr[beginIndex].Low
    for (var i = 0 ; i < arr.length - 1 ; i++) {
        if (arr[i + 1].Low < ret) {
            ret = arr[i + 1].Low
        }
    }
    return ret
}

function calcFisher(records, ratio, period) {
    var preFish = 0 
    var preX = 0
    var arrFish = []
    // 当K线长度不足,不满足周期时
    if (records.length < period) {
        for (var i = 0 ; i < records.length ; i++) {
            arrFish.push(0)
        }
        return arrFish
    }

    // 遍历K线
    for (var i = 0 ; i < records.length ; i++) {
        var fish = 0
        var x = 0
        var bar = records[i]
        var mid = (bar.High + bar.Low) / 2
        // 当前BAR不足period计算时
        if (i < period - 1) {
            fish = 0
            preFish = 0
            arrFish.push(fish)
            continue
        }

        // 计算周期内最高价和最低价
        var bars = []
        for (var j = 0 ; j <= i ; j++) {
            bars.push(records[j])
        }
        var lowestLow = getLowest(bars, period)
        var highestHigh = getHighest(bars, period)               
        
        // 价变参数
        x = ratio * 2 * ((mid - lowestLow) / (highestHigh - lowestLow) - 0.5) + (1 - ratio) * preX
        if (x > 0.99) {
            x = 0.999
        } else if (x < -0.99) {
            x = -0.999
        }
        preX = x 
        fish = 0.5 * Math.log((1 + x) / (1 - x)) + 0.5 * preFish
        preFish = fish
        arrFish.push(fish)
    }
    return arrFish
}

Menggambar

Menggambar di FMZ sangat sederhana, Strategy Square:https://www.fmz.com/squareAda banyak contoh di atas untuk referensi atau pencarian. Karena panjangnya artikel ini, kode uji gambar berikut perlu menambahkan implementasi fungsi calcFisher di atas sebelum dapat dijalankan.

var cfg = {    // 用来初始化设置图表的对象(即图表设置)
    plotOptions: {
        candlestick: {
            color: '#d75442',  // 颜色值
            upColor: '#6ba583' // 颜色值
        }
    },
    title: { text: 'Fisher Transform'},     //标题
    subtitle: {text: ''},     //副标题
    plotOptions: {
        candlestick: {
        tooltip: {
            pointFormat: 
            '<span style="color:{point.color}">\u25CF</span> <b> {series.name}</b><br/>' +
            '开盘: {point.open}<br/>' +
            '最高: {point.high}<br/>' +
            '最低: {point.low}<br/>' +
            '收盘: {point.close}<br/>'
            }
        }
    },
    yAxis: [{
        title: {
            text: 'K线行情'
        },
        height: '70%',
        lineWidth: 1
    }, {
        title: {
            text: 'Fisher Transform'
        },
        top: '75%',
        height: '30%',
        offset: 0,
        lineWidth: 1
    }],
    series: [//系列
        {
            type: 'candlestick',
            yAxis: 0,
            name: 'K线',
            id: 'KLine',
            // 控制走势为跌的蜡烛颜色
            color: 'green',
            lineColor: 'green',
            // 控制走势为涨的蜡烛颜色
            upColor: 'red',
            upLineColor: 'red',
            data: []
        },{
            type: 'line',         // 设置当前的数据序列 类型为: 线
            yAxis: 1,             // 使用的y轴 为索引为 0 的y轴(highcharts 图表 可以有 多个 y 坐标轴,这里指定索引0的y轴)
            showInLegend: true,   // 
            name: 'fish',          // 根据 函数传入的 参数 label 设置
            lineWidth: 1,
            data: [],             // 数据序列的数据项
            tooltip: {            // 工具提示
                valueDecimals: 2  // 值的小数点 保留5位
            }
        },{
            type: 'line',         // 设置当前的数据序列 类型为: 线
            yAxis: 1,             // 使用的y轴 为索引为 0 的y轴(highcharts 图表 可以有 多个 y 坐标轴,这里指定索引0的y轴)
            showInLegend: true,   // 
            name: 'preFish',      // 根据 函数传入的 参数 label 设置
            lineWidth: 1,
            data: [],             // 数据序列的数据项
            tooltip: {            // 工具提示
                valueDecimals: 2  // 值的小数点 保留5位
            }
        }
    ]
}

var chart = Chart(cfg)
function main() {
    var ts = 0
    chart.reset()
    while (true) {
        var r = exchange.GetRecords()
        var fisher = calcFisher(r, 0.33, 10)                
        if (!r || !fisher) {
            Sleep(500)
            continue
        }
        
        for (var i = 0; i < r.length; i++){
            if (ts == r[i].Time) {
                chart.add([0,[r[i].Time, r[i].Open, r[i].High, r[i].Low, r[i].Close], -1])
                chart.add([1,[r[i].Time, fisher[i]], -1])
                if (i - 1 >= 0) {
                    chart.add([2,[r[i].Time, fisher[i - 1]], -1])
                }
            }else if (ts < r[i].Time) {
                chart.add([0,[r[i].Time, r[i].Open, r[i].High, r[i].Low, r[i].Close]])
                chart.add([1,[r[i].Time, fisher[i]]])
                if (i - 1 >= 0) {
                    chart.add([2,[r[i].Time, fisher[i - 1]]])
                }
                ts = r[i].Time
            }
        }
    }
}

Implementasi dan penggambaran bahasa JavaScript indikator Fisher di FMZ

Oleh karena itu, sangat mudah untuk mempelajari data, menampilkan grafik, dan merancang strategi di FMZ. Ini hanyalah titik awal, dan guru serta siswa dipersilakan untuk meninggalkan komentar.