Beschreibung des Mechanismus für die Rückprüfung auf der Ebene der FMZ-Quantensimulation

Schriftsteller:- Ich bin ein Idiot., Erstellt: 2022-03-23 10:07:18, Aktualisiert: 2022-03-28 14:31:37

Beschreibung des Mechanismus für die Rückprüfung auf der Ebene der FMZ-Quantensimulation


  • 1.Rahmen für die Rückprüfung

    Das Strategieprogramm im FMZ Quant-Backtest ist ein kompletter Kontrollfluss, und das Programm wird ständig nach einer bestimmten Frequenz befragt. Jedes Marktangebot und die Daten, die von der Plattform-API zurückgegeben werden, simulieren die tatsächlichen Laufzeitsituationen, entsprechend der Anrufzeit. Der Backtest gehört zur OnTick-Ebene, nicht zur OnBar-Ebene anderer Backtestsysteme. Er unterstützt besser den Backtest von Strategien auf Basis von Ticker-Daten (Strategien mit höherer Betriebsfrequenz).

  • 2. Unterschiede zwischen Simulations- und Realmarktniveau

    • Simulationsstufe

      Der Backtest auf Simulationsebene basiert auf den unteren K-Liniendaten des Backtestsystems; er simuliert nach einem bestimmten Algorithmus im Rahmen des gegebenen höchsten Preises, des niedrigsten Preises, des offenen Preises und des Schlusskurses der zugrunde liegenden K-Line Bar die Interpolation von Tickerdaten in die Zeitreihen dieser Bar.

    • Realmarktniveau

      Der reale Marktspiegel-Backtest ist die tatsächlichen Tickerebene in der Zeitreihe von Bar. Bei einem echten Markt-Backtest handelt es sich bei Tickern um die tatsächlich erfassten Daten, nicht um simulierte Daten.

  • 3.Mechanismus zur Rückprüfung der Simulationsstufe Unterschicht K-Linie

    Es gibt keine Unterschicht-K-Linie-Option für den echten Markt-Backtest (weil die Tickerdaten real sind, wird die Unterschicht-K-Linie nicht für die Simulation verwendet). Im Simulations-Level-Backtest werden die Tickerdaten auf der Grundlage der K-Linie-Daten simuliert und generiert. Diese K-Linie-Daten sind die Unterschicht-K-Linie. Bei der tatsächlichen Durchführung des Simulations-Level-Backtests muss die Periode der Unterschicht-K-Linie kleiner sein als die Periode des Aufrufs der API, um die K-Linie zu erhalten, wenn die Strategie ausgeführt wird. Andernfalls können Sie aufgrund der großen Periode der Unterschicht-K-Linie und der unzureichenden Anzahl der generierten Tickers, wenn die API aufgerufen wird, um die K-Linie des angegebenen Zeitraums zu erhalten, die Daten verzerrt werden. Wenn Sie eine großperiodische K-Linie zum Zurücksetzen verwenden, können Sie die Unterschicht-K-Linie-Periode angemessen größer festlegen.

  • 4.Howerzeugt die Unterschicht K-Linie Tickerdaten?

    Der Mechanismus der simulierten Tickerausgabe der Unterschicht K-Linie ist derselbe wie bei MT4:verknüpfte Verbindung

    img img img img

  • 5. Die arithmetischen Codes, die Ticker-Daten erzeugen

    Der spezifische Algorithmus zur Umwandlung der unteren K-Liniendaten in simulierte Tickdaten:

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
}

Daher wird sich der Preis in der Zeitreihe bewegen, wenn der Simulations-Backtest ausgeführt wird.


Mehr