avatar of 发明者量化-小小梦 发明者量化-小小梦
Suivre Messages privés
4
Suivre
1271
Abonnés

Implémentation du langage JavaScript de l'indicateur Fisher et dessin sur FMZ

Créé le: 2021-12-27 09:51:39, Mis à jour le: 2024-12-02 21:37:27
comments   0
hits   1434

Implémentation du langage JavaScript de l’indicateur Fisher et dessin sur FMZ

Implémentation du langage JavaScript de l’indicateur Fisher et dessin sur FMZ

Lorsqu’ils effectuent une analyse technique dans le trading, les traders analysent et étudient les données sur le cours des actions comme des données normalement distribuées. Cependant, la distribution des données sur le cours des actions n’est pas conforme à la distribution normale standard.Fisher TransformationC’est une méthode qui permet de transformer les données de prix en une distribution normale.Fisher TransformationLissez les données du marché et éliminez certaines oscillations brusques de petits cycles. Les signaux de trading peuvent être générés en utilisant le croisement des indicateurs du jour en cours et du jour précédent.

à proposFisher TransformIl y a beaucoup d’informations sur Baidu et Zhihu, donc je n’entrerai pas dans les détails ici.

Algorithme de l’indicateur :

  • Prix ​​moyen du jour :

mid=(low + high) / 2

  • Déterminez la période de calcul, vous pouvez utiliser 10 jours comme période. Calculez les prix les plus élevés et les plus bas au cours de la période :

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

  • Définir les paramètres de changement de prix (oùratioest une constante comprise entre 0 et 1, par exemple 0,5 ou 0,33) :

Implémentation du langage JavaScript de l’indicateur Fisher et dessin sur FMZ

  • Paramètres de changement de prixxutiliserFisherTransformer, obtenirFisherindice:

Implémentation du langage JavaScript de l’indicateur Fisher et dessin sur FMZ

Implémenter l’algorithme à l’aide de JavaScript

Implémentez-le étape par étape selon l’algorithme de l’indicateur. Il convient de noter que cet algorithme est un algorithme itératif.preXpreFishInitialement réglé sur 0. pourMath.logIl s’agit de trouver le logarithme avec la constante naturelle e comme base. De plus, l’algorithme ci-dessus ne mentionne pas la correction de x, et j’ai presque négligé ce problème en l’écrivant :

Corrigez la valeur de x. Si elle est supérieure à 0,99, elle sera forcée à 0,999. Il en va de même si elle est inférieure à -0,99.

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

La première fois que j’ai regardé cet algorithme et ces indicateurs, je les ai transplantés selon l’algorithme. Je n’ai pas vérifié cette implémentation. Les étudiants intéressés par la recherche peuvent vérifier s’il y a des erreurs. Merci beaucoup d’avoir signalé l’erreur.

Fisher TransformCode source de l’algorithme de l’indicateur :

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
}

Dessin

Dessiner sur FMZ est très simple, Strategy Square :https://www.fmz.com/squareIl existe de nombreux exemples ci-dessus pour référence ou recherche. En raison de la longueur de l’article, le code de test de dessin suivant doit ajouter l’implémentation de la fonction calcFisher ci-dessus avant de pouvoir s’exécuter.

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

Implémentation du langage JavaScript de l’indicateur Fisher et dessin sur FMZ

Il est donc très pratique d’étudier les données, d’afficher des graphiques et de concevoir des stratégies sur FMZ. Ceci n’est qu’un point de départ, et les enseignants et les étudiants sont invités à laisser des commentaires.