xchangeList ((()
GetExchangeList()
возвращает список поддерживаемых обменов и требуемую информацию о конфигурации.
Параметр Никаких.
Возвратная стоимость
{
"code": 0,
"data": {
"result": {
"exchanges": [{
"website": "https://www.huobi.pro/",
"name": "Huobi",
"priority": 1,
"meta": "[{"desc": "Access Key", "required": true, "type": "string", "name": "AccessKey", "label": "Access Key"}, {"encrypt": true, "name": "SecretKey", "required": true, "label": "Secret Key", "type": "password", "desc": "Secret Key"}]",
"eid": "Huobi",
"logo": "huobi.png",
"id": 1
}, {
"website": "https://www.kex.com/",
"name": "KEX",
"priority": -99,
"meta": "[{"desc": "Access Key", "required": true, "type": "string", "name": "AccessKey", "label": "Access Key"}, {"encrypt": true, "name": "SecretKey", "required": true, "label": "Secret Key", "type": "password", "desc": "Secret Key"}, {"encrypt": true, "required": true, "type": "password", "name": "Password", "label": "Trading Password"}]",
"eid": "KEX",
"logo": "",
"id": 43
},
...
]
},
"error": null
}
}
DeleteNode(Nid)
Удаление узла докера (ID
этоNid
) соответствуетAPI KEY
в запросе счета платформы торговли FMZ Quant.
ПараметрNid
имеет тип целого числа, а именно докерID
.
Возвратная стоимость
{
"code":0,
"data":{
"result":true,
"error":null
}
}
DeleteRobot(RobotId, DeleteLogs)
удаляет робота с указанным идентификатором (робот)ID
: RobotId
) соответствуетAPI KEY
в запросе по счету FMZ Quant.
ПараметрRobotId
является целого типа, а именно роботID
Убрать.DeleteLogs
является булевым типом;DeleteLogs
чтобы решить, удалить журнал или нет;true
указывает на удаление журнала.
Возвратная стоимость
// Return value after successful deletion
{
"code": 0,
"data": {
"result": 0,
"error": null
}
}
GetStrategyList()
получает стратегическую информацию, соответствующуюAPI KEY
в запросе счета платформы торговли FMZ Quant.
Параметр Никаких.
Возвратная стоимость
{
"code": 0,
"data": {
"result": {
"strategies": [{
"category": 0,
"username": "yifidslei",
"is_owner": true,
"name": "fmz simulation market test strategy",
"language": 0,
"hasToken": false,
"args": "[]",
"is_buy": false,
"public": 0,
"last_modified": "2018-01-18 12:36:03",
"date": "2018-01-17 09:19:32",
"forked": 0,
"id": 63372
}, {
"category": 20,
"username": "bifndslez",
"is_owner": true,
"name": "Line drawing library",
"language": 0,
"hasToken": false,
"args": "[]",
"is_buy": false,
"public": 0,
"last_modified": "2017-05-08 09:44:18",
"date": "2017-04-19 10:38:14",
"forked": 0,
"id": 39677
},
...
],
"all": 20
},
"error": null
}
}
NewRobot(Settings)
создает новый бот в соответствии с параметрами, соответствующимиAPI KEY
в запросе счета FMZ Quant.
ПараметрSettings
являетсяJSON
тип объекта.Settings
являетсяJSON
Объект, настроенный ботом.
ВSettings
описание объясняется следующим образом:
Settings = {
"name": "hedge test",
/*
Strategy parameters; the order does not have to be in correspondence with the parameter order, but the name must be the same as the parameter name
Note: the second element in the parameter array ["MAType", 0, 75882] is an array including three elements, in which the first one "MAType" is the parameter on the pattern referred by the bot-binding strategy, and the second one "0" is the specific value set by the parameter "MAType", and the third one "75882" is the pattern ID containing the parameter "MAType"
*/
"args": [["Interval", 500], ["MAType", 0, 75882]],
// Strategy ID, which can be obtained by "GetStrategyList" method
"strategy": 25189,
// K-line period parameter; "60" indicates 60 seconds
"period": 60,
// it can be specified to run on which docker; no writing of the attribute will lead to automatic assignment
"node" : 52924,
// custom field
"appid": "member2",
// Specify a bot group
"group": 1122,
"exchanges": [
// ZB; "pid" can be obtained by "GetPlatformList" method
{"pid": 15445, "pair": "ETH_BTC"},
// OKEX
{"pid": 13802, "pair": "BCH_BTC"},
// In addition to the exchanges configured by the FMZ dashboard (pid identification), you can also set exchange configuration information that has not been configured to operate the bot
{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "xxx", "SecretKey": "yyy"}},
{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "xxx", "SecretKey": "yyy"}}
]
}
Примечание:
Когда вы используете конфиденциальную информацию, такую как платформаAPI KEY
, в том числе"meta":{"AccessKey":"xxx","SecretKey":"yyy"}
в конфигурацииeid
, вы должны знать, что FMZ не хранит данные. Данные будут отправлены непосредственно в программу докера, поэтому эта информация должна быть настроена каждый раз, когда бот создается или перезапускается.
Чтобы перезапустить бота, который использует плагин для поддержки платформы, при настройкеSettings
параметр, вы должны сделать следующие настройки дляexchanges
атрибут:
{"eid": "Exchange", "label" : "testXXX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123", "SecretKey": "1234", "Front" : "http://127.0.0.1:6666/XXX"}}
label
атрибут устанавливает ярлыки для обмена объекта, доступ к которому осуществляется текущим общим протоколом, который может быть получен с помощьюexchange.GetLabel()
в стратегию.
Стратегия испытания:
Параметр стратегииInterval
JavaScript
код стратегии
function main(){
Log(exchange.GetAccount())
Log(exchange.GetTicker())
Log(exchange.GetDepth())
Log("Interval:", Interval)
}
Возвратная стоимость
// Create the bot successfully
{
"code": 0,
"data": {
"result": 74260,
"error": null
}
}
PluginRun(Settings)
использует расширенный API для вызоваинструмент отладки function.
ПараметрSettings
являетсяJSON
объект, а именно настройки в инструменте отладки (Settings
содержит тест-код, записанный в атрибутеsource
).
Код испытанияPython
Пример:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import md5
import urllib
import json
# API KEY has been blurred; you can use your own API KEY to test
accessKey = 'f77XXXXXXXXXXXXXXX757'
# API KEY has been blurred; you can use your own API KEY to test
secretKey = 'd8XXXXXXXXXXXXXXXX41ca97ea15'
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)).hexdigest()
return json.loads(urllib.urlopen('https://www.fmz.com/api/v1', urllib.urlencode(d)).read())
code = '''
function main() {
Log(exchange.GetTicker())
exchange.SetTimeout(2000);
return exchanges[0].GetTicker()
}
'''
settings = {
# K-line period parameter "60" indicates 60 seconds
"period": 60,
"source": code,
# The docker ID can specify which docker to run the bot on; if the value is -1, it means automatic assignment
"node" : 54913,
"exchanges": [
{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}},
{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
]
}
print api("PluginRun", settings)
Примечание:{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
Дляexchanges
атрибут внастройки, атрибут должен быть установлен только на 1, при вызовеPluginRun
интерфейс (для только одного объекта обмена может быть поддержан при использовании страницы
Возвратная стоимостьapi("PluginRun", settings)
возвращенные результаты:
{
u'code': 0,
u'data': {
u'result': u'{"logs":[{"PlatformId":"","OrderId":"0","LogType":5,"Price":0,"Amount":0,"Extra":"{\\"Info\\":{\\"date\\":\\"1523715057\\",\\"ticker\\":{\\"high\\":\\"0.06400845\\",\\"vol\\":\\"117648.31546800\\",\\"last\\":\\"0.06204514\\",\\"low\\":\\"0.06178666\\",\\"buy\\":\\"0.06200001\\",\\"sell\\":\\"0.06208728\\"}},\\"High\\":0.06400845,\\"Low\\":0.06178666,\\"Sell\\":0.06208728,\\"Buy\\":0.06200001,\\"Last\\":0.06204514,\\"Volume\\":117648.315468,\\"OpenInterest\\":0,\\"Time\\":1523715057726}","Instrument":"","Direction":"","Time":1523715057726}],"result":"{\\"Info\\":{\\"date\\":\\"1523715057\\",\\"ticker\\":{\\"vol\\":\\"117648.31546800\\",\\"last\\":\\"0.06204514\\",\\"low\\":\\"0.06178666\\",\\"buy\\":\\"0.06200001\\",\\"sell\\":\\"0.06208728\\",\\"high\\":\\"0.06400845\\"}},\\"High\\":0.06400845,\\"Low\\":0.06178666,\\"Sell\\":0.06208728,\\"Buy\\":0.06200001,\\"Last\\":0.06204514,\\"Volume\\":117648.315468,\\"OpenInterest\\":0,\\"Time\\":1523715057774}"}\n',
u'error': None
}
}
GetRobotLogs(robotId, logMinId, logMaxId, logOffset, logLimit, profitMinId, profitMaxId, profitOffset, profitLimit, chartMinId, chartMaxId, chartOffset, chartLimit, chartUpdateBaseId, chartUpdateDate, summaryLimit)
получает информацию о журнале робота (робот)ID
: robotId
), что соответствуетAPI KEY
в запросе счета FMZ Quant.
Параметр
Наименование параметра | Тип | Примечания |
---|---|---|
robotId | цельное число | Идентификатор бота |
таблица ЖурналЗадает запрос на данные журнала таблицы базы данных:
Наименование параметра | Тип | Примечания |
---|---|---|
LogMinId | цельное число | Минимальный идентификатор журнала |
logMaxId | цельное число | Максимальный идентификатор журнала |
LogOffset | цельное число | После того, как диапазон определяется logMinId и logMaxId, смещение logOffset (сколько записей пропустили) начинает использоваться в качестве исходного положения для получения данных |
LogLimit | цельное число | После определения исходной позиции количество выбранных записей данных |
Таблица Прибыльзадает запрос на данные о прибыли в таблице базы данных:
Наименование параметра | Тип | Примечания |
---|---|---|
Прибыль | цельное число | Минимальный идентификатор записи |
прибыльMaxId | цельное число | Максимальный идентификатор записи |
ПрибыльОфсет | цельное число | Сдвиг (сколько записей пропущено) начинает использоваться в качестве исходной позиции |
ПрибыльОграничение | цельное число | После определения исходной позиции количество выбранных записей данных |
Таблица Графикзадает запрос на данные диаграммы в таблице базы данных:
Наименование параметра | Тип | Примечания |
---|---|---|
График | цельное число | Минимальный идентификатор записи |
диаграммаMaxId | цельное число | Максимальный идентификатор записи |
ГрафикОффсет | цельное число | Компенсация |
ГрафикОграничение | цельное число | количество записей, которые необходимо получить |
chartUpdateBaseId | цельное число | Запрос обновленного идентификатора базы |
ТаблицаUpdateDate | цельное число | Запись данных обновляет временную метку, которая отфильтровывает записи больше, чем эта временная метка |
Резюмезапросы данных строки состояния:
Он запрашивает данные строки состояния бота. Тип параметра является целым числом. Настройка на summaryLimit
параметр для получения всей информации о строке состояния). Данные строки состояния хранятся в возвращенных данныхsummary
.
Python
Пример:
api('GetRobotLogs', 63024, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) # For the specific code, please refer to the above content: 4. Simple examples, which will not be repeated here; here only write the call and pass of "GetRobotLogs"
Возвратная стоимость возвращенные данные:
{
"code": 0,
"data": {
"result": {
"status": 1,
"updateTime": 1527049990197,
"wd": 0,
// The first data structure in logs is the log records in the strategy log table in the bot database
"logs": [{
"Max": 3984,
"Arr": [
[3977, 3, "Futures_OKCoin", "", 0, 0, "Sell(688.9, 2): 20016", 1526954372591, "", ""],
[3976, 5, "", "", 0, 0, "OKCoin:this_week too many positions, long: 2", 1526954372410, "", ""]
],
"Total": 1503,
"Min": 2482
}, {
// The second data structure in logs is the log records in the strategy log table in the bot database
"Max": 0,
"Arr": [],
"Total": 0,
"Min": 0
}, {
// The third data structure in logs is the log records in the strategy log table in the bot database
"Max": 0,
"Arr": [],
"Total": 0,
"Min": 0
}],
"chart": "",
"refresh": 1527049988000,
"summary": "...",
"chartTime ": 0,
"node_id ": 50755,
"online ": true
},
"error ": null
}
}
Таблица журнала стратегии в базе данных
ВArr
Описание значения атрибута в приведенных выше данных о результатах:
"Arr": [
[3977, 3, "Futures_OKCoin", "", 0, 0, "Sell(688.9, 2): 20016", 1526954372591, "", ""],
[3976, 5, "", "", 0, 0, "OKCoin:this_week too many positions, long: 2", 1526954372410, "", ""]
],
Идентификатор | logType (тип журнала) | Еда | Упорядочен | цены | сумма | Дополнительная | дата | контракт Тип | направление |
---|---|---|---|---|---|---|---|---|---|
3977 | 3 | "" | 0 | 0 | 1526954372591 | "" | "" | ||
3976 | 5 | "" | "" | 0 | 0 | 1526954372410 | "" | "" |
extra
является прилагаемым сообщением напечатанного журнала.
Специфические типы бревен представлены:logType
значение:
Тип журнала: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
Значение logType: | Купить | Продажа | ПРЕДСТАВЛЯЕТ | Ошибка | Прибыль | Сообщение | Перезагрузить |
Китайское значение | Журнал типа заказа покупки | Журнал типа ордера продажи | Выйти. | Ошибка | Доходы | Логотип | Перезагрузить |
Таблица журналов таблицы доходов в базе данных Данные, представленные в таблице графика, совпадают с данными о доходах, представленными в таблице стратегии.
"Arr": [
[202, 2515.44, 1575896700315],
[201, 1415.44, 1575896341568]
]
Возьмем один из данных журнала в качестве примера:
[202, 2515.44, 1575896700315]
202
в виде журналаID
; 2515.44
как стоимость доходов;1575896700315
как временные отметки.
Таблица графика в базе данных
"Arr": [
[23637, 0, "{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"],
[23636, 5, "{\"x\":1575960300000,\"y\":3.0735}"]
]
Возьмем один из данных журнала в качестве примера:
[23637, 0, "{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"],
23637
является журналомID
, 0
является индексом серии данных диаграммы, а последними данными"{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"
является данными журнала; эти данные являются данными K-линии на графике.
Для улучшения функций торгового терминала и облегчения ручной торговли теперь доступна функция плагина.
Принцип такой же, как и в инструменте отладки: отправлять кусок кода на докер терминальной страницы
На странице Trading Plugin
, который поддерживаетJavaScript
, Python
, cpp
иMyLanguage
.
Плагин может выполнять код в течение определенного периода времени, и он может выполнять некоторые простые операции, такие какЗаказы айсберга, Ожидаемые приказы, отмена заказаиРасчет заказаТо же самое, что иинструмент отладки, он используетreturn
Вот несколько примеров, и другие функции можно исследовать самостоятельно.
Возвращение на глубинный снимок
// Return to the depth snapshot
function main() {
var tbl = {
type: 'table',
title: 'snapshot of the order depth @ ' + _D(),
cols: ['#', 'Amount', 'Ask', 'Bid', 'Amount'],
rows: []
}
var d = exchange.GetDepth()
for (var i = 0; i < Math.min(Math.min(d.Asks.length, d.Bids.length), 15); i++) {
tbl.rows.push([i, d.Asks[i].Amount, d.Asks[i].Price+'#ff0000', d.Bids[i].Price+'#0000ff', d.Bids[i].Amount])
}
return tbl
}
def main():
tbl = {
"type": "table",
"title": "snapshot of the order depth @ " + _D(),
"cols": ["#", "Amount", "Ask", "Bid", "Amount"],
"rows": []
}
d = exchange.GetDepth()
for i in range(min(min(len(d["Asks"]), len(d["Bids"])), 15)):
tbl["rows"].append([i, d["Asks"][i]["Amount"], str(d["Asks"][i]["Price"]) + "#FF0000", str(d["Bids"][i]["Price"]) + "#0000FF", d["Bids"][i]["Amount"]])
return tbl
void main() {
json tbl = R"({
"type": "table",
"title": "abc",
"cols": ["#", "Amount", "Ask", "Bid", "Amount"],
"rows": []
})"_json;
tbl["title"] = "snapshot of the order depth @" + _D();
auto d = exchange.GetDepth();
for(int i = 0; i < 5; i++) {
tbl["rows"].push_back({format("%d", i), format("%f", d.Asks[i].Amount), format("%f #FF0000", d.Asks[i].Price), format("%f #0000FF", d.Bids[i].Price), format("%f", d.Bids[i].Amount)});
}
LogStatus("`" + tbl.dump() + "`");
// C++ does not support "return json" to display the table, and you can create a bot to display the table of the status bar
}
Приведите промежуточные спреды
// Draw cross-period spreads
var chart = {
__isStock: true,
title : { text : 'spread analysis chart'},
xAxis: { type: 'datetime'},
yAxis : {
title: {text: 'spread'},
opposite: false
},
series : [
{name : "diff", data : []}
]
}
function main() {
exchange.SetContractType('quarter')
var recordsA = exchange.GetRecords(PERIOD_M5)
exchange.SetContractType('this_week')
var recordsB = exchange.GetRecords(PERIOD_M5)
for(var i = 0; i < Math.min(recordsA.length, recordsB.length); i++){
var diff = recordsA[recordsA.length - Math.min(recordsA.length, recordsB.length) + i].Close - recordsB[recordsB.length - Math.min(recordsA.length, recordsB.length) + i].Close
chart.series[0].data.push([recordsA[recordsA.length - Math.min(recordsA.length, recordsB.length) + i].Time, diff])
}
return chart
}
chart = {
"__isStock": True,
"title": {"text": "spread analysis chart"},
"xAxis": {"type": "datetime"},
"yAxis": {
"title": {"text": "spread"},
"opposite": False
},
"series": [
{"name": "diff", "data": []}
]
}
def main():
exchange.SetContractType("quarter")
recordsA = exchange.GetRecords(PERIOD_M5)
exchange.SetContractType("this_week")
recordsB = exchange.GetRecords(PERIOD_M5)
for i in range(min(len(recordsA), len(recordsB))):
diff = recordsA[len(recordsA) - min(len(recordsA), len(recordsB)) + i].Close - recordsB[len(recordsB) - min(len(recordsA), len(recordsB)) + i].Close
chart["series"][0]["data"].append([recordsA[len(recordsA) - min(len(recordsA), len(recordsB)) + i]["Time"], diff])
return chart
// C++ does not support "return json" structure drawing
Есть и другие примеры в
Добавить модуль плагина торгового терминала
Как показано на рисунке, откройте меню добавления модуля на странице терминала
Запустить плагин
Нажмите
Время запуска плагина Максимальное время работы плагина составляет 3 минуты; и он автоматически прекратит работу после превышения 3 минут.
Формула анализа относится к методу расчета рыночной котировки в публичном доступе.alpha101
изworldquant
: http://q.fmz.com/chart/doc/101_Formulaic_Alphas.pdf, который в основном совместим с его грамматикой (с объяснениями не реализованных особенностей), и был улучшен.
Он используется для быстрого выполнения расчетов по временным рядам и проверки идей.Использовать адрес.
Введение страницы:
"{}" ниже представляет собой местоимение, все выражения не являются чувствительными к буквам, а
abs(x), log(x), sign(x)
буквально означает абсолютное значение, логарифм и знаковую функцию соответственно.Следующие операторы, в том числе:+, -, *, /, >, <
, также соответствуют значениям их стандартов;==
обозначает ||
означает x? y: z
обозначает трехсторонний оператор.
rank(x)
: ранжирование поперечных сечений, с возвратом процента местоположения; необходимо указать несколько целевых групп кандидатов, которые не могут быть рассчитаны для единого рынка и напрямую возвращают исходный результат.delay(x, d)
: значение перед периодом d последовательности.sma(x, d)
: простая скользящая средняя d периода последовательности.correlation(x, y, d)
: коэффициент корреляции временных рядов x и y за последние d периоды.covariance(x, y, d)
: ковариантность временных рядов x и y в прошлых d периодах.scale(x, a)
: нормализует данные, чтобыsum(abs(x)) = a
(delta(x, d)
: текущее значение временного ряда x минус значение до d периодов.signedpower(x, a)
: x^a
.decay_linear(x, d)
: взвешенная скользящая средняя д-период временного ряда x, с весами d, d-1, d-2... 1 (нормализованная).indneutralize(x, g)
: нейтральная обработка для отраслевой классификации ts_{O}(x, d)
: выполнять операции ts_min(x, d)
: минимальное значение последних d периодов.ts_max(x, d)
: максимальное значение последних d периодов.ts_argmax(x, d)
: ts_max(x, d)
position.ts_argmin(x, d)
: ts_min(x, d)
position.ts_rank(x, d)
: сортировка значений временных рядов x прошлых d периодов (процентная сортировка).min(x, d)
: ts_min(x, d)
.max(x, d)
: ts_max(x, d)
.sum(x, d)
: сумма прошлых d периодов.product(x, d)
: произведение прошлых d периодов.stddev(x, d)
: стандартное отклонение прошлых d периодов.Вводные данные не являются чувствительными к буквам; данные по умолчанию - это выбранный символ на веб-странице, или его можно указать напрямую, например:binance.ada_bnb
returns
: отзывы о цене закрытия.open, close, high, low, volume
: а именно цена открытия, цена закрытия, самая высокая цена, самая низкая цена и объем торгов в течение периода.vwap
: объемно взвешенная цена исполнения, еще не реализованная, которая в настоящее время является ценой закрытия.cap
: общая рыночная стоимость, еще не реализована.IndClass
: классификация отраслей, еще не внедрена.Поддерживается одновременный выход нескольких результатов (выражаемых списком); например,[sma(close, 10), sma(high, 30)]
В дополнение к вводу данных временных рядов, он также может быть использован в качестве простого калькулятора.
Для платформы FMZ Quant Trading, которая еще не инкапсулировала интерфейс API биржи, к ней можно получить доступ, написав плагин-программу общего протокола.
REST
Протокол:справочная документация.FIX
Протокол:ссылка.Разница междуFIX
Протокол плагин-программы иREST
протокольная плагин-программа представляет собой только взаимодействие между протокольной плагин-программой и интерфейсом обмена. Протокольная плагин-программа имеет такую же детальную обработку взаимодействия докерной программы и формат данных, как FMZ Quant. Для подробности, пожалуйста, обратитесь к примерам в приведенных выше ссылках.
Платформа FMZ Quant Trading предоставляет модульный и настраиваемый
Инструмент отладкистраница предоставляет среду для быстрого тестирования кодов ботом, поддерживая толькоJavaScript
currently.
Он поддерживает локальный редактор удаленного синхронизации стратегии кода к FMZ Quant Trading платформы, и он поддерживаетSublime Text
/Atom
/Vim
/VSCode
На странице редактирования стратегии нажмите
Нажмите
Способы установки плагина различных редакторов немного отличаются. Вы можете нажать кнопку загрузки, чтобы перейти к конкретному элементу плагина удаленной синхронизации.
При запуске живой торговли, вам нужно сохранить параметры данных реальной конфигурации бота, вы можете нажать кнопку JSON
файл, и экспортированная конфигурация параметров стратегии также может быть импортирована в реальный бот снова. Нажмите кнопку
Скачать исходный код
Экспорт исходного кода стратегии, и тип экспортного файла основан на языке программирования стратегии.js
; стратегия python экспортирует файлы с расширениемpy
; Стратегия C++ экспортирует файлы с расширениемcpp
; Стратегия Mylanguage экспортирует файлы с расширениемtxt
. Обратите внимание, что экспортируется только исходный код стратегии, не включая параметры стратегии, ссылки на шаблоны и т. д.
Стратегия экспорта
Экспорт полной стратегии, включая всю информацию о стратегии, такую как исходный код стратегии и дизайн параметров.xml
file.
Стратегия импорта
Используйтеxml
файл экспортируется функцией xml
После импорта нужно нажать кнопку "Сохранить", чтобы сохранить стратегию.
Названия стратегии и описания параметров стратегии могут быть написаны вChinese|English
, отображается на языке, распознаваемом веб-страницами.
В других местах, например:Описание стратегии, инструкция по использованиюи другие тексты вMarkdown
формат, использующий[trans]Chinese|English[/trans]
или[trans]Chinese||English[/trans]
Эффект приведенного выше примера показан на следующем рисунке:
Показать страницу на китайском языке:
Показать страницу на английском языке:
После смены языка, это будет иметь эффект после обновления веб-страницы.
Функции, которые могут писать строки в коде стратегии, также поддерживают переключение языков, такие как функцияLog
, функцияLogStatus
, и т.д.
function main() {
Log("[trans]日志|log[/trans]")
var table = {
type: "table",
title: "[trans]操作|option[/trans]",
cols: ["[trans]列1|col1[/trans]", "[trans]列2|col2[/trans]", "[trans]操作|option[/trans]"],
rows: [
["[trans]比特币|BTC[/trans]", "[trans]以太坊|ETH[/trans]", {"type": "button", "cmd": "coverAll", "name": "平仓|cover", "description": "描述|description"}] // Note: It doesn't need to add [trans] tag in the button
]
}
LogStatus("[trans]信息|message[/trans]", "\n`" + JSON.stringify(table) + "`")
throw "[trans]错误|error[/trans]"
}
import json
def main():
Log("[trans]日志|log[/trans]")
table = {
"type": "table",
"title": "[trans]操作|option[/trans]",
"cols": ["[trans]列1|col1[/trans]", "[trans]列2|col2[/trans]", "[trans]操作|option[/trans]"],
"rows": [
["[trans]比特币|BTC[/trans]", "[trans]以太坊|ETH[/trans]", {"type": "button", "cmd": "coverAll", "name": "平仓|cover", "description": "描述|description"}]
]
}
LogStatus("[trans]信息|message[/trans]", "\n`" + json.dumps(table) + "`")
raise Exception("[trans]错误|error[/trans]")
void main() {
Log("[trans]日志|log[/trans]");
json table = R"({
"type": "table",
"title": "[trans]操作|option[/trans]",
"cols": ["[trans]列1|col1[/trans]", "[trans]列2|col2[/trans]", "[trans]操作|option[/trans]"],
"rows": [
["[trans]比特币|BTC[/trans]", "[trans]以太坊|ETH[/trans]", {"type": "button", "cmd": "coverAll", "name": "平仓|cover", "description": "描述|description"}]
]
})"_json;
LogStatus("[trans]信息|message[/trans]", "\n`" + table.dump() + "`");
Panic("[trans]错误|error[/trans]");
}
После загрузки докерного программного обеспечения, исполняемый файл после декомпрессии (наименование файла:robot
) является программой докера; параметры могут быть указаны для программы докера при развертывании докера.
-v
: проверьте информацию, включая версию и время компиляции текущей программы докера.
Полная команда исполнения основана наApple Mac System
: ./robot -v
.-s
: адрес, указанный для связи с платформой FMZ Quant Trading при запуске программы докера.
Полная команда исполнения основана наApple Mac System
: ./robot -s node.fmz.com/xxxxxxx
; xxxxxxx
является уникальным идентификационным идентификатором каждого счета на платформе FMZ Quant Trading; после выполнения команды будет предложено ввести пароль для соответствующей платформы FMZ Quant Trading.-p
: вы можете напрямую указать параметр в команде run для ввода пароля, что не рекомендуется, потому что параметр пароля останется в текущей системе записи.node.fmz.com/xxxxxxx
является:abc123456
- Да.
Полная команда исполнения основана наApple Mac System
: ./robot -s node.fmz.com/xxxxxxx -p abc123456
.-n
: присоедините информацию об этикетке к запущенной программе докера.
Полная команда исполнения основана наApple Mac System
: ./robot -n macTest -s node.fmz.com/xxxxxxx
Будет...macTest
текстовый ярлык в информации докера на странице управления докером платформы.-l
: распечатать список обмена, поддерживаемый текущим докером.
Полная команда исполнения основана наApple Mac System
: ./robot -l
, т.е. можно выводить названия поддерживаемых бирж.exchange.Go
Функция, нет разумногоwait
ждать окончания корротины во время операции, что приводит к большому количеству корротинов.Decrypt: Secret key decrypt failed
Причина ошибки заключается в том, что изменение пароля учетной записи FMZ вызывает все настроенныеAPI KEY
Чтобы решить эту проблему,API KEY
Нужно переконфигурировать, а докер нужно перезапустить.ValueError: bad marshal data (unknown type code)
. Обновление или установка среды Python, управляемой стратегией, на одну из версий, поддерживаемых стратегией:Python 2.7
, Python 3.5
иPython 3.6
.interrupt
ошибка; ошибка происходит потому, что пользователь нажимаетОстанови ботакнопка на странице бота, когда программа выполняет операцию (например, доступ к интерфейсу платформы), и бот останавливает и прерывает сообщение об ошибке, напечатанное текущей операцией.На странице
Подсчет
После входа в платформу нажмите
Подаккаунты имеют ограниченные разрешения; только авторизованные боты в настройкахдоступные разрешенияможно увидеть на подсчетах. Авторизованный бот имеет право изменять параметры, останавливать и возобновлять прямую торговлю, но он не может изменять объект обмена, настроенный ботом.
Вид торговли в реальном времени
В списке ботов платформы FMZСтраница бота, нажмите кнопку
На
Совместное использование стратегии
Общественное распространение
После нажатия кнопки
Внутреннее совместное использование
После нажатия кнопки
Стратегия аренды
Публичная продажа
После нажатия кнопки
Внутренняя продажа
После нажатия кнопки
Важная примечание:
При создании и распространенииТокен стратегии, пожалуйста, убедитесь в том, чтобы тщательно подтвердить, является ли это
function returnAnalyze(totalAssets, profits, ts, te, period, yearDays) {
// force by days
period = 86400000
if (profits.length == 0) {
return null
}
var freeProfit = 0.03 // 0.04
var yearRange = yearDays * 86400000
var totalReturns = profits[profits.length - 1][1] / totalAssets
var annualizedReturns = (totalReturns * yearRange) / (te - ts)
// MaxDrawDown
var maxDrawdown = 0
var maxAssets = totalAssets
var maxAssetsTime = 0
var maxDrawdownTime = 0
var maxDrawdownStartTime = 0
var winningRate = 0
var winningResult = 0
for (var i = 0; i < profits.length; i++) {
if (i == 0) {
if (profits[i][1] > 0) {
winningResult++
}
} else {
if (profits[i][1] > profits[i - 1][1]) {
winningResult++
}
}
if ((profits[i][1] + totalAssets) > maxAssets) {
maxAssets = profits[i][1] + totalAssets
maxAssetsTime = profits[i][0]
}
if (maxAssets > 0) {
var drawDown = 1 - (profits[i][1] + totalAssets) / maxAssets
if (drawDown > maxDrawdown) {
maxDrawdown = drawDown
maxDrawdownTime = profits[i][0]
maxDrawdownStartTime = maxAssetsTime
}
}
}
if (profits.length > 0) {
winningRate = winningResult / profits.length
}
// trim profits
var i = 0
var datas = []
var sum = 0
var preProfit = 0
var perRatio = 0
var rangeEnd = te
if ((te - ts) % period > 0) {
rangeEnd = (parseInt(te / period) + 1) * period
}
for (var n = ts; n < rangeEnd; n += period) {
var dayProfit = 0.0
var cut = n + period
while (i < profits.length && profits[i][0] < cut) {
dayProfit += (profits[i][1] - preProfit)
preProfit = profits[i][1]
i++
}
perRatio = ((dayProfit / totalAssets) * yearRange) / period
sum += perRatio
datas.push(perRatio)
}
var sharpeRatio = 0
var volatility = 0
if (datas.length > 0) {
var avg = sum / datas.length;
var std = 0;
for (i = 0; i < datas.length; i++) {
std += Math.pow(datas[i] - avg, 2);
}
volatility = Math.sqrt(std / datas.length);
if (volatility !== 0) {
sharpeRatio = (annualizedReturns - freeProfit) / volatility
}
}
return {
totalAssets: totalAssets,
yearDays: yearDays,
totalReturns: totalReturns,
annualizedReturns: annualizedReturns,
sharpeRatio: sharpeRatio,
volatility: volatility,
maxDrawdown: maxDrawdown,
maxDrawdownTime: maxDrawdownTime,
maxAssetsTime: maxAssetsTime,
maxDrawdownStartTime: maxDrawdownStartTime,
winningRate: winningRate
}
}
Фьючерсы_Binance
Он поддерживает режим двойной позиции фьючерсов Binance; вы можете использоватьexchange.IO
перейти:
function main() {
var ret = exchange.IO("api", "POST", "/fapi/v1/positionSide/dual", "dualSidePosition=true")
// ret : {"code":200,"msg":"success"}
Log(ret)
}
def main():
ret = exchange.IO("api", "POST", "/fapi/v1/positionSide/dual", "dualSidePosition=false")
Log(ret)
void main() {
auto ret = exchange.IO("api", "POST", "/fapi/v1/positionSide/dual", "dualSidePosition=true");
Log(ret);
}
Он поддерживает переключение между перекрещенной позиции / изолированной позиции
function main() {
exchange.SetContractType("swap")
exchange.IO("cross", true) // Switch to crossed position
exchange.IO("cross", false) // Switch to isolated position
}
def main():
exchange.SetContractType("swap")
exchange.IO("cross", True)
exchange.IO("cross", False)
void main() {
exchange.SetContractType("swap");
exchange.IO("cross", true);
exchange.IO("cross", false);
}
Фьючерсы_HuobiDM
Он поддерживает изменение адреса Huobi Futures участвующих в подписи, который не переключается по умолчанию.exchange.IO("signHost", "")
чтобы установить пустую строку.
Использованиеexchange.IO("signHost", "https://aaa.xxx.xxx")
изменить адрес базиса Huobi Futures, участвующего в проверке подписи.
Использованиеexchange.IO("base", "https://bbb.xxx.xxx")
илиexchange.SetBase("https://bbb.xxx.xxx")
чтобы изменить базовый адрес интерфейса платформы.
Когда торговая пара установлена наXXX_USDT
, используйте функциюexchange.SetContractType("swap")
установить код контракта наswap
Вечный контракт, с использованиемexchange.IO("cross", true)
может переключиться наUSDT
- маржинальный вечный контракт в режиме перекрестной позиции.exchange.IO("cross", false)
Первоначальный по умолчанию - режим изолированного положения.
Хьюби
Он поддерживает токены Huobi с лотерейным плечом, такие как:LINK*(-3)
; код, определенный биржей:link3susdt
, который записывается, когда FMZ устанавливает торговую паруLINK3S_USDT
- Да.
Также в стратегии можно переключать торговые пары:
function main() {
exchange.SetCurrency("LINK3S_USDT")
Log(exchange.GetTicker())
}
def main():
exchange.SetCurrency("LINK3S_USDT")
Log(exchange.GetTicker())
void main() {
exchange.SetCurrency("LINK3S_USDT");
Log(exchange.GetTicker());
}
ОКX
Интерфейс OKX может переключаться на среду тестирования ботов-симуляторов OKX; используяexchange.IO("simulate", true)
Если вы хотите переключиться на реальную среду торговли, используйтеexchange.IO("simulate", false)
Первоначальный по умолчанию - это реальная торговая среда.
Он поддерживает переключение режимов маржи счета; использованиеexchange.IO("cross", true)
перейти на режим перекрестного положения и использоватьexchange.IO("cross", false)
для перехода на режим изолированного положения исходным параметром является режим перекрещенного положения.
Фьючерсы_Бибокс
Использованиеexchange.IO("cross", true)
перейти на режим перекрестного положения и использоватьexchange.IO("cross", false)
перейти в режим изолированного положения; исходный по умолчанию режим перекрестного положения.
Биржа не поддерживает запрос текущих ожидающих заказов и интерфейс для запроса исторических записей торговли на рынке, поэтомуGetOrders
иGetTrades
функции не поддерживаются.
Фьючерсы_Bitget
Использованиеexchange.IO("cross", true)
перейти на режим перекрестного положения и использоватьexchange.IO("cross", false)
перейти в режим изолированного положения.
Фьючерсы_AOFEX
Использованиеexchange.IO("cross", true)
перейти на режим перекрестного положения и использоватьexchange.IO("cross", false)
перейти в режим изолированного положения.
Фьючерсы_MEXC
Использованиеexchange.IO("cross", true)
перейти на режим перекрестного положения и использовать` ` обмен.IO("кросс",