Ajouter un réveil à la stratégie de trading

Auteur:La bonté, Créé: 2020-08-06 11:15:28, Mis à jour: 2023-10-10 21:14:31

img

Les traders qui conçoivent des stratégies de trading me demandent souvent comment concevoir des fonctions de chronométrage pour les stratégies afin que les stratégies puissent gérer certaines tâches à des moments précis. Par exemple, certaines stratégies intraday doivent fermer des positions avant la fin de la première section d'une journée de trading. Comment concevoir de telles exigences dans la stratégie de trading? Une stratégie peut utiliser beaucoup de contrôle du temps. De cette façon, nous pouvons encapsuler la fonction de contrôle du temps pour minimiser le couplage entre le code de contrôle du temps et la stratégie, de sorte que le module de contrôle du temps puisse être réutilisé et soit concis dans son utilisation.

Concevoir une horloge d'alarme

// triggerTime: 14:58:00
function CreateAlarmClock(triggerHour, triggerMinute) {
    var self = {} // constructed object
    // Set members and functions to the constructed object below
    
    self.isTrigger = false // Has it been triggered that day
    self.triggerHour = triggerHour // The planned trigger hour
    self.triggerMinute = triggerMinute // The planned trigger minute
    self.nowDay = new Date().getDay() // what day is the current time
    
    self.Check = function() { // Check function, check trigger, return true when triggered, return false if not triggered
        var t = new Date() // Get the current time object
        var hour = t.getHours() // Get the current decimal: 0~23
        var minute = t.getMinutes() // Get the current minute: 0~59
        var day = t.getDay() // Get the current number of days

        if (day != self.nowDay) { // Judge, if the current day is not equal to the day of the record, reset the trigger flag as not triggered and update the number of days for the record
            self.isTrigger = false
            self.nowDay = day
        }

        if (self.isTrigger == false && hour == self.triggerHour && minute >= self.triggerMinute) {
            // Determine whether the time is triggered, if it meets the conditions, set the flag isTrigger to true to indicate that it has been triggered
            self.isTrigger = true
            return true
        }

        return false // does not meet the trigger condition, that is, it is not triggered
    }

    return self // return the constructed object
}

Nous avons conçu et implémenté une fonction pour créer un objet d'alarme (peut être compris comme un constructeur), et d'autres langages peuvent directement concevoir une classe d'alarme (par exemple, en utilisant Python, nous en implémenterons une dans Python plus tard).

Concevez la fonction pour construire l'objet horloge d'alarme, et n'avez besoin que d'une ligne de code pour créer un objet horloge d'alarme en cours d'utilisation.

var t = CreateAlarmClock(14, 58)

Par exemple, créer un objet t et le déclencher à 14h58 tous les jours. Vous pouvez créer un autre objet t1, qui est déclenché tous les jours à 9h.

var t1 = CreateAlarmClock(9, 0)

Stratégie de test

Nous écrivons une stratégie de test. La stratégie utilise le système de moyenne mobile le plus simple. La stratégie est juste pour le test et ne se soucie pas du profit. Le plan stratégique consiste à ouvrir une position (longue, courte, sans transaction) sur la base de la moyenne mobile journalière de la croix dorée et de la croix morte lorsque le marché ouvre à 9h00 tous les jours, et à fermer la position à 14h58 de l'après-midi (close à 15h00).

function CreateAlarmClock(triggerHour, triggerMinute) {
    var self = {} // constructed object
    // Set members and functions to the constructed object below
    
    self.isTrigger = false // Has it been triggered that day
    self.triggerHour = triggerHour // The planned trigger hour
    self.triggerMinute = triggerMinute // The planned trigger minute
    self.nowDay = new Date().getDay() // what day is the current time
    
    self.Check = function() {// Check function, check trigger, return true when triggered, return false if not triggered
        var t = new Date() // Get the current time object
        var hour = t.getHours() // Get the current decimal: 0~23
        var minute = t.getMinutes() // Get the current minute: 0~59
        var day = t.getDay() // Get the current number of days

        if (day != self.nowDay) {// Judge, if the current day is not equal to the day of the record, reset the trigger flag as not triggered and update the number of days for the record
            self.isTrigger = false
            self.nowDay = day
        }

        if (self.isTrigger == false && hour == self.triggerHour && minute >= self.triggerMinute) {
            // Determine whether the time is triggered, if it meets the conditions, set the flag isTrigger to true to indicate that it has been triggered
            self.isTrigger = true
            return true
        }

        return false // does not meet the trigger condition, that is, it is not triggered
    }

    return self // return the constructed object
}

