거래 전략에 알람 시계를 추가

저자:선함, 2020-08-06 11:15:28, 업데이트: 2023-10-10 21:14:31

img

트레이딩 전략을 설계하는 트레이더들은 종종 전략에 대한 타이밍 함수를 설계하는 방법을 물어보고 전략이 지정된 시간에 특정 작업을 처리 할 수 있도록합니다. 예를 들어, 일부 내일 전략은 거래 날에 첫 번째 섹션이 끝나기 전에 포지션을 닫아야합니다. 트레이딩 전략에서 그러한 요구 사항을 설계하는 방법? 전략은 많은 시간 제어 기능을 사용할 수 있습니다. 이러한 방식으로, 우리는 시간 제어 코드와 전략 사이의 결합을 최소화하기 위해 시간 제어 기능을 캡슐화하여 시간 제어 모듈을 재사용하고 간결하게 사용할 수 있습니다.

알람 시계 디자인

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

우리는 알람 클럭 객체를 생성하는 함수를 설계하고 구현했습니다. 다른 언어는 직접 알람 클럭 클래스를 설계할 수 있습니다. 예를 들어 파이썬을 사용하여 나중에 파이썬에서 구현할 것입니다.

알람시계 객체를 구성하는 함수를 설계하고, 사용 중인 알람시계 객체를 생성하기 위해 하나의 코드 라인이 필요합니다.

var t = CreateAlarmClock(14, 58)

예를 들어, t 객체를 만들고 매일 14:58에 트리거합니다. 또 다른 객체 t1을 만들 수 있습니다. 매일 9시에 트리거됩니다.

var t1 = CreateAlarmClock(9, 0)

시험 전략

우리는 테스트 전략을 작성합니다. 이 전략은 가장 간단한 이동 평균 시스템을 사용합니다. 이 전략은 테스트를 위한 것입니다. 이윤에 관심이 없습니다. 전략 계획은 매일 시장이 9시에 열릴 때 매일 이동 평균 황금 십자와 죽은 십자 기준으로 포지션을 (장, 단, 거래가 없습니다) 개설하고 오후 14시 58분에 포지션을 닫는 것입니다.

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

CreateAlarmClock우리는 전략에 구현한 기능, 그리고 주요 기능의 시작에 두 개의 알람 클럭 객체를 구축합니다. 열기와 닫는 위치를 결정하기 위해 전략에, 알람 클럭 객체가 호출하는 코드를 추가Check코드의 코멘트된 부분과 같은 기능.

백테스트

img

당신은 백테스트를 볼 수 있습니다. 오전 9시 이후 포지션을 개설하고 오후 2시 58분에 포지션을 닫습니다.

또한 멀티 버라이어티 전략에 사용할 수 있습니다. 서로 영향을 미치지 않고 여러 가지 종류의 시간을 제어하기 위해 멀티 버라이어티 전략에서 여러 가지 이러한 알람 시계 객체를 만들 수 있습니다.

파이썬 언어는 알람 클럭 클래스를 구현합니다

실행 및 테스트 코드:

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)

백테스트 테스트 실행:

img

백테스트를 위해, 하층의 K-라인 사이클은 너무 크게 설정할 수 없다는 점에 유의해야 합니다. 그렇지 않으면 시간 감지 포인트를 직접 건너뛰고 트리거가 없을 수 있습니다.


관련

더 많은