Thực hiện ngôn ngữ JavaScript của Fisher Pointer và vẽ trên FMZ

Tác giả:Giấc mơ nhỏ, Tạo: 2021-12-27 09:51:39, Cập nhật: 2023-09-15 21:04:46

img

Thực hiện ngôn ngữ JavaScript của Fisher Pointer và vẽ trên FMZ

Khi phân tích kỹ thuật trong giao dịch, các nhà giao dịch đều phân tích và nghiên cứu dữ liệu giá cổ phiếu như dữ liệu phân bố bình thường. Tuy nhiên, phân bố dữ liệu giá cổ phiếu không phù hợp với phân bố bình thường tiêu chuẩn.Fisher TransformationĐây là một phương pháp để chuyển đổi dữ liệu giá thành thành một phân bố bình thường tương tự.Fisher TransformationĐơn giản hóa dữ liệu thị trường, loại bỏ một số dao động chu kỳ nhỏ sắc nét. Sử dụng sự giao thoa của các chỉ số trong ngày và ngày trước đó để phát tín hiệu giao dịch.

VềFisher TransformNhững người tham gia vào cuộc họp này đã nói rằng họ không biết nhiều về vấn đề này.

Các thuật toán:

  • Giá trung bình hôm nay:

    mid=(low + high) / 2

  • Để xác định chu kỳ tính toán, bạn có thể sử dụng chu kỳ 10 ngày. Giá cao nhất và thấp nhất trong chu kỳ tính toán:

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

  • Định nghĩa các tham số biến giá (( trong đóratioĐối với các định số trong khoảng 0 - 1, ví dụ như 0.5 hoặc 0.33):

    img

  • Các tham số thay đổi giáxSử dụngFisherchuyển đổi, nhận đượcFisherChỉ số:

    img

Sử dụng ngôn ngữ JavaScript để thực hiện thuật toán này

Theo thuật toán chỉ số này được thực hiện từng bước.preXpreFishChúng tôi sẽ bắt đầu bằng 0 ≠ 0.Math.logVà nếu bạn muốn tính toán con số này, bạn cần phải tính toán con số này bằng cách tính toán con số tự nhiên e.

Giá trị của x sửa đổi lớn hơn 0,99 buộc phải được đặt là 0,999; nhỏ hơn -0,99 đồng nghĩa.

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

Lần đầu tiên nhìn vào thuật toán, chỉ số, sau khi được chuyển theo thuật toán. Tôi cũng không xác minh thực hiện này, các đồng nghiệp quan tâm có thể kiểm tra xem có lỗi không.

Fisher TransformNguồn mã của thuật toán chỉ số:

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
}

Hình ảnh

Trong một bài viết đăng trên trang Facebook của mình, ông cho biết:https://www.fmz.com/squareNhững ví dụ trên có thể được tham khảo hoặc tìm kiếm. Giữa bài viết, mã kiểm tra hình ảnh dưới đây cần thêm thực hiện hàm calcFisher trên để chạy.

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

img

Vì vậy, nghiên cứu dữ liệu, biểu đồ, chiến lược thiết kế trên FMZ là rất thuận tiện. Bạn có thể tham gia vào chương trình này để tìm hiểu thêm về các vấn đề liên quan đến các giáo viên và học sinh.


Có liên quan

Thêm nữa