Les ressources ont été chargées... Je charge...

L'implémentation du langage JavaScript pour les indicateurs Fisher et le dessin sur FMZ

Auteur:L'inventeur de la quantification - un petit rêve, Créé: 2021-12-27 09:51:39, Mis à jour: 2023-09-15 21:04:46

img

L'implémentation du langage JavaScript pour les indicateurs Fisher et le dessin sur FMZ

Lors de l'analyse technique des transactions, les traders analysent et étudient les données de prix des actions comme des données de distribution normale. Cependant, la distribution des données de prix des actions ne correspond pas à la distribution normale standard.Fisher TransformationIl s'agit d'une méthode permettant de convertir les données de prix en une distribution normale similaire.Fisher TransformationLisser les données du marché et éliminer les petites oscillations cycliques.

À proposFisher TransformIl y a beaucoup de choses à savoir, mais je n'en parlerai plus ici.

L'algorithme des indicateurs:

  • Le prix moyen aujourd'hui:

    mid=(low + high) / 2

  • Pour déterminer le cycle de calcul, on peut utiliser 10 jours pour le cycle.

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

  • Paramètres de variation de prix définis (dontratioPour une constante comprise entre 0 et 1, par exemple 0,5 ou 0,33):

    img

  • Paramètres de variation de prixxUtilisationFisherTransformer, obtenirFisherIndicateur:

    img

L'algorithme est réalisé en JavaScript

Il est important de noter que cet algorithme est un algorithme itératif, qui permet d'obtenir un résultat de la manière suivante:preXpreFishLe début est de 0 ≠ 0.Math.logL'algorithme n'est pas mentionné dans l'algorithme ci-dessus pour la correction de x, je l'ai presque ignoré en écrivant:

Si la valeur de la correction x est supérieure à 0,99, elle doit être définie comme 0,999 ; moins que -0,99 est synonyme.

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

La première fois que j'ai vu cet algorithme, l'indicateur, après avoir été transplanté selon l'algorithme. Je n'ai pas non plus vérifié l'implémentation, les étudiants intéressés peuvent vérifier s'il n'y a pas d'erreur. Merci de souligner l'erreur.

Fisher TransformLe code 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
}

Le dessin

Il est facile de dessiner sur FMZ, Stratégie Square:https://www.fmz.com/squareLes exemples ci-dessus peuvent être consultés ou recherchés. Dans le code de test graphique ci-dessous, il est nécessaire d'ajouter l'implémentation de la fonction calcFisher ci-dessus pour qu'elle fonctionne.

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

C'est pourquoi il est très pratique de rechercher des données, des graphiques, des stratégies de conception sur FMZ. Je vous souhaite la bienvenue, professeurs et camarades de classe.


Relationnée

Plus de