Là một nền tảng giao dịch định lượng mạnh mẽ, linh hoạt và dễ sử dụng cho toàn bộ mạng, nền tảng giao dịch định lượng FMZ có rào cản sử dụng rất thấp và chương trình robot sử dụng ít tài nguyên. Ví dụ, thời gian không mở chiếm phần lớn toàn bộ ngày khi tiến hành chương trình và giao dịch định lượng tương lai hàng hóa. Bằng cách này, chúng tôi hy vọng rằng robot sẽ chỉ chạy vào thời gian mở, và rằng nó sẽ chỉ chạy vào thời gian mở mỗi ngày để tiết kiệm tiền. Không thú vị sao? Để đáp ứng yêu cầu này, chúng ta có thể sử dụng ngôn ngữ Python để viết một robot chiến lược chạy trên nền tảng giao dịch FMZ Quant, và để cho robot điều khiển khởi động và dừng robot ở các khoảng thời gian thường xuyên thông qua giao diện API mở rộng của nền tảng giao dịch FMZ Quant.
Trong thực tế, toàn bộ mã là rất đơn giản. ví dụ của gọi FMZ Quant Trading Platform mở rộng giao diện API có thể được sử dụng trực tiếp.
Địa chỉ:https://www.fmz.com/api#simpleví dụ
Sử dụng hàm trong ví dụ trực tiếp:def api (method, *args)
Giao diện chúng ta cần gọi cũng rất đơn giản. Hai giao diện sau được sử dụng (có thể được tìm thấy trong tài liệu FMZ)
Khởi động lạiRobot
Khởi động lại giao diện robot và truyền các thông số vào ID robot.
Sử dụng cụ thểid
để gọi:api ('RestartRobot', id)
StopRobot
Để dừng giao diện robot, các thông số cũng là robotID
.
RobotID
:
Để gọi FMZ Quant Trading Platform extension API, bạn cần sử dụngAPI KEY
của nền tảng giao dịch lượng tử FMZ.
Bạn có thể tạo ra API KEY của riêng bạn trong quản lý tài khoản.
Chúng ta đi quaAPI KEY
như một thông số chiến lược.
Ảnh chụp màn hình để có được tài khoản nền tảng giao dịch FMZ QuantAPI KEY
:
Phần còn lại là viết logic thời gian, cũng rất đơn giản.
["175708,14:55:33-15:10:33", ...]
Các hình elip chỉ ra rằng nhiều thiết lập như"175708,14:55:33-15:10:33"
có thể được thiết lập.
Các thông số thời gian là một chuỗi JSON, sẽ được phân tích thành một danh sách trong mã chiến lược.
Đó là:
"175708,14:55:33-15:10:33"
Chúng được tách bởi dấu phẩy.175708
là robot ID, và phần sau dấu phẩy là thời gian bắt đầu / dừng thời gian.
Trong ví dụ trên, robot với ID 175708 bắt đầu lúc 14:55:33 và dừng lại lúc 15:10:33.
Sau đó, trong chiến lược, robot sẽ tiếp tục quay. Mỗi vòng quay đầu tiên sẽ lấy thời gian hiện tại, và sau đó đánh giá liệu có nên kích hoạt khởi động hoặc dừng robot theo so sánh giữa thời gian hiện tại và thời gian hẹn giờ.
Nếu được kích hoạt, gọi API ('RestartRobot', id) hoặc API (
Mã chiến lược đầy đủ:
# -*- 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)
Ảnh chụp màn hình:
Địa chỉ chiến lược:https://www.fmz.com/strategy/184600
Ví dụ, API mở rộng của FMZ Quant Trading Platform vẫn rất mạnh. Không có vấn đề gì khi xây dựng nền tảng giao dịch định lượng của riêng bạn dựa trên nền tảng FMZ với các API mở rộng này. Robot thời gian có thiết kế đơn giản, nó bắt đầu vào thời điểm và dừng lại vào thời điểm. Nó không bao gồm các cơ chế như khởi động thành công, kiểm tra, thử lại ngoại lệ, v.v. Nếu bạn quan tâm, bạn có thể thêm các chức năng và mở rộng chúng. Chiến lược chỉ để tham khảo.