В качестве мощной, гибкой и простой в использовании количественной торговой платформы для всей сети, FMZ Quant Trading Platform имеет очень низкие барьеры для использования, и программа робота занимает мало ресурсов. Например, время неоткрытия составляет подавляющее большинство всего дня при проведении программной и количественной торговли товарными фьючерсами. Таким образом, мы надеемся, что робот будет работать только в время открытия, и что он будет работать только в время открытия каждый день, чтобы сэкономить деньги. Разве это не захватывающе? Чтобы удовлетворить это требование, мы можем использовать язык Python, чтобы написать стратегический робот, работающий на торговой платформе FMZ Quant, и позволить роботу контролировать запуск и остановку робота через расширенный интерфейс API торговой платформы FMZ Quant.
На самом деле, весь код очень прост. Пример вызова расширения API интерфейса FMZ Quant Trading Platform можно использовать непосредственно.
Адрес:https://www.fmz.com/api#simpleПример
Используйте функцию в примере напрямую:def api (method, *args)
Интерфейс, который нам нужно вызвать, также очень прост. Используются следующие два интерфейса (могут быть найдены в документе FMZ)
ПерезагрузитьRobot
Перезагрузить интерфейс робота и передать параметры в идентификатор робота.
Специфическое применениеid
позвонить:api ('RestartRobot', id)
СтопРобот
Чтобы остановить интерфейс робота, параметры также роботID
- Да, конечно.
РоботID
:
Чтобы вызвать расширение API FMZ Quant Trading Platform, вам нужно использоватьAPI KEY
платформы FMZ Quant Trading.
Вы можете генерировать свой собственный API-ключ в управлении аккаунтами.
Мы проезжаем черезAPI KEY
как параметр стратегии.
Скриншот получения счета FMZ Quant Trading PlatformAPI KEY
:
Остальное - написать логику времени, которая тоже очень проста.
["175708,14:55:33-15:10:33", ...]
Эллипс указывает, что больше настроек, как"175708,14:55:33-15:10:33"
можно установить.
Параметр времени представляет собой строку JSON, которая будет проанализирована в список в коде стратегии.
В частности:
"175708,14:55:33-15:10:33"
Они разделены запятой.175708
это идентификатор робота, а часть после запятой - время начала/остановки.
В приведенном выше примере робот с ID 175708 начинает работу в 14:55:33 и останавливается в 15:10:33.
Затем, в стратегии, робот будет продолжать вращаться. Каждое круговое вращение сначала получит текущее время, а затем решит, стоит ли запускать или останавливать робота в соответствии с сравнением между текущим временем и временем.
Если запускается, вызовите API ("RestartRobot", id) или API (
Полный код стратегии:
# -*- 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("String configuration error: delimiter,")
param["id"] = arr[0]
param["isProcessOpenThisDay"] = False
param["isProcessCloseThisDay"] = False
arr = arr[1].split("-")
if len(arr) != 2:
raise Exception("String configuration error: delimiter-")
begin = arr[0]
arrBegin = begin.split(":")
if len(arrBegin) != 3:
raise Exception("String configuration error: start time separator:")
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("String configuration error: end time separator:")
param["end"] = {}
param["end"]["hour"] = float(arrEnd[0])
param["end"]["min"] = float(arrEnd[1])
param["end"]["sec"] = float(arrEnd[2])
arrParams.append(param)
# Test
Log("Output parameters", 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", "Did you perform a start today", "Did you perform a stop today"],
"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("Robot ID:", arrParams[i]["id"], "Execution started, please log in to the platform to check if it started successfully", "Extended API return value:", 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("Robot ID:", arrParams[i]["id"], "Execution stopped, please log in to the platform to check if it stopped successfully", "Extended API return value:", ret, strPush)
if nowDay != nowTime.tm_mday:
nowDay = nowTime.tm_mday
LogStatus(_D(), nowTime, "\n`" + json.dumps(tbl) + "`")
Sleep(500)
Скриншоты:
Адрес стратегии:https://www.fmz.com/strategy/184600
Например, расширенный API Quant Trading Platform FMZ