Dans une stratégie de négociation à haute fréquence de contrats à terme sur matières premières, la vitesse de réception des cotations du marché Tick a une influence déterminante sur le résultat de la stratégie. Cependant, la plupart des frameworks de trading sur le marché utilisent le mécanisme de mode callback. Parce que dans la fonction onBar/onTick, vous devez gérer toute la logique du code, ce qui est une perte de temps; que vous le vouliez ou non, votre logique de stratégie doit être interrompue, et vous devez utiliser un mode machine d'état, tel que:
var state = STATE_IDLE;
function onTick() {
if (state == STATE_IDLE) {
// do something...
} else if (state == ....) {
// do something
}
}
FFMZ Quant n'adopte pas le mécanisme de rappel à l'envers, mais adopte le mécanisme d'entrée de fonction
Sous le modèle de stratégie, vous pouvez facilement gérer les comptes de N différentes sociétés de contrats à terme, fusionner leur TAQ, et passer des commandes à la vitesse la plus rapide. Dans des circonstances normales, nous pouvons obtenir deux tiques par seconde des sociétés de contrats à terme, mais par la technologie de fusion TAQ, prenant MA801 comme exemple, nous pouvons obtenir un maximum de 6 tiques non répétitives par seconde.
Passons directement au code (le code ne peut être utilisé que dans le bot, pas dans le backtest), et l'utilisation de la fonction IO peut faire référence à:https://www.fmz.cn/api#io函数
Lorsqu'un bot ajoute une plateforme, N sociétés à terme peuvent être ajoutées pour traiter la fusion simultanée de TAQ; ici, nous en ajoutons temporairement deux et démontrons ceci:
Le code suivant:
function main() {
Log("Prepare to access the platform and subscribe to TAQ")
// Step 1: all futures front-end processors are subscribing for symbols
_.each(exchanges, function(e) {
// wait to access the platform, and yes, the strategy runs continuously for 365 days, and it can run even after the market is closed, and it is not the logic of event callback
good mistake
while (!e.IO("status")) Sleep(1000);
// Use the _C retry function to eliminate network errors, and subscribe to TAQ just access to the platform; there may be an error that CTP is not ready
_C(e.SetContractType, "MA801")
// Switch the TAQ receiving mode to immediate return mode instead of event trigger mode, please refer to the API documentation
e.IO("mode", 0)
})
Log("Start to merge data...")
// Step 2: here comes the important part
var preVolume = 0
while (true) {
var ts = new Date().getTime()
// If any platform has tick event, return
var e = exchange.IO("wait_any")
// Reset Volume at a proper time
if (e.Nano/1000000 - ts > 60000) {
preVolume = 0
}
if (e.Event == 'tick' && e.Ticker.Volume >= preVolume) {
Log(ret, e.Ticker.Last, e.Ticker.Volume)
preVolume = e.Ticker.Volume
}
}
}
Résultat:
On peut voir qu'à 21:24:44, les données de la première société de contrats à terme arrivent avant la deuxième, et le résultat peut être vu en ajoutant deux sociétés de contrats à terme. Si vous l'utilisez pour développer des stratégies de trading à haute fréquence, vous avez résolu une étape très importante et décisive, à savoir la vitesse, la stabilité et la fiabilité de l'obtention de Tick.
FMZ Quant (anciennement BotVS) est une plateforme spécialement créée pour les développeurs qui ont des exigences critiques en matière de stabilité et de vitesse de la stratégie.