資源の読み込みに... 荷物...

取引戦略に目覚まし時計を追加

作者: リン・ハーン優しさ, 作成日: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
}

私たちはアラームクロックオブジェクトを作成する関数を設計し実装しました (コンストラクタとして理解できます) 他の言語は直接アラームクロッククラスを設計できます (例えば,Pythonを使用して,後でPythonで実装します).

機能を設計し,使用中の"アラームクロック"オブジェクトを構成し,使用中の"アラームクロック"オブジェクトを作成するには,たった1行のコードが必要です.

var t = CreateAlarmClock(14, 58)

例えば,オブジェクトtを作成し,毎日14時58分に起動します 9時に起動します. この場合は,

var t1 = CreateAlarmClock(9, 0)

試験戦略

テスト戦略を書きます. 戦略は最も単純な移動平均システムを使用します. 戦略はテストのためにのみであり,利益には関心がありません. 戦略プランは,市場が毎日9時に開く時に,日々の移動平均金十字と死十字に基づいてポジション (ロング,ショート,取引なし) を開き,午後14時58分 (15時閉じる) にポジションを閉じる.

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戦略で実装した機能で,メイン機能の開始時に2つの"アラームクロック"オブジェクトを構成します. 戦略で開閉位置を決定するには,Checkコードのコメントされた部分などです.

バックテスト

img

9時以降のポジションと 14時58分からのポジションです

また,マルチバリエーション戦略に使用することもできる.複数のバリエーションの時間制御のために,複数のバリエーションで複数の"アラームクロック"オブジェクトを相互に影響することなく作成することができる.

Python言語はアラームクロッククラスを実装する.

実施とテストコード:

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線サイクルが大きすぎるように設定できないことに注意しなければならない.そうでなければ,時間検出ポイントは直接跳ね出され,トリガーがない.


関連性

もっと