Трейдеры, которые разрабатывают торговые стратегии, часто спрашивают меня, как разрабатывать функции временного управления для стратегий, чтобы стратегии могли выполнять определенные задачи в определенное время. Например, некоторые внутридневные стратегии должны закрывать позиции до окончания первого раздела в торговый день. Как разрабатывать такие требования в торговой стратегии? Стратегия может использовать много контроля времени. Таким образом, мы можем инкапсулировать функцию контроля времени, чтобы минимизировать связь между кодом контроля времени и стратегией, чтобы модуль контроля времени мог быть повторно использован и был кратким в использовании.
// 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 позже).
Проектируйте функцию для построения объекта
var t = CreateAlarmClock(14, 58)
Например, создать объект t и запустить его в 14:58 каждый день. Вы можете создать другой объект t1, который запускается каждый день в 9:00.
var t1 = CreateAlarmClock(9, 0)
Мы пишем тестовую стратегию. Стратегия использует самую простую систему скользящих средних. Стратегия только для тестирования и не заботится о прибыли. Стратегический план заключается в том, чтобы открыть позицию (длинную, короткую, без торговли) на основе ежедневного скользящего среднего золотого креста и мертвого креста, когда рынок открывается в 9:00 каждый день, и закрыть позицию в 14:58 дня (закрытие в 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)
}
}
ПоложитеCreateAlarmClock
В стратегию для определения положения открытия и закрытия, добавить код, который объект Check
Функции, такие как комментируемая часть кода.
Вы можете увидеть обратный тест, открытие позиций после 9 утра и закрытие позиций в 14: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)
Проверка на обратном тесте:
Следует отметить, что для обратного тестирования цикл K-линии нижнего слоя не может быть установлен слишком большим, в противном случае точка обнаружения времени может быть пропущена непосредственно и не будет запуска.