Descrição do mecanismo de ensaio posterior de nível de simulação quântica FMZ

Autora:Ninabadass, Criado: 2022-03-23 10:07:18, Atualizado: 2022-03-28 14:31:37

Descrição do mecanismo de ensaio posterior de nível de simulação quântica FMZ


  • 1.Quadro de testes de retrospectiva

    O programa de estratégia no FMZ Quant backtest, o programa de estratégia é um fluxo de controle completo, e o programa é constantemente pesquisado de acordo com uma certa frequência. Cada cotação de mercado e dados retornados pela API da plataforma simulam as situações de tempo de execução reais, de acordo com o tempo de chamada. O backtest pertence ao nível onTick, não ao nível onBar de outros sistemas de backtest. Ele suporta melhor o backtest de estratégias baseadas em dados Ticker (estratégias com maior frequência de operação).

  • 2. Diferenças entre o nível de simulação e o nível de mercado real

    • Nível de simulação

      O backtest de nível de simulação baseia-se nos dados da linha K subjacente do sistema de backtest; ele, de acordo com um certo algoritmo, no quadro composto pelo preço mais alto, pelo preço mais baixo, pelo preço de abertura e pelo preço de fechamento da barra de linha K subjacente, simula a interpolação dos dados do ticker na série temporal desta barra.

    • Nível de mercado real

      Para estratégias baseadas em dados de nível de ticker, usar o backtest de nível de mercado real é mais próximo da realidade. No backtest ao nível do mercado real, o ticker é os dados realmente registados, não simulados.

  • Mecanismo de ensaio posterior de nível de simulação Linha K subcamada

    Não existe uma opção de linha K subcapa para backtest de nível de mercado real (porque os dados do ticker são reais, a linha K subcapa não será utilizada para simulação). No backtest do nível de simulação, os dados do ticker são simulados e gerados com base nos dados da linha K. Estes dados da linha K são a linha K da subcamada. Na operação real do backtest do nível de simulação, o período da linha K da subcamada deve ser menor do que o período de chamada da API para obter a linha K, quando a estratégia está sendo executada. Caso contrário, devido ao grande período da linha K da subcamada e ao número insuficiente de tickers gerados, quando a API é chamada para obter a linha K do período especificado, os dados serão distorcidos. Ao usar uma linha K de grande período para voltar, você pode definir apropriadamente o período da linha K da subcamada maior.

  • 4.HowA linha K da camada subjacente gera dados de ticker?

    O mecanismo da linha K subcamada que gera um ticker simulado é o mesmo do MT4:link relacionado

    img img img img

  • 5. Os códigos aritméticos que geram dados do ticker

    Algoritmo específico para converter os dados da linha K da camada subjacente em dados de tick simulados:

function recordsToTicks(period, num_digits, records) {
    // http://www.metatrader5.com/en/terminal/help/tick_generation
    if (records.length == 0) {
        return []
    }
    var ticks = []
    var steps = [0, 2, 4, 6, 10, 12, 16, 18, 23, 25, 27, 29]
    var pown = Math.pow(10, num_digits)

    function pushTick(t, price, vol) {
        ticks.push([Math.floor(t), Math.floor(price * pown) / pown, vol])
    }

    for (var i = 0; i < records.length; i++) {
        var T = records[i][0]
        var O = records[i][1]
        var H = records[i][2]
        var L = records[i][3]
        var C = records[i][4]
        var V = records[i][5]
        if (V > 1) {
            V = V - 1
        }
        if ((O == H) && (L == C) && (H == L)) {
            pushTick(T, O, V)
        } else if (((O == H) && (L == C)) || ((O == L) && (H == C))) {
            pushTick(T, O, V)
        } else if ((O == C) && ((O == L) || (O == H))) {
            pushTick(T, O, V / 2)
            pushTick(T + (period / 2), (O == L ? H : L), V / 2)
        } else if ((C == H) || (C == L)) {
            pushTick(T, O, V / 2)
            pushTick(T + (period * 0.382), (C == L ? H : L), V / 2)
        } else if ((O == H) || (O == L)) {
            pushTick(T, O, V / 2)
            pushTick(T + (period * 0.618), (O == L ? H : L), V / 2)
        } else {
            var dots = []
            var amount = V / 11
            pushTick(T, O, amount)
            if (C > O) {
                dots = [
                    O - (O - L) * 0.75,
                    O - (O - L) * 0.5,
                    L,
                    L + (H - L) / 3.0,
                    L + (H - L) * (4 / 15.0),
                    H - (H - L) / 3.0,
                    H - (H - L) * (6 / 15.0),
                    H,
                    H - (H - C) * 0.75,
                    H - (H - C) * 0.5,
                ]
            } else {
                dots = [
                    O + (H - O) * 0.75,
                    O + (H - O) * 0.5,
                    H,
                    H - (H - L) / 3.0,
                    H - (H - L) * (4 / 15.0),
                    H - (H - L) * (2 / 3.0),
                    H - (H - L) * (9 / 15.0),
                    L,
                    L + (C - L) * 0.75,
                    L + (C - L) * 0.5,
                ]
            }
            for (var j = 0; j < dots.length; j++) {
                pushTick(T + period * (steps[j + 1] / 30.0), dots[j], amount)
            }
        }
        pushTick(T + (period * 0.98), C, 1)
    }
    return ticks
}

Por conseguinte, haverá movimentos de preços nas séries temporais, quando o backtest de nível de simulação for executado.


Mais.