Tambah jam penggera kepada strategi dagangan

Penulis:Kebaikan, Dicipta: 2020-08-06 11:15:28, Dikemas kini: 2023-10-10 21:14:31

img

Peniaga yang merancang strategi dagangan sering bertanya kepada saya bagaimana untuk merancang fungsi masa untuk strategi supaya strategi dapat menangani tugas-tugas tertentu pada masa yang ditentukan. Sebagai contoh, beberapa strategi intraday perlu menutup kedudukan sebelum bahagian pertama berakhir pada hari dagangan. Bagaimana untuk merancang keperluan sedemikian dalam strategi dagangan? Strategi mungkin menggunakan banyak kawalan masa. Dengan cara ini, kita boleh merangkumi fungsi kawalan masa untuk meminimumkan penyambungan antara kod kawalan masa dan strategi, supaya modul kawalan masa dapat digunakan semula dan ringkas dalam penggunaan.

Reka bentuk jam penggera

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

Kami telah merancang dan melaksanakan fungsi untuk membuat objek jam penggera (boleh difahami sebagai pembina), dan bahasa lain boleh secara langsung merancang kelas jam penggera (contohnya, menggunakan Python, kita akan melaksanakan satu di Python kemudian).

Merancang fungsi untuk membina objek jam penggera, dan hanya memerlukan satu baris kod untuk membuat objek jam penggera yang digunakan.

var t = CreateAlarmClock(14, 58)

Sebagai contoh, buat objek t dan mencetuskan pada pukul 14:58 setiap hari. Anda boleh mencipta objek lain t1, yang dicetuskan setiap hari pada pukul 9:00.

var t1 = CreateAlarmClock(9, 0)

Strategi ujian

Kami menulis strategi ujian. Strategi ini menggunakan sistem purata bergerak yang paling mudah. Strategi ini hanya untuk ujian dan tidak peduli tentang keuntungan. Rancangan strategi adalah untuk membuka kedudukan (panjang, pendek, tidak ada perdagangan) berdasarkan purata bergerak emas silang dan silang mati apabila pasaran dibuka pada pukul 9:00 setiap hari, dan menutup kedudukan pada pukul 14:58 petang (tutup pada pukul 15: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
}

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

LetakkanCreateAlarmClockDalam strategi untuk menentukan kedudukan pembukaan dan penutupan, tambah kod yang objek alarm clock memanggilCheckfungsi, seperti bahagian yang dikomentari kod.

Ujian belakang

img

Anda boleh melihat backtest, membuka kedudukan selepas 9 pagi dan menutup kedudukan pada 14:58.

Ia juga boleh digunakan untuk strategi pelbagai jenis. Beberapa objek jam penggera boleh dibuat dalam strategi pelbagai jenis untuk kawalan masa pelbagai jenis tanpa mempengaruhi satu sama lain.

Bahasa Python melaksanakan kelas jam penggera

Kod pelaksanaan dan ujian:

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)

Jalankan ujian backtest:

img

Perlu diperhatikan bahawa untuk backtest, kitaran K-garis lapisan bawah tidak boleh ditetapkan terlalu besar, jika tidak, titik pengesanan masa boleh dilupakan secara langsung dan tidak akan ada pencetus.


Berkaitan

Lebih lanjut