Implementación del lenguaje JavaScript del indicador Fisher y gráficos en FMZ

El autor:Un sueño pequeño., Creado: 2021-12-27 09:51:39, Actualizado: 2023-09-15 21:04:46

img

Implementación del lenguaje JavaScript del indicador Fisher y gráficos en FMZ

En el análisis técnico de las transacciones, los operadores analizan y estudian los datos de los precios de las acciones como datos de la distribución normal. Sin embargo, la distribución de los datos de los precios de las acciones no se ajusta a la distribución normal estándar.Fisher TransformationEs una forma de convertir los datos de precios en una distribución similar a la normal.Fisher TransformationPara que los datos del mercado se suavicen y se eliminen las pequeñas oscilaciones de los ciclos.

¿Qué es esto?Fisher TransformEn la actualidad, la mayoría de las personas que viven en la ciudad de Baidoa no tienen acceso a la información.

El algoritmo de los indicadores:

  • El precio medio de hoy:

    mid=(low + high) / 2

  • Para determinar el ciclo de cálculo, puede utilizarse un ciclo de 10 días.

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

  • Parámetros de variación de precio definidos (incluidosratioPara constantes entre 0 y 1, por ejemplo, 0.5 o 0.33):

    img

  • Parámetros de cambio de precioxUsoFisherTransformación, obtenidoFisherIndicadores:

    img

Utilizando el lenguaje JavaScript

El algoritmo es un algoritmo iterativo, que se utiliza para calcular la velocidad de las señales.preXpreFishEl principio es 0 ≠ 0.Math.logEs decir, los logaritmos basados en la constante natural e. Además, en el algoritmo anterior no se menciona la corrección de x, y casi ignoro este problema cuando escribí:

Si el valor de x es mayor que 0.99, el valor de corrección se establece como 0.999; menor que -0.99 es igual.

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

La primera vez que vi este algoritmo, el indicador, después de haber sido trasladado de acuerdo con el algoritmo.

Fisher TransformEl código fuente del algoritmo de indicadores:

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
}

Imágenes

En FMZ es muy sencillo dibujar un mapa: Plaza de la Estrategia:https://www.fmz.com/squareLos ejemplos anteriores pueden ser consultados o buscados. En el intervalo, el código de prueba del gráfico siguiente requiere agregar la implementación de la función calcFisher anterior para que funcione.

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

Por lo tanto, es muy conveniente estudiar datos, gráficos y estrategias de diseño en FMZ. Aquí se lanza el guión y se les da la bienvenida a los profesores y compañeros de clase.


Relacionados

Más.