Implementierung der JavaScript-Sprache für Fisher-Pointer und Grafiken auf FMZ

Schriftsteller:Kleine Träume, Erstellt: 2021-12-27 09:51:39, Aktualisiert: 2023-09-15 21:04:46

img

Implementierung der JavaScript-Sprache für Fisher-Pointer und Grafiken auf FMZ

Bei der technischen Analyse von Transaktionen werden die Aktienpreisdaten als Daten der normalen Verteilung analysiert und untersucht.Fisher TransformationDas ist eine Methode, um die Preisdaten in eine ähnliche Ordnungsverteilung zu konvertieren.Fisher TransformationVergleichen Sie die Marktdaten und beseitigen Sie einige scharfe kleine Zyklus-Schwankungen.

ÜberFisher TransformIch bin nicht derjenige, der über die meisten Informationen verfügt, aber ich weiß viel.

Die Algorithmen:

  • Der mittlere Preis heute:

    mid=(low + high) / 2

  • Für die Bestimmung des Rechenzyklus können Sie den 10-Tage-Zyklus verwenden.

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

  • Definition der Preisvariablen (von denenratioFür eine Konstante zwischen 0 und 1 (z. B. 0,5 oder 0,33):

    img

  • WechselkursparameterxNutzungFisherVerwandeln, bekommenFisherIndikatoren:

    img

Die Algorithmen werden in der JavaScript-Sprache realisiert.

Es ist wichtig zu beachten, dass der Algorithmus ein Iderationsalgorithmus ist, der für die Berechnung der Werte verwendet wird.preXpreFishSie beginnen alle mit 0 ≠ 0.Math.logDas ist die Basis der Naturkonstante e. Außerdem wurde in der oben genannten Algorithmus nicht erwähnt für die Änderung von x, ich habe dieses Problem beim Schreiben fast ignoriert:

Wenn der Wert von x größer als 0.99 ist, wird er zwangsläufig auf 0.999 festgelegt.

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

Das erste Mal, dass ich diesen Algorithmus, den Indikator, nach der Transplantation des Algorithmus gesehen habe. Ich habe diese Implementierung auch nicht überprüft, und Studenten, die daran interessiert sind, können überprüfen, ob es Fehler gibt.

Fisher TransformDer Quellcode für den Indikator-Algorithmus:

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
}

Zeichnung

Auf FMZ ist es ganz einfach, ein Bild zu zeichnen:https://www.fmz.com/squareEs gibt viele Beispiele, auf die man sich beziehen oder nach denen man suchen kann. In der Zwischenseite wird die Implementierung der oben genannten CalcFisher-Funktion in der folgenden Diagramm-Test-Code hinzugefügt, um ausgeführt zu werden.

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

Das ist eine sehr einfache Methode, um Daten, Grafiken und Designstrategien zu erforschen. Hier werfen Sie die Zitate und begrüßen Sie Ihre Lehrer und Kommentare.


Verwandt

Mehr