Para trader yang merancang strategi trading sering bertanya kepada saya bagaimana merancang fungsi waktu untuk strategi sehingga strategi dapat menangani tugas-tugas tertentu pada waktu yang ditentukan. Misalnya, beberapa strategi intraday perlu menutup posisi sebelum bagian pertama berakhir pada hari perdagangan. Bagaimana merancang persyaratan seperti itu dalam strategi trading? Sebuah strategi mungkin menggunakan banyak kontrol waktu. Dengan cara ini, kita dapat merangkum fungsi kontrol waktu untuk meminimalkan kopling antara kode kontrol waktu dan strategi, sehingga modul kontrol waktu dapat digunakan kembali dan ringkas dalam penggunaan.
// 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 mengimplementasikan fungsi untuk membuat objek jam alarm (bisa dipahami sebagai konstruktor), dan bahasa lain dapat langsung merancang kelas jam alarm (misalnya, menggunakan Python, kita akan mengimplementasikannya di Python nanti).
Merancang fungsi untuk membangun
var t = CreateAlarmClock(14, 58)
Misalnya, buat objek t dan matikan pada pukul 14:58 setiap hari. Anda dapat membuat objek lain t1, yang dipicu setiap hari pada pukul 9:00.
var t1 = CreateAlarmClock(9, 0)
Kita menulis strategi uji coba. strategi ini menggunakan sistem rata-rata bergerak yang paling sederhana. strategi ini hanya untuk pengujian dan tidak peduli tentang keuntungan. Rencana strategi adalah untuk membuka posisi (panjang, pendek, tidak ada perdagangan) berdasarkan rata-rata bergerak emas silang dan mati silang setiap hari ketika pasar dibuka pukul 9:00 setiap hari, dan menutup posisi pada pukul 14:58 sore (tutup 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)
}
}
LetakkanCreateAlarmClock
Dalam strategi untuk menentukan posisi pembukaan dan penutupan, tambahkan kode bahwa Check
fungsi, seperti bagian dari kode yang dikomentari.
Anda dapat melihat backtest, membuka posisi setelah 9 pagi dan menutup posisi di 14:58.
Ini juga dapat digunakan untuk strategi multi-varietas. Beberapa objek seperti
Kode implementasi dan uji:
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)
Backtest test run:
Perlu dicatat bahwa untuk backtest, siklus K-line dari lapisan bawah tidak dapat diatur terlalu besar, jika tidak titik deteksi waktu dapat dilewatkan langsung dan tidak akan ada pemicu.