在发明者量化交易平台上做开发的小伙伴们可能经常有这样的需求:
开发出一个策略出租时希望对于策略进行不同的资金限制,对策略出租时进行不同的交易所限制(限制策略操作的交易所),再或者希望对于策略出租时进行交易所账号配置的限制(指定这个策略只能操作事先约定好的账户,策略使用者使用其它账户时策略提示并不再做交易等操作)。
这些显然不能写死在代码里,因为如果写死在代码中。所有用户都会受到这些条件限制,就不能针对不同用户群体做出不同使用权限的控制。
基于以上需求场景,发明者量化交易平台扩展了新功能:策略出租注册码元数据设置
在创建注册码时,可以指定一个元数据Meta
,数据为字符串。注意:生成注册码时Meta的长度不能超过190个字符。
例如我是一个策略开发大佬,我开发了一个现货交易对为BTC_USDT的策略,策略只做多(初始时只有计价币QuoteCurrency
即USDT,买入了就持仓具有交易币BaseCurrency
即BTC),我要出租这个策略,策略名称为test1
。
可见,对于策略的限定设计需要结合具体策略的情况具体设计。本例是现货策略的一个演示,如果策略是一个期货策略呢?那就要限定期货持仓信息了(根据GetPosition返回的持仓数据)。当策略发现超过限定的持仓时,不再执行下单开仓逻辑(其它逻辑需要正常执行,例如平仓等操作)。
所以这些设计需要结合策略本身具体而言,本例只是一个简单的说明例子,可能并不具有实际使用价值。
策略源码:
function main() {
// 策略允许的计价币最大资产数值
var maxBaseCurrency = null
// 获取创建注册码时的元数据
var level = GetMeta()
// 检测Meta对应的条件
if (level == "level1") {
// -1为不限制
maxBaseCurrency = -1
} else if (level == "level2") {
maxBaseCurrency = 10
} else if (level == "level3") {
maxBaseCurrency = 1
} else {
maxBaseCurrency = 0.5
}
while(1) {
Sleep(1000)
var ticker = exchange.GetTicker()
// 检测资产数值
var acc = exchange.GetAccount()
if (maxBaseCurrency != -1 && maxBaseCurrency < acc.Stocks + acc.FrozenStocks) {
// 停止执行策略交易逻辑
LogStatus(_D(), "持仓超过注册码的使用限定,不再执行策略交易逻辑!")
continue
}
// 其它交易逻辑
// 正常输出状态栏信息
LogStatus(_D(), "策略正常运行!ticker数据:\n", ticker)
}
}
在创建注册码时,策略库中找到test1策略,点击右侧的操作项,点击售卖。
点击内部出售。
点击“小扳手”,设置注册码元数据。
然后把要限定的信息写进Meta控件,例如本例设计的几种策略使用等级:
我们首先给Meta控件设置level1
,让这个创建的注册码具有test1策略的level1
等级。
创建好了注册码:
购买地址: https://www.fmz.com/m/s/282900
注册码: 7af0c24404b268812c97b55d073c1867
策略出租者将这个注册码发送给策略租用者。
例如,这个时候我在我的另一个账号(策略租用者)使用这个注册码,就获得了test1这个策略的使用权。
策略租用者,创建实盘,策略使用test1,添加一个WexApp现货交易所对象(WexApp是FMZ平台的模拟盘),运行实盘。
可以看到策略正常运行起来了,说明level1
等级不限定持仓数量(现货账户持有的币数)。
当策略注册码已经使用,如果策略开发者需要调整发出的注册码的Meta数据时,还可以修改。
在策略库,出售记录中。
可以修改Meta数据。
我们把之前的注册码的Meta数据修改为level3
,然后这边策略使用者,重启实盘测试。
可以看到上图,触发了level3
等级限定持仓最大只能为1个币的限制。
根据不同用户群体、不同付费等级出租策略时,具体配置Meta元数据,以实现策略分级控制。
当然,以上只是列举了最常见的限定、控制需求。还有各种各样的类似需求都可以使用这个功能实现。