function main() {
    var q = $.NewTaskQueue()
    var p = $.NewPositionManager()
    
    // You can write: var t = CreateAlarmClock(14, 58)
    // You can write: var t1 = CreateAlarmClock(9, 0)
    
    var symbol = "i2009"
    while (true) {
        if (exchange.IO("status")) {
            exchange.SetContractType(symbol)
            var r = exchange.GetRecords()
            if(!r || r.length <20) {
                Sleep(500)
                continue
            }
            if (/*Judging the conditions for opening a position at 9:00*/) {// You can write: t1.Check()
                var fast = TA.MA(r, 2)
                var slow = TA.MA(r, 5)
                
                var direction = ""
                if (_Cross(fast, slow) == 1) {
                    direction = "buy"
                } else if(_Cross(fast, slow) == -1) {
                    direction = "sell"
                }
                if(direction != "") {
                    q.pushTask(exchange, symbol, direction, 1, function(task, ret) {
                        Log(task.desc, ret)
                    })
                }
            }

            if (/*Judging 14:58 conditions for closing the position near the market close*/) {// You can write: t.Check()
                p.CoverAll()
            }

            q.poll()
            LogStatus(_D())
        } else {
            LogStatus(_D())
        }

        Sleep(500)
    }
}

Mettez leCreateAlarmClockDans la stratégie pour déterminer la position d'ouverture et de fermeture, ajoutez le code que l'objet alarm clock appelle leCheckfonction, comme la partie commentée du code.

Test de retour

img

Vous pouvez voir le backtest, ouverture des positions après 9 h et fermeture des positions à 14:58.

Il peut également être utilisé pour des stratégies multi-variétés. Plusieurs objets de ce type peuvent être créés dans des stratégies multi-variétés pour le contrôle du temps de plusieurs variétés sans s'affecter mutuellement.

Le langage Python implémente la classe de réveil

Code de mise en œuvre et d'essai:

import time
class AlarmClock:
    def __init__(self, triggerHour, triggerMinute):
        self.isTrigger = False 
        self.triggerHour = triggerHour
        self.triggerMinute = triggerMinute
        self.nowDay = time.localtime(time.time()).tm_wday

    def Check(self):
        t = time.localtime(time.time())
        hour = t.tm_hour
        minute = t.tm_min
        day = t.tm_wday
        
        if day != self.nowDay:
            self.isTrigger = False
            self.nowDay = day
            
        if self.isTrigger == False and hour == self.triggerHour and minute >= self.triggerMinute:
            self.isTrigger = True
            return True
        
        return False 

def main():
    t1 = AlarmClock(14,58)
    t2 = AlarmClock(9, 0)
    while True:
        if exchange.IO("status"):
            LogStatus(_D(), "Already connected!")
            exchange.SetContractType("rb2010")
            ticker = exchange.GetTicker()
            if t1.Check():
                Log("Market Close", "#FF0000")
                
            if t2.Check():
                Log("Market Open", "#CD32CD")
        else :
            LogStatus(_D(), "not connected!")
        Sleep(500)

Exécution de l'essai de rétro-test:

img

Il convient de noter que, pour les tests de retour, le cycle de la ligne K de la couche inférieure ne peut pas être réglé trop large, sinon le point de détection du temps peut être sauté directement et il n'y aura pas de déclencheur.


Relationnée

Plus de