O recurso está a ser carregado... Carregamento...

Realização de Fisher Indicator em JavaScript & Plotting em FMZ

Autora:Ninabadass, Criado: 2022-04-07 16:04:22, Atualizado:

Realização de Fisher Indicator em JavaScript & Plotting em FMZ

Durante a análise técnica na negociação, todos os comerciantes tomam dados de preços de ações como dados normalmente distribuídos para analisar e estudar.Fisher Transformationé um método que pode transformar dados de preços em algo semelhante a uma distribuição normal.Fisher TransformationOs sinais de negociação podem ser enviados através da interligação dos indicadores de hoje e dos indicadores de dia anterior.

Há tantas referências sobreFisher Transformationem Baidu e Zhihu, que não serão explicados aqui em detalhes.

Algoritmo do indicador:

  • Preço médio de hoje:

    mid=(low + high) / 2

  • Confirme o período de cálculo; pode utilizar 10 dias por período. Calcule o preço mais alto e o preço mais baixo do período:

    lowestLow = the lowest price in the periodhighestHigh = the highest price in the period.

  • Definir o parâmetro de variação de preços (em queratioé uma constante de 0 a 1; por exemplo, você pode escolher 0,5 ou 0.33):(

    img

  • AplicaçãoFishertransformação para o parâmetro de variação de preçox, e oFisherO indicador pode ser obtido:

    img

Use o JavaScript para realizar o algoritmo

De acordo com o algoritmo indicador, realizá-lo passo a passo.preX, preFish, são inicialmente definidos em 0.Math.logé o logaritmo baseado na constante natural e Além disso, a modificação de x não é mencionado no algoritmo acima, e eu quase ignorou este problema durante a escrita:

Modificar o valor de x; se o valor for superior a 0,99, forçadamente definido em 0,999; se for inferior a -0,99, definido em -0,999.

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

Esta é a primeira vez que vejo o algoritmo e o indicador, depois de portá-lo de acordo com o algoritmo. Eu não verifiquei a implementação, e os estudantes que estão interessados em pesquisa podem verificar se há erros.

Código fonte deFisher TransformAlgoritmo do indicador:

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 = []
    // when the K-line length is not long enough to meet the K-line period 
    if (records.length < period) {
        for (var i = 0 ; i < records.length ; i++) {
            arrFish.push(0)
        }
        return arrFish
    }

    // traverse K-lines
    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
        // when the current BAR is not enough for period to calculate 
        if (i < period - 1) {
            fish = 0
            preFish = 0
            arrFish.push(fish)
            continue
        }

        // calculate the highest price and the lowest price in the period 
        var bars = []
        for (var j = 0 ; j <= i ; j++) {
            bars.push(records[j])
        }
        var lowestLow = getLowest(bars, period)
        var highestHigh = getHighest(bars, period)               
        
        // price change parameter x
        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
}

Trama

É muito fácil de traçar em FMZ; você pode se referir a um monte de exemplos no quadrado estratégia:https://www.fmz.com/square, e você também pode procurar as estratégias que você precisa.

var cfg = {    // used to initially configure the chart objects (namely chart settings)
    plotOptions: {
        candlestick: {
            color: '#d75442',  // color value 
            upColor: '#6ba583' // color vlaue 
        }
    },
    title: { text: 'Fisher Transform'},     //title
    subtitle: {text: ''},     //subtitle
    plotOptions: {
        candlestick: {
        tooltip: {
            pointFormat: 
            '<span style="color:{point.color}">\u25CF</span> <b> {series.name}</b><br/>' +
            'open: {point.open}<br/>' +
            'highest: {point.high}<br/>' +
            'lowest: {point.low}<br/>' +
            'close: {point.close}<br/>'
            }
        }
    },
    yAxis: [{
        title: {
            text: 'K-line market quote'
        },
        height: '70%',
        lineWidth: 1
    }, {
        title: {
            text: 'Fisher Transform'
        },
        top: '75%',
        height: '30%',
        offset: 0,
        lineWidth: 1
    }],
    series: [//series
        {
            type: 'candlestick',
            yAxis: 0,
            name: 'K-line',
            id: 'KLine',
            // control the candlestick color of fall
            color: 'green',
            lineColor: 'green',
            // control the candlestick color of rise 
            upColor: 'red',
            upLineColor: 'red',
            data: []
        },{
            type: 'line',         // set the type of the current data series as: line 
            yAxis: 1,             // the y axis for use is the y axis with index 0 (in highcharts, there can be multiple y axis, and here it indicates the y axis with index 0) 
            showInLegend: true,   // 
            name: 'fish',          // set according the parameter label  passed by the function
            lineWidth: 1,
            data: [],             // data item of the data series
            tooltip: {            // tip for tool
                valueDecimals: 2  //  the decimals of the value reserve 5
            }
        },{
            type: 'line',         // set the type of the current data series as: line 
            yAxis: 1,             // the y axis for use is the y axis with index 0 (in highcharts, there can be multiple y axis, and here it indicates the y axis with index 0) 
            showInLegend: true,   // 
            name: 'preFish',      // set according the parameter label  passed by the function 
            lineWidth: 1,
            data: [],             // data item of the data series 
            tooltip: {            // tip for tool
                valueDecimals: 2  // the decimals of the value reserve 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

Portanto, é muito conveniente estudar dados, exibição de gráficos e design de estratégia no FMZ. Aqui começo a discussão para mais ideias, por isso, bem-vindos professores e alunos aqui para deixar comentários.


Mais.