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.
// 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
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)
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)
}
}
LetakkanCreateAlarmClock
Dalam strategi untuk menentukan kedudukan pembukaan dan penutupan, tambah kod yang objek Check
fungsi, seperti bahagian yang dikomentari kod.
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
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:
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.