Thêm một đồng hồ báo thức vào chiến lược giao dịch

Tác giả:Tốt, Tạo: 2020-08-06 11:15:28, Cập nhật: 2023-10-10 21:14:31

img

Các nhà giao dịch thiết kế các chiến lược giao dịch thường hỏi tôi làm thế nào để thiết kế các chức năng thời gian cho các chiến lược để các chiến lược có thể xử lý một số nhiệm vụ nhất định tại thời điểm cụ thể. Ví dụ, một số chiến lược trong ngày cần phải đóng các vị trí trước khi phần đầu tiên kết thúc trong một ngày giao dịch. Làm thế nào để thiết kế các yêu cầu như vậy trong chiến lược giao dịch? Một chiến lược có thể sử dụng rất nhiều điều khiển thời gian. Bằng cách này, chúng ta có thể đóng gói chức năng kiểm soát thời gian để giảm thiểu sự kết hợp giữa mã kiểm soát thời gian và chiến lược, để mô-đun kiểm soát thời gian có thể được sử dụng lại và ngắn gọn trong sử dụng.

Thiết kế một đồng hồ báo thức

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

Chúng tôi đã thiết kế và thực hiện một hàm để tạo ra một đối tượng đồng hồ báo thức (có thể được hiểu là một constructor), và các ngôn ngữ khác có thể trực tiếp thiết kế một lớp đồng hồ báo thức (ví dụ, sử dụng Python, chúng tôi sẽ thực hiện một trong Python sau).

Thiết kế chức năng để xây dựng đối tượng giờ báo động, và chỉ cần một dòng mã để tạo một đối tượng giờ báo động đang được sử dụng.

var t = CreateAlarmClock(14, 58)

Ví dụ, tạo một đối tượng t và kích hoạt nó lúc 14:58 mỗi ngày. Bạn có thể tạo một đối tượng khác t1, được kích hoạt mỗi ngày lúc 9:00.

var t1 = CreateAlarmClock(9, 0)

Chiến lược thử nghiệm

Chúng tôi viết một chiến lược thử nghiệm. Chiến lược sử dụng hệ thống trung bình động đơn giản nhất. Chiến lược chỉ là để thử nghiệm và không quan tâm đến lợi nhuận. Kế hoạch chiến lược là mở một vị trí (dài, ngắn, không giao dịch) dựa trên đường chéo vàng và đường chéo chết hàng ngày khi thị trường mở vào lúc 9:00 mỗi ngày và đóng vị trí vào lúc 14:58 chiều (khép vào lúc 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)
    }
}

ĐặtCreateAlarmClockTrong chiến lược để xác định vị trí mở và đóng, thêm mã mà đối tượng alarm clock gọi làCheckchức năng, chẳng hạn như phần bình luận của mã.

Kiểm tra hậu quả

img

Bạn có thể xem backtest, mở các vị trí sau 9 giờ sáng và đóng các vị trí lúc 14:58.

Nó cũng có thể được sử dụng cho các chiến lược đa dạng. Nhiều đối tượng giờ báo động như vậy có thể được tạo ra trong các chiến lược đa dạng để kiểm soát thời gian của nhiều loại mà không ảnh hưởng đến nhau.

Ngôn ngữ Python thực hiện lớp đồng hồ báo thức

Mã thực hiện và thử nghiệm:

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)

Chạy thử nghiệm backtest:

img

Cần lưu ý rằng cho backtest, chu kỳ đường K của lớp dưới không thể được đặt quá lớn, nếu không điểm phát hiện thời gian có thể được bỏ qua trực tiếp và sẽ không có kích hoạt.


Có liên quan

Thêm nữa