
Als leistungsstarke, flexible und benutzerfreundliche quantitative Handelsplattform im gesamten Netzwerk weist die Inventor Quantitative Trading Platform eine sehr niedrige Nutzungsschwelle auf und das Roboterprogramm beansprucht nur sehr wenige Ressourcen. Wir hoffen jedoch weiterhin, dass der Roboter gestartet werden kann, wenn er laufen muss, und gestoppt werden kann, wenn er nicht laufen muss. Beim programmierten und quantitativen Handel mit Rohstoff-Futures beispielsweise nimmt die Zeit außerhalb der Marktöffnungszeiten den größten Teil des Tages ein. Auf diese Weise hoffen wir sehr, den Roboter nur während der Marktöffnungszeiten laufen zu lassen. Es ist spannend, darüber nachzudenken, wie viel Kosten gespart werden können, wenn man ihn jeden Tag nur während der Marktöffnungszeiten laufen lässt. Um diese Anforderung zu erfüllen, können wir Python verwenden, um einen Strategieroboter zu schreiben, der auf der quantitativen Handelsplattform FMZ läuft. Die erweiterte API-Schnittstelle der quantitativen Handelsplattform des Erfinders steuert den Start und Stopp des Roboters zu einem festen Zeitpunkt.
Tatsächlich ist der gesamte Code sehr einfach. Das Beispiel des Aufrufs der erweiterten API-Schnittstelle der quantitativen Handelsplattform des Erfinders kann direkt verwendet werden
Adresse: https://www.fmz.com/api#%E7%AE%80%E5%8D%95%E7%9A%84%E4%BE%8B%E5%AD%90
Verwenden Sie die Funktion im Beispiel direkt:def api(method, *args)
Die Schnittstelle, die wir aufrufen müssen, ist ebenfalls sehr einfach und verwendet die folgenden beiden Schnittstellen (zu finden im FMZ-Dokument):
RestartRobot
Starten Sie die Roboterschnittstelle neu und übergeben Sie die Roboter-ID als Parameter.
Verwenden Sie spezifischeid, können Sie es folgendermaßen aufrufen:api('RestartRobot', id)
StopRobot
Stoppen Sie die Roboterschnittstelle, die Parameter sind auch der RoboterID。
RoboterIDAnzeigen, abrufen, Screenshot:

Um die Inventor Quantitative Trading Platform-Erweiterungs-API aufzurufen, müssen Sie die Inventor Quantitative Trading Platform verwenden.API KEY。
Sie können Ihr eigenes Konto in der Kontoverwaltung erstellen.API KEY。
Wir setzenAPI KEYWird als Parameter an die Strategie übergeben.
Holen Sie sich das Inventor Quantitative Trading Platform-KontoAPI KEYScreenshot:

