市场成交记录的结构。
市场成交记录Id,如果交易所接口没有提供Id则使用时间戳填充。 Id string 毫秒时间戳。 Time number 成交价格。 Price number 成交数量。 Amount number 订单类型,参考{@var/ORDER_TYPE/ORDER_TYPE_BUY ORDER_TYPE_BUY}、{@var/ORDER_TYPE/ORDER_TYPE_SELL ORDER_TYPE_SELL}。 Type number
exchange.GetTrades()函数返回一个Trade数组或者空数组。
{@fun/Market/exchange.GetTrades exchange.GetTrades}
市场行情的结构。
交易所接口返回的原始数据,回测时无此属性。 Info object
- 对于现货交易所对象来说,```Symbol```字段值的格式(举例子)为:```BTC_USDT```,表示BTC_USDT现货交易对。
- 对于期货交易所对象来说,```Symbol```字段值的格式(举例子)为:```BTC_USDT.swap```,表示BTC的USDT本位永续合约。
- 对于期货交易所对象来说,```Symbol```字段值的格式(举例子)为:```BTC_USDT.BTC-240108-40000-C```,表示BTC的USDT本位,行权日期为2024年1月8日,行权价格为40000的看涨期权合约。
Symbol
string
最高价,如果交易所接口没有提供24小时最高价则使用卖一价格填充。
High
number
最低价,如果交易所接口没有提供24小时最低价则使用买一价格填充。
Low
number
当前时刻的卖一价。
Sell
number
当前时刻的买一价
Buy
number
最新的成交价。
Last
number
周期开盘价,如果交易所接口没有提供24小时滚动周期的开盘价则使用当前价格填充。
Open
number
最近成交量,原则上现货成交量单位为交易币种(baseCurrency),合约成交量单位为合约张数。 如果交易所接口没有提供此类数据则使用交易所接口现有的数据填充,例如可能为计价币(quoteCurrency)为单位的成交量。
Volume
number
毫秒级别时间戳。
Time
number
持仓量,大部分交易所接口不提供该数据,不支持该数据时值为0。
OpenInterest
number
exchange.GetTicker()函数返回一个Ticker结构。
对于期权合约来说,```exchange.GetTicker()```函数调用很容易报错。因为期权合约盘口通常流动性较差,经常出现买一、卖一没有挂单的情况,此时FMZ底层检测到```Ticker```结构字段```Buy```或者```Sell```为0时会触发报错提示。
{@fun/Market/exchange.GetTicker exchange.GetTicker}, {@fun/Market/exchange.GetTickers exchange.GetTickers}
### Record
K线Bar的结构,标准的OHLC结构,用来画K线和指标计算分析。
毫秒级别时间戳,对于一个Record结构,其Time属性值为这根K线Bar的周期的起始时间戳。
Time
number
开盘价。
Open
number
最高价。
High
number
最低价。
Low
number
收盘价。
Close
number
持仓量,大部分交易所接口不提供该数据,不支持该数据时值为0。
OpenInterest
number
交易量。原则上现货成交量单位为交易币(baseCurrency),合约成交量单位为合约张数, 如果交易所接口没有提供此类数据则使用交易所接口现有的数据填充,例如可能为计价币(quoteCurrency)为单位的成交量。
Volume
number
exchange.GetRecords()函数返回一个Record数组或者空数组。 每一个Record结构代表一个K线柱,即一根K线Bar。
对于python语言,不同版本的pandas包可能处理不同,例如:
```python
pandas.DataFrame(records) // 可能需要调整为:pandas.DataFrame(list(records))
相关报错信息:in getattr KeyError: 'dtype'
。
{@fun/Market/exchange.GetRecords exchange.GetRecords}
订单的结构。
交易所接口应答的原始数据,回测时无此属性。 Info object
- 对于现货交易所对象来说,```Symbol```字段值的格式(举例子)为:```BTC_USDT```,表示BTC_USDT现货交易对。
- 对于期货交易所对象来说,```Symbol```字段值的格式(举例子)为:```BTC_USDT.swap```,表示BTC的USDT本位永续合约。
Symbol
string
订单Id,该属性由交易所品种代码和交易所原始订单Id组成,以英文逗号间隔。例如OKX交易所的现货交易对```ETH_USDT```订单的属性```Id```格式为:```ETH-USDT,1547130415509278720```。
Id
string
下单价格,注意市价单的该属性可能为0或者-1。
Price
number
下单数量,注意市价单的该属性可能为金额并非币数。
Amount
number
成交数量,如果交易所接口不提供该数据则可能使用0填充。
DealAmount
number
成交均价,注意有些交易所不提供该数据。不提供、也无法计算得出的情况该属性设置为0。
AvgPrice
number
订单状态,参考{@var/ORDER_STATE/ORDER_STATE_PENDING ORDER_STATE_PENDING}、{@var/ORDER_STATE/ORDER_STATE_CLOSED ORDER_STATE_CLOSED}、{@var/ORDER_STATE/ORDER_STATE_CANCELED ORDER_STATE_CANCELED}、{@var/ORDER_STATE/ORDER_STATE_UNKNOWN ORDER_STATE_UNKNOWN}。
Status
number
订单类型,参考{@var/ORDER_TYPE/ORDER_TYPE_BUY ORDER_TYPE_BUY}、{@var/ORDER_TYPE/ORDER_TYPE_SELL ORDER_TYPE_SELL}。
Type
number
合约订单的开、平仓方向,参考{@var/ORDER_OFFSET/ORDER_OFFSET_OPEN ORDER_OFFSET_OPEN}、{@var/ORDER_OFFSET/ORDER_OFFSET_CLOSE ORDER_OFFSET_CLOSE}。
Offset
number
现货订单中该属性为```""```,即空字符串。合约订单中该属性为具体的合约代码。
ContractType
string
```Order```订单结构可由```exchange.GetOrder()```、```exchange.GetOrders()```函数返回。```exchange.GetOrders()```函数返回的是```Order```结构的数组或者空数组,如果当前没有未完成的订单,则返回```[]```即空数组。```Order```订单结构的```Status```属性可以直接和```ORDER_STATE_PENDING```等常量比较,判断是否相等从而确定订单状态。
对于单向持仓模式下,对于无法判断订单是否是平仓(减仓)时,```Offset```字段默认设置为开仓方向,即```ORDER_OFFSET_OPEN```。
{@fun/Trade/exchange.GetOrder exchange.GetOrder}, {@fun/Trade/exchange.GetOrders exchange.GetOrders}, {@fun/Trade/exchange.GetHistoryOrders exchange.GetHistoryOrders}
### OrderBook
市场深度中的订单结构。
价格。
Price
number
数量。
Amount
number
exchange.GetDepth()函数返回的数据结构中,Bids、Asks的属性值为OrderBook数组。
{@fun/Market/exchange.GetDepth exchange.GetDepth}, {@struct/Depth Depth}
### Depth
市场深度的结构。
卖单数组,即OrderBook数组,按价格从低向高排序,数组中第一个OrderBook结构的Price最低。
Asks
array
买单数组,即OrderBook数组,按价格从高向低排序,数组中第一个OrderBook结构的Price最高。
Bids
array
毫秒级别时间戳。
Time
number
exchange.GetDepth()函数返回一个Depth结构。
{@fun/Market/exchange.GetDepth exchange.GetDepth}, {@struct/OrderBook OrderBook}
### Account
账户信息的结构。
交易所接口返回的原始数据,回测时无此属性。
Info
object
可用的计价币数量,现货中如果交易对是BTC_USDT,Balance指的是当前可用USDT数量。 U本位合约中Balance指的是可用保证金(USDT,quoteCurrency)的数量。
Balance
number
订单未成交时,冻结的资产数值。
FrozenBalance
number
可用交易币数量,现货中如果交易对是BTC_USDT,Stocks指的是当前可用BTC数量。 币本位合约中Stocks指的是可用保证金(币,baseCurrency)的数量。
Stocks
number
订单未成交时,冻结的资产数值。
FrozenStocks
number
仅期货交易所对象支持该字段,```Equity```字段为当前合约设置下期货账户保证金**总权益**。如果交易所接口未提供相关数据则该字段为0。
Equity
number
仅期货交易所对象支持该字段,```UPnL```字段为当前合约设置下期货账户保证金开仓的所有仓位**未实现盈亏**总和。
UPnL
number
exchange.GetAccount()函数返回一个Account结构。 返回的结构中的数据依赖于当前设置的交易对、合约代码。
{@fun/Account/exchange.GetAccount exchange.GetAccount}
### Asset
具体币种资产信息的结构。
交易所定义的币种资产名称,可能同样的币种不同交易所定义的名称有差别,例如```BTC```在某些交易所可能称为```XBT```。
Currency
string
币种资产的可用余额。
Amount
number
币种资产的冻结数量。
FrozenAmount
number
币种资产的冻结数量```FrozenAmount```可能包含未成交的订单锁定的资产、期货持仓锁定的保证金部分。
{@fun/Account/exchange.GetAssets exchange.GetAssets}
### Position
合约仓位信息的结构。
交易所接口返回的原始数据,回测时无此属性。
Info
object
```Symbol```字段为FMZ平台定义的交易品种代码,格式与{@struct/Ticker Ticker}结构的```Symbol```字段一致。
- 对于现货交易所对象来说,```Symbol```字段值的格式(举例子)为:```BTC_USDT```,表示BTC_USDT现货交易对。
- 对于期货交易所对象来说,```Symbol```字段值的格式(举例子)为:```BTC_USDT.swap```,表示BTC的USDT本位永续合约。
Symbol
string
持仓杆杠大小,如果交易所接口没有提供该数据则通过计算填充,可能会有误差。
MarginLevel
number
持仓量,通常是正整数(合约张数)。注意每个交易所的合约乘数、价值等合约规格可能不一样。
Amount
number
仓位冻结量,平仓单未成交时的临时冻结仓位数量。
FrozenAmount
number
持仓均价,原则上该属性为仓位总体的平均价格(不参与结算), 如果交易所接口没有提供该数据则用交易所接口现有的持仓均价填充(参与结算)。
Price
number
持仓浮动盈亏,原则上为持仓的未实现盈亏,如果交易所接口没有提供该数据则用交易所接口其它盈亏数据填充, 盈亏数值的单位和当前合约保证金的单位相同。
Profit
number
仓位类型,参考{@var/POSITION_DIRECTION/PD_LONG PD_LONG}, {@var/POSITION_DIRECTION/PD_SHORT PD_SHORT}。
Type
number
合约代码,具体可以参看{@fun/Futures/exchange.SetContractType exchange.SetContractType}函数的描述内容。
ContractType
string
仓位占用的保证金,如果交易所接口没有提供该数据则使用0填充。
Margin
number
exchange.GetPositions()函数返回一个Position数组或者空数组。
对于加密货币期货需要注意,exchange.GetPositions()函数返回的Position结构数组。 对于其中持仓数据结构中的FrozenAmount、Profit、Margin属性,由于交易所提供数据并不统一, 不同交易所对象调用exchange.GetPositions()接口时返回的数据的定义可能不同。 例如,有些交易所持仓数据中无仓位冻结数据,此时FrozenAmount为0。 如果需要计算某些数据可以使用Info属性中的原始数据计算分析。
{@fun/Futures/exchange.GetPositions exchange.GetPositions}
### Market
交易品种市场信息的结构。
取值例如:```"btcusdt"```,```Symbol```字段记录该交易品种在交易所的原始名称。需要注意该属性的格式、定义与{@struct/Ticker Ticker}结构的```Symbol```字段不同。
Symbol
string
取值例如:```"BTC"```,```BaseAsset```字段记录交易币名称(即:baseCurrency),统一为大写字母。
BaseAsset
string
取值例如:```"USDT"```,```QuoteAsset```字段记录计价币名称(即:quoteCurrency),统一为大写字母。
QuoteAsset
string
取值例如:```0.01```,```TickSize```字段记录该交易品种在交易所的价格最小变动数值。
TickSize
number
取值例如:```0.01```,```AmountSize```字段记录该交易品种在交易所的下单量最小变动数值。
AmountSize
number
取值例如:```2```,```PricePrecision```字段记录该交易品种在交易所的价格精度,表示价格精确到2位小数。
PricePrecision
number
取值例如:```3```,```AmountPrecision```字段记录该交易品种在交易所的下单量精度,表示下单量精确到3位小数。
AmountPrecision
number
取值例如:```0.001```,```MinQty```字段记录该交易品种在交易所的最小下单量。
MinQty
number
取值例如:```1000```,```MaxQty```字段记录该交易品种在交易所的最大下单量。
MaxQty
number
取值例如:```5```,```MinNotional```字段记录该交易品种在交易所的最小下单金额。
MinNotional
number
取值例如:```9999999```,```MaxNotional```字段记录该交易品种在交易所的最大下单金额
MaxNotional
number
字段```CtVal```记录该交易品种在交易所的一张合约对应的价值,单位为```CtValCcy```字段记录的币种。例如:```CtVal```为0.01,```CtValCcy```为```"BTC"```表示一张合约价值0.01个BTC。
CtVal
number
字段```CtValCcy```记录一张合约的价值单位,一张合约的价值单位可能是:```BTC```、```USD```、```ETH```等。
CtValCcy
number
字段```Info```记录交易所市场信息接口返回的该品种的原始数据。
Info
object
exchange.GetMarkets()函数返回包含此```Market```结构的字典。
由于各个交易所对于市场信息数据支持程度不同,对于交易所没有支持的字段会被忽略。以上各个字段数据取值均来自于交易所接口原始数据,具体也可以查询```Info```字段内容。
{@fun/Market/exchange.GetMarkets exchange.GetMarkets}
### Funding
交易品种资金费率信息的结构,仅有加密货币永续合约支持资金费率。
加密货币期货交易所资金费率接口调用时返回的原始数据。
Info
object
```Symbol```字段为FMZ平台定义的交易品种代码。
Symbol
string
资金费率间隔周期,单位:毫秒。```28800000```即8小时间隔。
Interval
number
资金费率下一期开始时刻(本期结算时刻)的时间戳,单位:毫秒。
Time
number
本期结算时将要使用的资金费率。
Rate
number
不同期货交易所的永续合约资金费率有不同的计算方法和机制,结算周期有1小时、4小时、8小时、一天。
期货交易所的永续合约的本期资金费率有固定值,有实时计算的浮动值。
```Rate```字段为不带```%```的资金费率数值,如果换算为带```%```的数值可以乘以100再加上末尾的```%```。
{@fun/Futures/exchange.GetFundings exchange.GetFundings}
### OtherStruct
### HttpQuery-options
该JSON结构用于配置HttpQuery函数、HttpQuery_Go函数发送Http请求的各项参数。
请求方法,例如:```GET```、```POST```等。
method
string
请求体。例如在POST请求中,body可以包含表单数据、JSON、文本等。
body
string
字符集编码。例如指定文本数据在body中的编码方式为:```"UTF-8"```。
charset
string
cookie是一种用于在客户端(通常是浏览器)和服务器之间存储和交换状态信息的小片数据。
cookie
string
用来模拟浏览器tls指纹。
profile
string
设置为true时,此次HttpQuery函数调用返回完整的应答报文。设置为false时只返回应答报文Body中的数据。
debug
bool
请求头信息,以键值对的形式存在(JSON结构),用于传递各种信息,如内容类型、认证信息、缓存控制等。
headers
JSON
超时设置,设置1000表示1秒钟超时。
timeout
number
使用范例:
```js
function main() {
var options = {
method: "POST",
body: "a=10&b=20&c=30",
charset: "UTF-8",
cookie: "session_id=12345; lang=en",
profile: "chrome_103",
debug: false,
headers: {"TEST-HTTP-QUERY": "123"},
timeout: 1000
}
var ret = HttpQuery("http://127.0.0.1:8080", options)
Log(ret)
}
以上代码执行时发出的http报文:
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Cookie: session_id=12345; lang=en
Host: 127.0.0.1:8080
Test-Http-Query: 123
Transfer-Encoding: chunked
User-Agent: Mozilla/5.0 (Macintosh; ...
Accept-Encoding: gzip, deflate, br
e
a=10&b=20&c=30
0
{@fun/Global/HttpQuery HttpQuery}, {@fun/Global/HttpQuery_Go HttpQuery_Go}
该JSON结构为HttpQuery函数调用时,参数options
结构中指定debug字段为true时HttpQuery函数调试模式返回的数据结构。
http状态码 StatusCode number 请求头信息。 Header JSON Cookies信息。 Cookies array 请求的完整路径信息。 Trace JSON 报文长度 Length number 报文内容。 Body string
返回的JSON数据结构举例:
{
"StatusCode": 302,
"Header": {
"Content-Type": ["text/html"],
// ...
},
"Cookies": [{
// ...
}],
"Trace": {},
"Length": 154,
"Body": "..."
}
{@fun/Global/HttpQuery HttpQuery}, {@fun/Global/HttpQuery_Go HttpQuery_Go}
该JSON结构用于配置策略状态栏显示的表格内容。
用于设置所要解析显示的UI、控件的类型,对于状态栏表格来说固定设置为:table
。
type
string
用于设置状态栏表格的标题。
title
string
用于设置状态栏表格的列标题,数组的第一个元素为第一列的标题,以此类推。
cols
array
用于设置状态栏表格的行数据,该rows数组(二维数组)的第一个元素亦为数组结构,这个数组结构长度应当与表格列数一致(该数组结构中的元素与表格列名一一对应)即表格中的第一行数据。
rows
array
function main() {
var tbl = {
type: "table",
title: "标题",
cols: ["列1", "列2", "列3"],
rows: [
["行1列1", "行1列2", "行1列3"],
["行2列1", "行2列2", "行2列3"],
["行3列1", "行3列2", "行3列3"],
]
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}
{@fun/Log/LogStatus LogStatus}
该JSON结构用于配置状态栏中的按钮控件,按钮控件JSON结构可以嵌入到状态栏表格JSON结构中。该结构为旧版本结构,平台目前仍然兼容,建议使用最新版本的按钮JSON结构。 状态栏按钮控件构造范例(按钮触发点击之后,弹框中包含单个输入控件,通过input字段构造):
{
"type": "button",
"cmd": "open",
"name": "开仓",
"input": {
"name": "开仓数量",
"type": "number",
"defValue": 1
}
}
状态栏按钮控件点击触发后的弹框中的控件通过input
或者group
设置。
对于按钮控件来说固定设置为:button
。
type
string
按钮类型设置
class
string
按钮控件上的文本,即按钮名称。
name
string
按钮控件触发点击操作时,发送给策略的交互命令内容。
cmd
string
按钮控件的描述信息,在状态栏中鼠标放在该按钮上时显示的描述信息。
description
string
设置按钮为禁用(true) / 启用(false)。
disabled
bool
在构造状态栏按钮进行交互时也支持输入数据,交互指令最终由GetCommand()
函数捕获。给状态栏中的按钮控件的JSON数据结构中增加input
项用于配置按钮触发时显示的弹框中的输入控件。
例如设置input
字段值为:
{
"name": "开仓数量",
"type": "number",
"defValue": 1,
"description": "test",
}
上述JSON结构中各字段描述:
- name
状态栏按钮触发点击操作后,弹出的弹框中控件的标题。
- description
状态栏按钮触发点击操作后,弹出的弹框中控件的描述信息。
- type
状态栏按钮触发点击操作后,弹出的弹框中控件的类型。type字段可取值如下所示:
1、"number"
:数值输入控件。
2、"string"
:字符串输入控件。
3、"selected"
:下拉框控件。
4、"boolean"
:开关控件。
- defValue
状态栏按钮触发点击操作后,弹出的弹框中控件的默认值。
如果是下拉框类型控件(selected),defValue字段用于设置下拉框选项,例如:"input": {"name": "开仓数量", "type": "selected", "defValue": "A|B|C"}
,下拉框选项的文本描述被设置为A、B、C。
对于下拉框类型控件扩展的字段:
- options
状态栏按钮控件触发的页面中下拉框控件,可以使用options字段设置选项。options字段中的选项不仅支持字符串,也支持使用{text: "描述", value: "值"}
结构。使用defValue字段设置默认选项,默认选项可以是多选。
- multiple
该字段设置为true时,支持下拉框多选。
input JSON
group
array
状态栏中按钮JSON结构的```class```取值范例:
```js
function main() {
var table = {
type: "table",
title: "状态栏按钮样式",
cols: ["默认", "原始", "成功", "信息", "警告", "危险"],
rows: [
[
{"type":"button", "class": "btn btn-xs btn-default", "name": "默认"},
{"type":"button", "class": "btn btn-xs btn-primary", "name": "原始"},
{"type":"button", "class": "btn btn-xs btn-success", "name": "成功"},
{"type":"button", "class": "btn btn-xs btn-info", "name": "信息"},
{"type":"button", "class": "btn btn-xs btn-warning", "name": "告警"},
{"type":"button", "class": "btn btn-xs btn-danger", "name": "危险"}
]
]
}
LogStatus("`" + JSON.stringify(table) + "`")
}
```js
function main() {
// 状态栏按钮控件(设置input字段实现)testBtn1按钮触发的页面中的下拉框控件使用options字段设置选项,使用defValue字段设置默认选项。区别于本章其它例子中直接使用defValue设置选项。
var testBtn1 = {
type: "button",
name: "testBtn1",
cmd: "cmdTestBtn1",
input: {name: "testBtn1ComboBox", type: "selected", options: ["A", "B"], defValue: 1}
}
/*
状态栏按钮控件(设置input字段实现)testBtn2按钮触发的页面中的下拉框控件使用options字段设置选项,options字段中的选项不仅支持字符串,
也支持使用```{text: "描述", value: "值"}```结构。使用defValue字段设置默认选项,默认选项可以是多选(通过数组结构实现多选)。多选需要设置额外的字段multiple为真值(true)。
*/
var testBtn2 = {
type: "button",
name: "testBtn2",
cmd: "cmdTestBtn2",
input: {
name: "testBtn2MultiComboBox",
type: "selected",
description: "实现下拉框多选",
options: [{text: "选项A", value: "A"}, {text: "选项B", value: "B"}, {text: "选项C", value: "C"}],
defValue: ["A", "C"],
multiple: true
}
}
// 状态栏分组按钮控件(设置group字段实现)testBtn3按钮触发的页面中的下拉框控件使用options字段设置选项,也支持直接使用defValue设置选项。
var testBtn3 = {
type: "button",
name: "testBtn3",
cmd: "cmdTestBtn3",
group: [
{name: "comboBox1", label: "labelComboBox1", description: "下拉框1", type: "selected", defValue: 1, options: ["A", "B"]},
{name: "comboBox2", label: "labelComboBox2", description: "下拉框2", type: "selected", defValue: "A|B"},
{name: "comboBox3", label: "labelComboBox3", description: "下拉框3", type: "selected", defValue: [0, 2], multiple: true, options: ["A", "B", "C"]},
{
name: "comboBox4",
label: "labelComboBox4",
description: "下拉框4",
type: "selected",
defValue: ["A", "C"],
multiple: true,
options: [{text: "选项A", value: "A"}, {text: "选项B", value: "B"}, {text: "选项C", value: "C"}, {text: "选项D", value: "D"}]
}
]
}
while (true) {
LogStatus("`" + JSON.stringify(testBtn1) + "`\n", "`" + JSON.stringify(testBtn2) + "`\n", "`" + JSON.stringify(testBtn3) + "`\n")
var cmd = GetCommand()
if (cmd) {
Log(cmd)
}
Sleep(5000)
}
}
{@fun/Log/LogStatus LogStatus}
该JSON结构用于配置状态栏中的按钮控件,按钮控件JSON结构可以嵌入到状态栏表格JSON结构中。目前最新版本的按钮JSON结构。 状态栏按钮控件构造范例(按钮触发点击之后,弹框中包含多个输入控件,通过group字段构造):
{
"type": "button",
"cmd": "open",
"name": "开仓下单",
"group": [{
"type": "selected",
"name": "tradeType",
"label": "下单类型",
"description": "市价单、限价单",
"default": 0,
"group": "交易设置",
"settings": {
"options": ["市价单", "限价单"],
"required": true,
}
}, {
"type": "selected",
"name": "direction",
"label": "交易方向",
"description": "买入、卖出",
"default": "buy",
"group": "交易设置",
"settings": {
"render": "segment",
"required": true,
"options": [{"name": "买入", "value": "buy"}, {"name": "卖出", "value": "sell"}],
}
}, {
"type": "number",
"name": "price",
"label": "价格",
"description": "订单的价格",
"group": "交易设置",
"filter": "tradeType==1",
"settings": {
"required": true,
}
}, {
"type": "number",
"name": "amount",
"label": "下单量",
"description": "订单的下单量",
"group": "交易设置",
"settings": {
"required": true,
}
}],
}
状态栏按钮控件点击触发后的弹框中的控件通过input
或者group
设置。
对于按钮控件来说固定设置为:button
。
type
string
按钮控件上的文本,即按钮名称。
name
string
按钮控件触发点击操作时,发送给策略的交互命令内容。
cmd
string
在构造状态栏按钮进行交互时也支持输入数据,交互指令最终由GetCommand()
函数捕获。给状态栏中的按钮控件的JSON数据结构中增加input
项用于配置按钮触发时显示的弹框中的输入控件。
相对于旧版本的input结构,新版本有一些新增字段、改动:
{
"type": "selected",
"name": "test",
"label": "topic",
"description": "desc",
"default": 1,
"filter": "a>1",
"group": "group1",
"settings": { ... }, // 组件配置
}
以上JSON结构中各字段描述、说明:
- type
控件类型(必要字段),支持设置为:"number"
数值输入框, "string"
字符串输入框, "selected"
下拉框, "boolean"
开关控件。
- name
如果当前JSON结构是input字段的字段值,当没有设置label字段时,name为状态栏按钮点击触发后弹出的弹框中的控件标题。
如果当前JSON结构是group字段的字段值(数组结构)中的一个元素,name不作为控件标题使用,name字段用于表示控件输入内容的字段名。例如节选的一段group字段作为说明:
var testBtn3 = {
type: "button",
name: "testBtn3",
cmd: "cmdTestBtn3",
group: [
{name: "comboBox1", label: "labelComboBox1", description: "下拉框1", type: "selected", defValue: 1, options: ["A", "B"]},
{name: "comboBox2", label: "labelComboBox2", description: "下拉框2", type: "selected", defValue: "A|B"},
{name: "comboBox3", label: "labelComboBox3", description: "下拉框3", type: "selected", defValue: [0, 2], multiple: true, options: ["A", "B", "C"]},
{
name: "comboBox4",
label: "labelComboBox4",
description: "下拉框4",
type: "selected",
defValue: ["A", "C"],
multiple: true,
options: [{text: "选项A", value: "A"}, {text: "选项B", value: "B"}, {text: "选项C", value: "C"}, {text: "选项D", value: "D"}]
}
]
}
根据这个片段可知,如果状态栏按钮触发交互,会弹出一个弹框,其中有4个控件,均为下拉框控件。设置好各个控件的选项,点击确定发送交互消息后,策略中的GetCommand函数就会收到cmdTestBtn3:{"comboBox1":1,"comboBox2":0,"comboBox3":[0,2],"comboBox4":["A","C"]}
。
JSON结构中name的值都作为返回交互信息的字段名,例如:comboBox1、comboBox2等。
- label
用于设置控件的标题。
- description
控件的描述信息。如果当前JSON结构是group字段的字段值(数组结构)中的一个元素,当没有设置label字段时,description为状态栏按钮点击触发后弹出的弹框中的控件标题。
- default
控件的默认值。
- filter
选择器,用来隐藏控件。不设置该字段表示不过滤(显示控件);设置该字段时,当表达式为真时不过滤(显示控件)。当表达式为假时过滤(不显示控件)
- group
用来控制控件分组,可折叠。
- settings
组件配置,控件有多种UI可以选择,用此选项可以进行具体设置。例如:
settings:{
multiple:true,
customizable:true,
options:[{name:'xxx|yyy',value:0}]
}
settings相关设置: settings.required:是否必选。 settings.disabled:是否禁用。 settings.min:type=number时有效,表示最小值或字符串最小长度。 settings.max:type=number时有效,表示最大值或字符串最大长度。 settings.step:type=number,render=slider时有效,表示步长。 settings.multiple:type=selected时有效,表示支持多选。 settings.customizable:type=selected时有效,表示支持自定义;用户可以直接在下拉框控件中编辑添加新选项,如果选中新编辑的选项,在触发交互时使用该选项的名称而不是选项代表的值。 settings.options:type=selected时有效,表示选择器的选项数据格式:[“选项1”,”选项2”]、[{‘name’:‘xxx’,‘value’:0}, {‘name’:‘xxx’,‘value’:1}]。 settings.render:渲染组件类型。 type=number时,settings.render不设置(默认数字输入框),可选:slider(滑动条)、date(时间选择器返回时间戳)。 type=string时,settings.render不设置(默认单行输入框),可选:textarea(多行输入)、date(时间选择器返回yyyy-MM-dd hh:mm:ss)、color(颜色选择器返回#FF00FF)。 type=selected时,settings.render不设置(默认下拉框),可选:segment(分段选择器)。 type=boolean时,目前只有默认复选框。
input JSON
group
array
支持双语设置:
```JSON
{
type:'selected',
name:'test',
label:'选项|options',
description:'描述|description',
default:0, // 这里default默认值设置0,表示{name:'xxx|yyy',value:0}选项中的value值
filter:'a>1&&a<10',
group:'分组|group',
settings:{
multiple:true,
customizable:true,
options:[{name:'xxx|yyy',value:0}]
}
}
{@fun/Log/LogStatus LogStatus}
该JSON用于设置自定义画图函数Chart()
的图表配置信息,图表库使用的是Highcharts。这里只列出几个基本的配置字段。
平台扩展字段。设置为true,使用的是Highstocks图表;设置为false,使用的是Highcharts图表。
__isStock string
{
layout: 'single', // 不参于分组,单独显示, 默认为分组 'group'
height: 300, // 指定高度
}
extension JSON 图表标题 title string X轴配置。 xAxis JSON Y轴配置。 yAxis JSON 图表数据系列。 series JSON
简单的画图例子:
// 这个chart在JavaScript语言中是对象,在使用Chart函数之前我们需要声明一个配置图表的对象变量chart
var chart = {
// 该字段标记图表是否为一般图表,有兴趣的可以改成false运行看看
__isStock: true,
// 缩放工具
tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},
// 标题
title : { text : '差价分析图'},
// 选择范围
rangeSelector: {
buttons: [{type: 'hour',count: 1, text: '1h'}, {type: 'hour',count: 3, text: '3h'}, {type: 'hour', count: 8, text: '8h'}, {type: 'all',text: 'All'}],
selected: 0,
inputEnabled: false
},
// 坐标轴横轴即:x轴,当前设置的类型是:时间
xAxis: { type: 'datetime'},
// 坐标轴纵轴即:y轴,默认数值随数据大小调整
yAxis : {
// 标题
title: {text: '差价'},
// 是否启用右边纵轴
opposite: false
},
// 数据系列,该属性保存的是各个数据系列(线,K线图,标签等...)
series : [
// 索引为0,data数组内存放的是该索引系列的数据
{name : "line1", id : "线1,buy1Price", data : []},
// 索引为1,设置了dashStyle:'shortdash'即:设置虚线
{name : "line2", id : "线2,lastPrice", dashStyle : 'shortdash', data : []}
]
}
function main(){
// 调用Chart函数,初始化图表
var ObjChart = Chart(chart)
// 清空
ObjChart.reset()
while(true){
// 获取本次轮询的时间戳,即一个毫秒的时间戳。用来确定写入到图表的X轴的位置
var nowTime = new Date().getTime()
// 获取行情数据
var ticker = _C(exchange.GetTicker)
// 从行情数据的返回值取得买一价
var buy1Price = ticker.Buy
// 取得最后成交价,为了2条线不重合在一起,我们加1
var lastPrice = ticker.Last + 1
// 用时间戳作为X值,买一价作为Y值传入索引0的数据序列
ObjChart.add(0, [nowTime, buy1Price])
// 同上
ObjChart.add(1, [nowTime, lastPrice])
Sleep(2000)
}
}
{@fun/Log/Chart Chart}
该JSON用于设置自定义画图函数KLineChart
的图表配置信息。这里只列出几个基本的配置字段。
是否画在主图。 overlay bool X轴配置。 xAxis JSON Y轴配置。 yAxis JSON 蜡烛图配置。 candle JSON
{@fun/Log/KLineChart KLineChart}
该JSON用于设置exchange.SetData()
函数所要加载的数据,该JSON数据是一个数组结构,其中每个元素也是一个数组即[time, data]
。
数据的时间戳,标记这条数据(data)的时间。
time
number
data是exchange.SetData()
函数加载的数据中某个时间对应的一条数据内容。策略运行时,exchange.GetData()
函数根据当前时间取到对应时间戳的数据。
data string, number, bool, object, array 等。
回测系统中加载数据,策略回测运行时取出数据的例子:
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
function main() {
exchange.SetData("test", [[1579536000000, _D(1579536000000)], [1579622400000, _D(1579622400000)], [1579708800000, _D(1579708800000)]])
while(true) {
Log(exchange.GetData("test"))
Sleep(1000 * 60 * 60 * 24)
}
}
{@fun SetData}, {@fun GetData}
该JSON是EventLoop()
函数返回的数据结构,EventLoop()
函数监听:1、任意WebSocket可读数据事件;2、exchange.Go()、HttpQuery_Go()函数并发的任务完成事件。3、JavaScript语言策略中threading.Thread()
函数创建的线程中发送的消息事件。
事件序列号。 Seq number 事件名称。 Event string 事件线程Id。 ThreadId number 事件索引。 Index number nano时间戳。 Nano number
使用exchange.Go()
函数并发请求,EventLoop()
函数返回的事件数据结构。
{
"Seq":1,
"Event":"Exchange_GetTrades",
"ThreadId":0,
"Index":3,
"Nano":1682068771309583400
}
JavaScript语言的策略中并发执行的线程中(由threading.Thread()
函数创建)使用线程对象的postMessage()
函数发送消息时,接收消息的线程中EventLoop()
函数会监听到以下事件数据结构:
{
"Seq":4,
"Event":"thread",
"ThreadId":1,
"Index":0,
"Nano":1727592066508674000
}
{@fun/Global/EventLoop EventLoop}
该JSON是DBExec()
函数返回的数据结构;使用Dial()
函数创建的对象的exec()
方法执行SQL语句时,也返回该JSON数据结构。
查询的数据的列名,字符串数组。 columns array 查询的具体数据,其中每条数据与列名对应。values字段的值是一个二维数组,其中每个元素为一个数组,是一条数据记录。 values array
查询数据库中的数据举例:
{
"columns":["TS","HIGH","OPEN","LOW","CLOSE","VOLUME"],
"values":[
[1518970320000,100,99.1,90,100,12345.6],
[1518960320000,100,99.1,90,100,12345.6]
]
}
{@fun/Global/DBExec DBExec}, {@fun/Global/Dial Dial}
该JSON是Thread
对象的成员函数join()
返回的数据结构,保存JavaScript
语言策略中并发线程的一些信息,Thread
对象指的是线程对象,通过threading.Thread()
方式创建。
线程Id。 id number 线程是否被强制结束。 terminated bool 线程的运行时间(纳秒)。 elapsed number 线程函数的返回值。 ret number
以下代码测试Thread
对象的join()
函数的超时机制,并打印输出join()
函数的返回值。
function testFunc() {
for (var i = 0; i < 5; i++) {
Log(i)
Sleep(300)
}
}
function main() {
var t1 = threading.Thread(testFunc)
Log(t1.join(1000)) // undefined
Log(t1.join()) // {"id":1,"terminated":false,"elapsed":1506864000}
}
{@fun/Threads/Thread/join join}
内置函数 内置变量