Hinzufügen eines Wecker zur Handelsstrategie

Schriftsteller:Gutes, Erstellt: 2020-08-06 11:15:28, Aktualisiert: 2023-10-10 21:14:31

img

Händler, die Handelsstrategien entwerfen, fragen mich oft, wie man Timing-Funktionen für Strategien entwirft, damit Strategien bestimmte Aufgaben zu bestimmten Zeiten bewältigen können. Zum Beispiel müssen einige Intraday-Strategien Positionen schließen, bevor der erste Abschnitt an einem Handelstag endet. Wie entwerfen Sie solche Anforderungen in der Handelsstrategie? Eine Strategie kann viel Zeitkontrolle verwenden. Auf diese Weise können wir die Zeitkontrolle-Funktion einkapseln, um die Kopplung zwischen dem Zeitkontrolle-Code und der Strategie zu minimieren, so dass das Zeitkontrollemodul wiederverwendet werden kann und im Gebrauch prägnant ist.

Entwerfen Sie eine Alarmuhr

// 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
}

Wir haben eine Funktion entworfen und implementiert, um ein Weckerobjekt zu erstellen (kann als Konstruktor verstanden werden), und andere Sprachen können direkt eine Weckerklasse entwerfen (zum Beispiel mit Python, wir werden eine später in Python implementieren).

Entwerfen Sie die Funktion, um das Alarmclock-Objekt zu konstruieren, und benötigen Sie nur eine Zeile Code, um ein Alarmclock-Objekt in Gebrauch zu erstellen.

var t = CreateAlarmClock(14, 58)

Zum Beispiel, erstellen Sie ein Objekt t und lösen Sie es jeden Tag um 14:58. Sie können ein anderes Objekt t1 erstellen, das jeden Tag um 9 Uhr ausgelöst wird.

var t1 = CreateAlarmClock(9, 0)

Prüfstrategie

Wir schreiben eine Teststrategie. Die Strategie verwendet das einfachste gleitende Durchschnittssystem. Die Strategie ist nur zum Testen und kümmert sich nicht um den Gewinn. Der Strategieplan besteht darin, eine Position (long, short, no trade) zu eröffnen, die auf dem täglichen gleitenden Durchschnitt des goldenen Kreuzes und des toten Kreuzes basiert, wenn der Markt jeden Tag um 9:00 Uhr eröffnet wird, und die Position um 14:58 Uhr nachmittags (Schließung um 15:00 Uhr) zu schließen.

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)
    }
}

Setzen Sie dieCreateAlarmClockDie Funktion, die wir in der Strategie implementiert haben, und konstruieren zwei Alarm Clock Objekte am Anfang der Hauptfunktion.CheckFunktion, wie zum Beispiel der kommentierte Teil des Codes.

Zurückprüfung

img

Sie können den Backtest sehen, die Positionen nach 9 Uhr öffnen und um 14:58 Uhr schließen.

Es kann auch für Multi-Variety-Strategien verwendet werden. Mehrere solcher Alarmclock-Objekte können in Multi-Variety-Strategien für die Zeitkontrolle von mehreren Varietäten erstellt werden, ohne sich gegenseitig zu beeinflussen.

Die Sprache Python implementiert die Weckerklasse

Implementierungs- und Prüfcode:

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)

Zurückfahrt:

img

Es ist zu beachten, dass für den Backtest der K-Linienzyklus der unteren Schicht nicht zu groß eingestellt werden darf, da sonst der Zeitdetektionspunkt direkt übersprungen werden kann und kein Auslöser vorhanden ist.


Verwandt

Mehr