Jetzt muss nur noch die Timing-Logik geschrieben werden, was ebenfalls sehr einfach ist. Legen Sie die Timing-Parameter fest:
["175708,14:55:33-15:10:33", ...]
Die Auslassungspunkte zeigen an, dass ähnlichere"175708,14:55:33-15:10:33"Einstellungen.
Der Timing-Parameter ist eine JSON-Zeichenfolge, die im Richtliniencode in eine Liste analysiert wird. Jedes Element in der Liste ist ein Satz von Start-/Stopp-Einstellungen für den Roboter.
Im Augenblick:
"175708,14:55:33-15:10:33"
Zur Trennung werden Kommas verwendet. Der Teil vor dem Komma175708ist die Roboter-ID und der Teil nach dem Komma ist die Startzeit/Stoppzeit.
Im obigen Beispiel wurde der Roboter mit der ID 175708 um 14:55:33 gestartet und um 15:10:33 gestoppt.
Anschließend sucht die Strategie weiter, ruft jedes Mal zuerst die aktuelle Zeit ab und vergleicht dann die aktuelle Zeit mit der geplanten Zeit, um zu bestimmen, ob der Start oder Stopp des Roboters ausgelöst werden muss. Rufen Sie bei Auslösung api(‘RestartRobot’, id) oder api(‘StopRobot’, id) auf, um den Roboter zu starten oder zu stoppen.
Der vollständige Strategiecode:
# -*- coding: utf-8 -*-
import time
import json
try:
import md5
import urllib2
from urllib import urlencode
except:
import hashlib as md5
import urllib.request as urllib2
from urllib.parse import urlencode
def api(method, *args):
d = {
'version': '1.0',
'access_key': accessKey,
'method': method,
'args': json.dumps(list(args)),
'nonce': int(time.time() * 1000),
}
d['sign'] = md5.md5(('%s|%s|%s|%d|%s' % (d['version'], d['method'], d['args'], d['nonce'], secretKey)).encode('utf-8')).hexdigest()
return json.loads(urllib2.urlopen('https://www.fmz.com/api/v1', urlencode(d).encode('utf-8')).read().decode('utf-8'))
RobotParams = json.loads(strRobotParams)
def main():
global RobotParams
arrParams = []
nowDay = 0
strPush = ""
if isPushMsg:
strPush = "@"
for i in range(len(RobotParams)):
param = {}
arr = RobotParams[i].split(",")
if len(arr) != 2:
raise Exception("字符串配置错误:分隔符号,")
param["id"] = arr[0]
param["isProcessOpenThisDay"] = False
param["isProcessCloseThisDay"] = False
arr = arr[1].split("-")
if len(arr) != 2:
raise Exception("字符串配置错误:分隔符号-")
begin = arr[0]
arrBegin = begin.split(":")
if len(arrBegin) != 3:
raise Exception("字符串配置错误:起始时间分隔符号:")
param["begin"] = {}
param["begin"]["hour"] = float(arrBegin[0])
param["begin"]["min"] = float(arrBegin[1])
param["begin"]["sec"] = float(arrBegin[2])
end = arr[1]
arrEnd = end.split(":")
if len(arrEnd) != 3:
raise Exception("字符串配置错误:结束时间分隔符号:")
param["end"] = {}
param["end"]["hour"] = float(arrEnd[0])
param["end"]["min"] = float(arrEnd[1])
param["end"]["sec"] = float(arrEnd[2])
arrParams.append(param)
# 测试
Log("输出参数", arrParams, "#FF0000")
while True:
nowTime = time.localtime(time.time())
nowHour = nowTime.tm_hour
nowMin = nowTime.tm_min
nowSec = nowTime.tm_sec
tbl = {
"type" : "table",
"title" : "msg",
"cols" : ["id", "begin", "end", "今天是否执行过启动", "今天是否执行过停止"],
"rows" : []
}
for i in range(len(arrParams)):
tbl["rows"].append([arrParams[i]["id"], json.dumps(arrParams[i]["begin"]), json.dumps(arrParams[i]["end"]), arrParams[i]["isProcessOpenThisDay"], arrParams[i]["isProcessCloseThisDay"]])
if nowDay != nowTime.tm_mday:
arrParams[i]["isProcessOpenThisDay"] = False
arrParams[i]["isProcessCloseThisDay"] = False
if arrParams[i]["isProcessOpenThisDay"] == False:
if nowTime.tm_hour == arrParams[i]["begin"]["hour"] and nowTime.tm_min >= arrParams[i]["begin"]["min"] and nowTime.tm_sec >= arrParams[i]["begin"]["sec"]:
ret = api('RestartRobot', int(arrParams[i]["id"]))
arrParams[i]["isProcessOpenThisDay"] = True
Log("机器人ID:", arrParams[i]["id"], "执行启动,请登录平台检查是否启动成功", "扩展API返回值:", ret, strPush)
if arrParams[i]["isProcessCloseThisDay"] == False:
if nowTime.tm_hour == arrParams[i]["end"]["hour"] and nowTime.tm_min >= arrParams[i]["end"]["min"] and nowTime.tm_sec >= arrParams[i]["end"]["sec"]:
ret = api('StopRobot', int(arrParams[i]["id"]))
arrParams[i]["isProcessCloseThisDay"] = True
Log("机器人ID:", arrParams[i]["id"], "执行停止,请登录平台检查是否停止成功", "扩展API返回值:", ret, strPush)
if nowDay != nowTime.tm_mday:
nowDay = nowTime.tm_mday
LogStatus(_D(), nowTime, "\n`" + json.dumps(tbl) + "`")
Sleep(500)

Screenshot

Roboter, die mit dieser Strategie betrieben werden:

Strategieadresse: https://www.fmz.com/strategy/184600
Als Ausgangspunkt ist die erweiterte API der quantitativen Handelsplattform Inventor sehr leistungsstark. Es ist durchaus möglich, diese erweiterten APIs zu verwenden, um Ihre eigene quantitative Handelsplattform auf Basis der FMZ-Plattform aufzubauen. Das Design dieses Timing-Roboters ist relativ einfach. Er startet und stoppt einfach, wenn die Zeit gekommen ist. Es enthält keine Mechanismen wie z. B. ob der Start erfolgreich war, Überprüfung, abnormaler Wiederholungsversuch usw. Wer interessiert ist, kann Funktionen hinzufügen und erweitern Es. Die Strategie dient nur als Lernreferenz