Os comerciantes que projetam estratégias de negociação muitas vezes me perguntam como projetar funções de tempo para as estratégias para que as estratégias possam lidar com certas tarefas em momentos especificados. Por exemplo, algumas estratégias intradiárias precisam fechar posições antes que a primeira seção termine em um dia de negociação. Como projetar tais requisitos na estratégia de negociação? Uma estratégia pode usar muito controle de tempo. Desta forma, podemos encapsular a função de controle de tempo para minimizar o acoplamento entre o código de controle de tempo e a estratégia, para que o módulo de controle de tempo possa ser reutilizado e seja conciso em uso.
// 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
}
Nós projetamos e implementamos uma função para criar um objeto de despertador (pode ser entendido como um construtor), e outras linguagens podem projetar diretamente uma classe de despertador (por exemplo, usando Python, implementaremos uma em Python mais tarde).
Projetar a função para construir o objeto
var t = CreateAlarmClock(14, 58)
Por exemplo, criar um objeto t e ativá-lo às 14:58 todos os dias. Você pode criar outro objeto t1, que é acionado todos os dias às 9:00.
var t1 = CreateAlarmClock(9, 0)
Nós escrevemos uma estratégia de teste. A estratégia usa o sistema de média móvel mais simples. A estratégia é apenas para testes e não se importa com o lucro. O plano de estratégia consiste em abrir uma posição (longa, curta, sem negociação) com base na média móvel diária de cruz de ouro e cruz morta quando o mercado abrir às 9:00 todos os dias, e fechar a posição às 14:58 da tarde (fechar às 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)
}
}
Põe oCreateAlarmClock
Na estratégia para determinar a posição de abertura e fechamento, adicionar o código que o objeto Check
função, como a parte comentada do código.
Podem ver o backtest, abrindo posições depois das 9h e fechando as posições às 14:58.
Também pode ser usado para estratégias de múltiplas variedades.
Código de execução e teste:
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)
Executar o ensaio de reversão:
Deve notar-se que, para o backtest, o ciclo da linha K da camada inferior não pode ser demasiado grande, caso contrário, o ponto de detecção do tempo pode ser ignorado directamente e não haverá disparador.