Loading ...

发明者量化API文档

Author: 小小梦, Created: 2017-11-27 09:05:08, Updated: 2019-10-14 17:07:53

[TOC]

基础说明

入门

FMZ量化平台能够做什么?

FMZ(发明者)量化平台(原BotVS)是国内最专业的量化社区,在这里你可以学习、编写、分享、买卖量化策略,在线回测和使用模拟盘模拟交易,运行、公开、围观实盘机器人。支持传统的商品期货与易盛外盘期货, 也支持几乎所有的常用的数字货币交易所。

完整的系列教程

按顺序学习,教程由浅入深,比较详细。API文档内容完整但相对杂乱,并且不涉及平台使用。因此新手可先学习前两个教程,遇到问题再查阅API文档。FMZ量化平台使用入门,FMZ量化平台策略编写初级教程,FMZ量化平台策略编写进阶教程。如果倾向于视频教程,FMZ官方提供了网易云课堂教程数字货币量化交易课程。包含了JavaScript教程、平台使用以及策略编写的完整内容。如果你有编程和交易基础,大约两天即可入门写出简单的策略,没有编程基础的也只需要一两周学习基础的编程知识。如果遇到问题,可以随时到论坛发帖提问,或者发工单,或者在QQ群或者微信群@管理员,一般都会很快解答。

可用哪些编程语言实现我的策略?

FMZ支持使用JavaScriptPythonC++麦语言编写策略。JavaScript快速入门Python快速入门,几种语言中掌握其中一种就足够了。除了支持编写代码方式编写策略,还可以使用可视化模块创建策略。麦语言(Mylanguage)版本使用文档

什么是托管者?

托管者可以理解为您的交易策略的执行者,负责复杂的数据请求,数据接收,网络链接,日志回传等等工作。托管者运行在您的服务器上,即使FMZ网站出现网络故障,也不影响您的托管者运行。托管者可运行在Linux,Windows,mac os,android,树莓派等系统上。托管者页面,Linux安装步骤

支持的交易所

类型
商品期货 Futures_CTP, 支持国内所有期货公司
外盘易盛 Futures_Esunny
数字货币现货 AEX BHEX Poloniex Bibox BigONE
Binance Bit-Z BitFlyer BitMax BitGoGo
Bitfinex Bithumb Zaif Bitstamp Bittrex
Bizu CoinBene CoinEx FUBT STEX
Coincheck Coinone Coinw DigiFinex DragonEx
EXX FCoin GateIO HitBTC Quoine
Huobi KEX Korbit Kraken KuCoin
LiveCoin OKCoin_EN OKEX (V1版本) OKEX_V3 (V3版本) BW
MXC ZB ZBG
数字货币期货(交割合约) Futures_BitMEX Futures_Deribit Futures_HuobiDM Futures_OKCoin (V1版本) Futures_OKEX_V3 (V3版本)
数字货币期货(永续合约) Futures_BitMEX Futures_Deribit Futures_GateIO Futures_OKEX_V3 Futures_BFX
Futures_Bibox Futures_Coinbene Futures_Binance
数字货币现货模拟交易所 WexApp
数字货币现货杠杆交易所 OKEX_V3 Huobi pro FCoin ZB Binance(币安)
Bibox

回测系统

什么是回测系统,有什么用?

当您完成一个策略的量化工作后,怎么才能知道您这个策略的逻辑、策略收益方向等基本情况,赚钱不赚钱?当然我们不能直接拿真金白银人民币去交易市场上跑策略,我们可以用历史数据来测试您的策略,看看您的策略在历史数据中盈利如何,是亏钱还是赚钱。如何使用回测系统

回测系统的数据准确么,结果可信么?

FMZ将回测分为实盘级和模拟级,实盘级完全按照完整的历史数据回测,模拟级生成每隔一段时间的k线来进行回测,两者都是根据真实历史数据回测的,但实盘级数据更精准,结果更加可信。FMZ回测机制说明。但是回测仅仅是策略在历史数据下的表现,历史数据并不能完全代表将来的行情,历史行情可能重演,也可能飞出黑天鹅。所以对待回测结果要理性、客观看待。

不同语言策略回测时应注意的问题:

JavaScriptC++ 策略,回测是在浏览器端进行,实盘机器人或者模拟盘机器人(即BotVS这个模拟盘)运行不用安装任何其它软件、库或模块。Python回测是在托管者上进行,可以在发明者量化的公共服务器上回测,也可以在用户自己的托管者上回测。实盘和回测都依赖托管者所在系统上安装的Python,如果需要使用一些库,需要自行安装(公共服务器上只支持常用的库)。使用Python编写的策略时,如果托管者所在系统环境同时安装了Python2Python3,可以在策略开始第一行设置策略运行时启动的Python版本。如#!python3,#!python2

回测系统中的数据

FMZ平台回测分模拟级回测和实盘级回测两种。模拟级回测根据底层K线周期生成模拟的tick,每个底层K线周期上将生成14个回测时间点,而实盘级则是真实收集的tick,大约几秒就有一次,数据量很大,回测速度慢,因此不能回测特别长的时间。FMZ的回测机制可以使策略在一根K线上交易多次,避免了只能收盘价成交的情况,更加精准又兼顾了回测速度。具体的说明可参考,链接支持自定义数据源

模拟级别

模拟级别回测是按照回测系统的底层K线数据,按照一定算法在给定的底层K线Bar的最高价、最低价、开盘价、收盘价的数值构成的框架内,模拟出ticker数据插值到这个Bar的时间序列中(该Bar的周期中从开始到结束,的时间序列就是模拟出的ticker数据)。 发明者量化模拟级别回测机制说明

实盘级别

实盘级别回测是真实的ticker级别数据在Bar的时间序列中。对于基于ticker级别数据的策略来说,使用实盘级别回测更贴近真实。实盘级别回测,ticker是真实记录的数据,并非模拟生成。支持深度数据、市场成交记录数据回放,支持自定义深度,支持分笔数据。实盘级别回测数据最大支持50MB,在数据上限内不限制回测时间范围,如果需要尽可能增大回测时间范围,可以降低深度档位数值设置,不使用分笔数据以增加回测时间范围。调用GetDepthGetTrades函数获取回放行情数据。在时间轴上某个行情数据时刻,调用 GetTicker , GetTrades , GetDepth , GetRecords ,不会多次推动时间在回测时间轴上移动(不会触发跳到下一个行情数据时刻)。对于以上某个函数重复调用,将推动回测时间在回测时间轴上移动(跳到下一个行情数据时刻)。回测时使用实盘级别回测不宜选择过早时间,可能过早时间段没有实盘级别数据。 实盘级别回测目前支持商品期货币安OKEX

回测页面快捷键

  • 策略编辑页面和策略回测页面切换的快捷键

    img

    使用Ctrl + e键,切换回测页面和策略编辑页面,按住Ctrl键后,单按e键。

  • 策略保存的快捷键

    img

    使用Ctrl + s键,保存策略。

  • 启动回测的快捷键

    img

    使用Ctrl + r键,启动回测。

代码说明

经典策略框架

main()为入口函数。 onexit()为正常退出扫尾函数,最长执行时间为5分钟,可以不声明,如果超时会报错interrupt错误。 onerror()为异常退出函数,最长执行时间为5分钟,可以不声明,Python语言编写的策略不支持该函数。 init()为初始化函数,策略程序会在开始运行时自动调用,可不声明。

  • 说明:

    • 1、回测系统不支持onerror()
    • 2、在实盘或者wexApp模拟盘中,先触发了onerror()函数后,就不会再触发onexit()函数。
    • 3、注意在JavaScriptPythonC++ 语言编写的策略中,需要在策略主循环中调用Sleep函数,回测用于控制回测时间序列回溯速度。实盘用于控制策略轮询时间间隔,从而控制访问交易所API接口的频率。由于用于商品期货的策略是事件驱动(行情数据是推送过来的),商品期货的策略可以不写Sleep函数。
    • 4、参考范例
  • 入口函数main()的说明:

    获取机器人ID

    function main(robotId) {                // main函数可以接收一个参数(参数名可以自定义,比如:robotId),接收传来的机器人ID,让策略可以获取
                                            // 当前机器人的ID
        Log("当前机器人ID:", robotId)
    }
    
  • 数字货币策略基本框架范例:

    function onTick(){
        //在这里写策略逻辑,将会不断调用。
    }
    function main(){
        while(true){
            onTick();
            Sleep(60000);                   // Sleep函数主要用于数字货币策略的轮询频率控制,防止访问交易所API接口过于频繁
        }
    }
    

    举个最简单的例子,如果我想每隔1秒种就在交易所挂一个价格为100,数量为1的买单,可以这么写:

    function onTick(){
        exchange.Buy(100,1);
    }
    function main(){
        while(true){
            onTick();
            Sleep(1000);                    // 暂停多久可自定义,单位为毫秒(1秒=1000毫秒)
        }
    }
    
  • 经典的商品期货策略架构:

    function main(){
        while(true){
            if(exchange.IO("status")){
                exchange.SetContractType("MA000")
                var ticker = exchange.GetTicker()
                Log("MA000 ticker:", ticker)
                LogStatus(_D(), "已经连接CTP !")
            } else {
                LogStatus(_D(), "未连接CTP !")
            }
        }
    }
    

全局常量、数据结构

全局常量

  • exchange

    可视为一个交易所对象,默认为策略参数中添加的第一个交易所,所有与交易所的数据交互,都通过这个对象里面的函数实现。

    • 回测添加交易所对象

      img

    • 实盘机器人页面添加交易所对象

      img

  • exchanges

    exchange的数组,包含多个交易所对象,exchanges[0]即是exchange

    img

  • 常量

    • 订单状态 Order结构中的Status属性。

      常量名 定义
      ORDER_STATE_PENDING 未完成 0
      ORDER_STATE_CLOSED 已经完成 1
      ORDER_STATE_CANCELED 已经取消 2
      ORDER_STATE_UNKNOWN 未知状态(其它状态) 3

      ORDER_STATE_UNKNOWN状态,可以调用exchange.GetRawJSON()获取原始订单状态信息,查询交易所文档,查看具体描述。

    • 订单买卖类型。 Order结构中的Type属性。

      常量名 定义
      ORDER_TYPE_BUY 买单 0
      ORDER_TYPE_SELL 卖单 1
    • 仓位类型 Position结构中的Type属性。

      常量名 定义
      PD_LONG 多头仓位(CTP用closebuy_today平仓) 0
      PD_SHORT 空头仓位(CTP用closesell_today平仓) 1
      PD_LONG_YD 昨日多头仓位(用closebuy平) 2
      PD_SHORT_YD 昨日空头仓位(用closesell平) 3
    • 期货开平仓方向 Order结构中的Offset属性。

      常量名 定义
      ORDER_OFFSET_OPEN 开仓的订单 0
      ORDER_OFFSET_CLOSE 平仓的订单 1
  • 策略参数

    在策略代码中,在策略界面上设置的策略参数,是以全局变量形式体现,JavaScript语言中可以直接访问策略界面上设置的参数数值或者修改,python策略中修改全局变量时需要使用global关键字。 在设置策略参数时,可以使用@符号来控制参数显示依赖。 如图:

    img

    第一个参数名称为test1,参数类型是下拉框,并且有三个选项,下拉框中每个选项对应的索引是0,1,2,test1在代码中是全局变量,值为选项索引,可以直接访问。第二个参数名称为test2,参数类型是数值型,参数名后@test1==2的意思是,该参数test2显示或者隐藏是基于test1的,test1这个变量值等于2的时候(即下拉框选择第三个选项,因为第三个选项的索引是2),test1 == 2为真,则显示test2。否则隐藏test2这个参数。

    如图:

    img

    img

数据结构

部分函数会附带在调用时请求返回的原始JSON信息,该原始JSON数据储存在返回对象的Info属性中,以下是各个数据结构的主要属性描述。

Trade

获取所有交易历史(非自己),由exchange.GetTrades()函数返回。

{
    Time    : 1567736576000, // 时间(Unix timestamp 毫秒)
    Price   : 1000,          // 价格
    Amount  : 1,             // 数量
    Type    : 0              // 订单类型,参考常量里的订单类型,0即为ORDER_TYPE_BUY,ORDER_TYPE_BUY的值为0
}
Ticker

市场行情由exchange.GetTicker()函数返回。

{
    Info    : {...},         // rest Request 请求交易所接口后,交易所接口应答的原始数据。
    High    : 1000,          // 最高价
    Low     : 500,           // 最低价
    Sell    : 900,           // 卖一价
    Buy     : 899,           // 买一价
    Last    : 900,           // 最后成交价
    Volume  : 10000000,      // 最近成交量
    Time    : 1567736576000  // 毫秒级别时间戳
}
Record

标准OHLC结构,用来画K线和指标分析用的,由exchange.GetRecords()函数返回此结构数组。

{
    Time    : 1567736576000,    // 一个时间戳,精确到毫秒,与Javascript的new Date().getTime()得到的结果格式一样
    Open    : 1000,             // 开盘价
    High    : 1500,             // 最高价
    Low     : 900,              // 最低价
    Close   : 1200,             // 收盘价
    Volume  : 1000000           // 交易量
}
Order

订单结构,由exchange.GetOrder()exchange.GetOrders()函数返回。

{
    Info        : {...},            // rest Request 请求交易所接口后,交易所接口应答的原始数据
    Id          : 123456,           // 交易单唯一标识
    Price       : 1000,             // 下单价格
    Amount      : 10,               // 下单数量
    DealAmount  : 10,               // 成交数量
    AvgPrice    : 1000,             // 成交均价,注意,有些交易所不提供该数据,不提供的设置为0
    Status      : 1,                // 订单状态,参考常量里的订单状态ORDER_STATE_CLOSED
    Type        : 0,                // 订单类型,参考常量里的订单类型ORDER_TYPE_BUY
    Offset      : 0                 // 数字货币期货和商品期货的订单数据中,订单的开平仓方向,ORDER_OFFSET_OPEN为开仓,ORDER_OFFSET_CLOSE为平仓方向
}
MarketOrder

市场深度单,即exchange.GetDepth()返回数据中BidsAsks数组中的元素的数据结构。

{
    Price   : 1000,   // 价格
    Amount  : 1       // 数量
}
Depth

市场深度,由exchange.GetDepth()函数返回。

{
    Asks    : [...],          // 卖单数组,MarketOrder数组,按价格从低向高排序
    Bids    : [...],          // 买单数组,MarketOrder数组,按价格从高向低排序
    Time    : 1567736576000   // 毫秒级别时间戳
}
Account

账户信息,由exchange.GetAccount()函数返回。

{
    Info            : {...},  // rest Request 请求交易所接口后,交易所接口应答的原始数据。
    Balance         : 1000,   // 余额(人民币或者美元,在Poloniex交易所里ETC_BTC这样的品种,Balance就指的是BTC的数量,Stocks指的是ETC数量)
    FrozenBalance   : 0,      // 冻结的余额
    Stocks          : 1,      // BTC/LTC数量,数字货币现货为当前可操作币的余额(去掉冻结的币),数字货币期货的话为合约当前可用保证金(传统期货无此属性)
    FrozenStocks    : 0       // 冻结的BTC/LTC数量(传统期货无此属性)
}
Position

期货交易中的持有仓位信息,由exchange.GetPosition()函数返回此结构数组。

{
    Info            : {...},      // rest Request 请求交易所接口后,交易所接口应答的原始数据
    MarginLevel     : 10,         // 杆杠大小
    Amount          : 100,        // 持仓量,OKEX合约交易所,表示合约的份数(整数且大于1,即合约张数)
    CanCover        : 100,        // 可平量,只有股票有此选项,表示可以平仓的数量(股票为T+1)今日仓不能平
    FrozenAmount    : 0,          // 仓位冻结量
    Price           : 10000,      // 持仓均价
    Profit          : 0,          // 持仓浮动盈亏(数据货币单位:BTC/LTC,传统期货单位:RMB,股票不支持此字段,注:OKEX合约全仓情况下指实现盈余,并非持仓盈亏,逐仓下指持仓盈亏)
    Type            : 0,          // PD_LONG为多头仓位(CTP中用closebuy_today平仓),PD_SHORT为空头仓位(CTP用closesell_today)平仓,(CTP期货中)PD_LONG_YD为咋日多头仓位(用closebuy平),PD_SHORT_YD为咋日空头仓位(用closesell平)
    ContractType    : "quarter",  // 商品期货为合约代码,股票为'交易所代码_股票代码',具体参数SetContractType的传入类型
    Margin          : 1           // 仓位占用的保证金
}

行情API

以下函数均可通过exchangeexchanges[0]对象调用,例如:exchange.GetTicker();exchanges[0].GetTicker();返回市场行情。

带有网络访问的API函数调用的重要提示: 在调用任何访问交易所接口的API函数时(如exchange.GetTicker()exchange.Buy(Price, Amount)exchange.CancelOrder(Id)等)都有可能由于各种原因导致访问失败。所以要对这些函数的调用做容错处理,举例:exchange.GetTicker()获取行情数据函数可能由于,交易所服务器问题,网络传输问题等。导致exchange.GetTicker()函数返回值为null,这时就要对exchange.GetTicker()的调用做容错处理。

JavaScript范例:

var ticker = exchange.GetTicker()
if(ticker == null){
    // 重试,或者其它处理逻辑。
}

另外,对于策略的容错性能测试,FMZ专门在回测中增加了独有的容错模式回测。回测系统可以根据设置的参数随机给一些实盘时会发生网络访问的API调用返回一些失败调用时的返回值。可以快速初步检测程序在实盘中的健壮性。

如图: img

exchange.GetTicker()

exchange.GetTicker(),获取市场当前行情,返回值:Ticker结构体。

JavaScript范例:

function main(){
    var ticker = exchange.GetTicker();
    Log("High:", ticker.High, "Low:", ticker.Low, "Sell:", ticker.Sell, "Buy:", ticker.Buy, "Last:",
        ticker.Last, "Volume:", ticker.Volume);
}

商品期货策略实盘时,如果没有行情推送过来时,exchange.GetTicker()函数会阻塞,等待行情推送。 exchange.GetDepth()exchange.GetTrades()exchange.GetRecords()同理。如果不希望阻塞,可以使用切换行情模式

  • exchange.IO("mode", 0) 立即返回模式,如果当前还没有接收到交易所最新的行情数据推送,就立即返回旧的行情数据,如果有新的数据就返回新的数据。

  • exchange.IO("mode", 1) 缓存模式(默认模式),如果当前还没有收到交易所最新的行情数据(同上一次接口获取的数据比较),就等待接收然后再返回,如果调用该函数之前收到了最新的行情数据,就立即返回最新的数据。

  • exchange.IO("mode", 2) 强制更新模式,进入等待一直到接收到交易所下一次的最新推送数据后返回。

exchange.GetDepth()

exchange.GetDepth(),获取交易所订单薄。返回值:Depth结构体。

Depth结构体包含两个结构体数组,分别是Asks[]Bids[],Asks和Bids包含以下结构体变量:

数据类型 变量名 说明
number Price 价格
number Amount 数量

例如我想获取当前卖二价,可以这么写代码:

JavaScript范例:

function main(){
    var depth = exchange.GetDepth();
    var price = depth.Asks[1].Price;
    Log("卖二价为:", price);
}

商品期货实盘时需要注意: 涨停时,卖单卖一的价格是涨停价格,订单量是0,跌停时,买单买一的价格是跌停价格,订单量是0。通过判断买一、卖一的订单量数量,可以判断出是否涨跌停。

exchange.GetTrades()

exchange.GetTrades(),获取交易所交易历史(非自己)。返回值:Trade结构体数组。部分交易所不支持,具体返回的数据是多少范围内的成交记录,因交易所而定,需要根据具体情况处理。

JavaScript范例:

// 在模拟回测中数据为空,必须实盘才有交易历史
function main(){
    var trades = exchange.GetTrades();
    Log("id:", trades[0].Id, "time:", trades[0].Time, "Price:", trades[0].Price, "Amount:", trades[0].Amount,
        "type:", trades[0].Type);
}

exchange.GetRecords()

exchange.GetRecords(Period),返回一个K线历史,K线周期在创建机器人时指定,如果在调用exchange.GetRecords()函数时指定了参数,获取的就是按照该参数周期的K线数据,如果没有参数,按照机器人参数上设置的K线周期或者回测页面设置的K线周期返回K线数据。参数值:PERIOD_M1指1分钟,PERIOD_M5指5分钟,PERIOD_M15指15分钟,PERIOD_M30指30分钟,PERIOD_H1指1小时,PERIOD_D1指一天。返回值:Record结构体数组。K线数据,会随时间累积,最多累积到2000根,然后会更新加入一根,同时删除一根最早时间的K线柱(如队列进出)。部分交易所没有提供K线接口,托管者实时收集数据生成K线。

function main(){
    var records = exchange.GetRecords(PERIOD_H1);
    Log("第一根k线数据为,Time:", records[0].Time, "Open:", records[0].Open, "High:", records[0].High);
    Log("第二根k线数据为,Time:", records[1].Time ,"Close:", records[1].Close);
    Log("当前K线(最新)", records[records.length-1] ,"上一根K线", records[records.length-2]);
}

注意: exchange.GetRecords()函数获取K线数据有2种情况:

  • 1、交易所提供了K线数据接口,这种情况,获取的数据是交易所直接返回的数据。

  • 2、交易所没有提供K线数据接口,FMZ底层在每次用户调用exchange.GetRecords()时获取交易所最近成交记录,即exchange.GetTrades()函数,合成K线数据。

详细参见帖子:交易所API特殊问题汇总

C++语言如果要自己构造K线数据有以下代码范例:

#include <sstream>
void main() { 
    Records r;
    r.Valid = true;
    for (auto i = 0; i < 10; i++) {
        Record ele;
        ele.Time = i * 100000;
        ele.High = i * 10000;
        ele.Low = i * 1000;
        ele.Close = i * 100;
        ele.Open = i * 10;
        ele.Volume = i * 1;
        r.push_back(ele);
    }
    Log(r);                      // 输出显示:Records[10]
    auto ma = TA.MA(r,10);       
    Log(ma);                     // 输出显示:[nan,nan,nan,nan,nan,nan,nan,nan,nan,450]
}

exchange.GetRawJSON()

exchange.GetRawJSON(),返回最后一次REST API请求返回的原始内容(字符串),可以用来自己解析扩展信息。返回值:string类型,只在实盘环境下有效。

JavaScript范例:

function main(){
    exchange.GetAccount(); 
    var obj = JSON.parse(exchange.GetRawJSON());
    Log(obj);
}

exchange.GetRate()

exchange.GetRate(),返回交易所使用的流通货币与当前显示的计价货币的汇率, 返回1表示禁用汇率转换。返回值:number类型。

注意:

  • 如果没有调用exchange.SetRate()设置过转换汇率,exchange.GetRate()默认返回的汇率值是1,即当前显示的计价货币没有发生过汇率转换。
  • 如果使用exchange.SetRate()设置过一个汇率值,例如7,那么当前exchange这个交易所对象代表的交易所的流通货币的行情、深度、下单价格等等所有价格信息,都会被乘以设置的汇率7,进行转换。
  • 例如exchange是以美元为计价货币的交易所,调用exchange.SetRate(7)后,机器人所有价格都会被乘7转换成接近CNY的价格。此时使用exchange.GetRate()获取的汇率值就是7。

exchange.GetUSDCNY()

exchange.GetUSDCNY(),返回美元最新汇率(yahoo提供的数据源)或OKEX期货合约使用的美元汇率,返回值:number类型。

注意:

  • 当交易所对象exchange非OKEX期货交易所对象时:返回的是yahoo提供的美元汇率。
  • 当交易所对象exchangeOKEX期货交易所对象时:返回的是OKEX交易所设定的美元汇率,可能和yahoo提供的数据,或者一些外汇数据上的美元汇率不一致。

切换行情模式

  • exchange.IO("websocket")

    切换行情通信协议到websocket(默认为rest),切换之后获取行情的方式会改变,exchange.GetTicker()exchange.GetDepth()将会切换为websocket协议来更新,由原来的主动获取行情数据变为被动获取行情数据,目前只支持火币交易所。

  • exchange.IO("mode", 0) 立即返回模式,如果当前还没有接收到交易所最新的行情数据推送,就立即返回旧的行情数据,如果有新的数据就返回新的数据。

  • exchange.IO("mode", 1) 缓存模式(默认模式),如果当前还没有收到交易所最新的行情数据(同上一次接口获取的数据比较),就等待接收然后再返回,如果调用该函数之前收到了最新的行情数据,就立即返回最新的数据。

  • exchange.IO("mode", 2) 强制更新模式,进入等待一直到接收到交易所下一次的最新推送数据后返回。

如果想第一时间获取最新的行情可以切换到websocket后不Sleep的立即检测数据,exchange.GetTicker(),exchange.GetDepth()用缓存模式进行工作,如: JavaScript范例:

exchange.IO("websocket");
while (true) {
  Log(exchange.GetTicker());
}

交易API

以下函数均可通过exchangeexchanges[0]对象调用,例如:exchange.Sell(100, 1);在交易所下一个价格为100,数量为1的买单。

exchange.Buy(Price, Amount)

exchange.Buy(Price, Amount),下买单,返回一个订单ID。参数值:price为订单价格,number类型,Amount为订单数量,number类型。返回值:string类型或数值类型(具体类型根据各个交易所返回类型而定)。

返回订单编号,可用于查询订单信息和取消订单。

JavaScript范例:

function main() {
    var id = exchange.Buy(100, 1);
    Log("id:", id);
}
  • 市价单

    注意:需要交易所的下单接口,支持市价单(下单类型为买单时,下单量参数为计价币为单位的金额),数字货币期货市价单方式下单,下单量参数单位为:合约张数。回测系统不支持期货市价单,实盘少数交易所不支持市价单接口。

    JavaScript范例:

    // 例如交易对:ETH_BTC ,市价单买入
    function main() {
        exchange.Buy(-1, 0.1)    // 下市价单买入,买入0.1个BTC(计价币)金额的ETH币。
    }
    
    • 市价单特殊情况的交易所说明: Binance(币安)交易所的市价单,下单量参数不是金额,是交易币(标的物币种)的币数。

exchange.Sell(Price, Amount)

exchange.Sell(Price, Amount),下卖单,返回一个订单ID。参数值:price为订单价格,number类型,Amount为订单数量,number类型。返回值:string类型或数值类型(具体类型根据各个交易所返回类型而定)。

返回订单编号,可用于查询订单信息和取消订单。

JavaScript范例:

function main(){
    var id = exchange.Sell(100, 1);
    Log("id:", id);
}
  • 市价单

    注意:需要交易所的下单接口,支持市价单。(下单类型为卖单时,下单量参数为卖出的操作币个数),数字货币期货市价单方式下单,下单量参数单位为:合约张数。回测系统不支持期货市价单,实盘少数交易所不支持市价单接口。

    JavaScript范例:

    // 例如交易对:ETH_BTC,市价单卖出
    function main() {
        exchange.Sell(-1, 0.2)   // 注意:下市价单卖出,卖出0.2个ETH。
    }
    

exchange.CancelOrder(Id)

exchange.CancelOrder(orderId),取消某个订单,参数值:orderid为订单编号,string类型或数值类型(具体类型根据各个交易所下单时返回类型而定),返回值:bool类型。

返回操作结果,true表示取消订单请求发送成功,false取消订单请求发送失败(只是发送请求成功,交易所是否取消订单最好调用exchange.GetOrders()查看)。 JavaScript范例:

function main(){
    var id = exchange.Sell(99999, 1);
    exchange.CancelOrder(id);
}

FMZ的API函数,可以产生日志输出的函数比如Log(...),exchange.Buy(Price, Amount),exchange.CancelOrder(Id)等都可以在必要参数后跟一些附带输出参数,比如:exchange.CancelOrder(orders[j].Id, orders[j])这样就是在取消orders[j]这个订单时,附带输出这个订单信息。

exchange.GetOrder(Id)

exchange.GetOrder(orderId),根据订单号获取订单详情,参数值:orderid为要获取的订单号,string类型或数值类型。(具体类型根据各个交易所返回类型而定)返回值:Order结构体。 (部分交易所不支持)

  • Order结构体
  • AvgPrice,成交均价(有些交易所不支持该字段,不支持则设置0)。

JavaScript范例:

function main(){
    var id = exchange.Sell(99999, 1);
    var order = exchange.GetOrder(id);            // 参数id为订单号码,需填入你想要查询的订单的号码
    Log("Id", order.Id, "Price:", order.Price, "Amount:", order.Amount, "DealAmount:",
        order.DealAmount, "Status:", order.Status, "Type:", order.Type);
}

exchange.GetOrders()

exchange.GetOrders(),获取所有未完成的订单。返回值:Order结构体数组。 order结构体可参考exchange.GetOrder()函数说明。

JavaScript范例:

function main(){
    exchange.Sell(99999, 1);
    exchange.Sell(88888, 1);
    var orders = exchange.GetOrders();
    Log("未完成订单一的信息,ID:", orders[0].Id, "Price:", orders[0].Price, "Amount:", orders[0].Amount,
        "DealAmount:", orders[0].DealAmount, "type:", orders[0].Type);
    Log("未完成订单二的信息,ID:", orders[1].Id, "Price:", orders[1].Price, "Amount:", orders[1].Amount,
        "DealAmount:", orders[1].DealAmount, "type:", orders[1].Type);
}

exchange.GetOrders()函数获取的是当前设置的交易对或者OKEX合约的未完成挂单信息。

JavaScript范例:

// 测试OKex合约交易,GetOrders获取的是否是所有未完成合约订单
function main(){
    // 下一个当周的买单,价格减去50保证不会成交,挂单
    exchange.SetContractType("this_week")
    exchange.SetDirection("buy")
    var ticker = exchange.GetTicker()
    Log(ticker)
    exchange.Buy(ticker.Last - 50, 1)

    // 下一个季度的卖单,价格加上50保证不会成交,挂单,并已经切换成了季度合约
    exchange.SetContractType("quarter")
    exchange.SetDirection("sell")
    ticker = exchange.GetTicker()
    Log(ticker)
    exchange.Sell(ticker.Last + 50, 1)

    // 获取未完成的订单
    Log("orders", exchange.GetOrders())
}

img 获取的未完成的订单信息:

[{"Id":17116430886,"Amount":1,"Price":808.4,"DealAmount":0,"AvgPrice":0,"Status":0,"Type":1,"ContractType":"quarter"}]

由此可见,exchange.GetOrders()获取的订单仅仅是当前设置合约的未完成的订单。

exchange.SetPrecision(…)

exchange.SetPrecision(PricePrecision, AmountPrecision),设置价格与品种下单量的小数位精度,设置后会自动截断,参数值:PricePrecision为number类型,用来控制价格后面的小数点位,AmountPrecision为number类型,用来控制数量后面的小数点位。PricePrecision和AmountPrecision都必须是整型number。

JavaScript范例:

function main(){
    exchange.SetPrecision(2, 3);     // 设置价格小数位精度为2位,品种下单量小数位精度为3位
}    

注意:

  • 回测不支持该函数,回测的数值精度会自动处理。

exchange.SetRate(Scale)

exchange.SetRate(Scale),设置交易所的流通货币的汇率,参数值:Scale为number类型。返回值:为number类型。

JavaScript范例:

function main(){
    exchange.SetRate();  // 如果不加参数,则恢复系统内置汇率
    exchange.SetRate(1); // 就是禁用汇率转换
}

注意:

  • 如果没有调用exchange.SetRate()设置过转换汇率,exchange.GetRate()默认返回的汇率值是1,即当前显示的计价货币没有发生过汇率转换。
  • 如果使用exchange.SetRate()设置过一个汇率值,例如7,那么当前exchange这个交易所对象代表的交易所的流通货币的行情、深度、下单价格等等所有价格信息,都会被乘以设置的汇率7,进行转换。
  • 例如exchange是以美元为计价货币的交易所,exchange.SetRate(7)后,机器人所有价格都会被乘7转换成接近CNY的价格。此时使用exchange.GetRate()获取的汇率值就是7。

exchange.IO(…)

exchange.IO("api", httpMethod, resource, params),调用交易所其它功能接口。参数值:httpMehod为string类型,填入请求类型"POST"或者"GET",resource为string类型,填入路径,params为string类型,填入交互参数。

使用此函数需要去交易所了解该交易所的API接口,用来扩展FMZ没有添加的功能(提交POST请求不必担心参数加密过程,FMZ在底层已经完成加密,只要填入相应参数即可)。 举个例子,比如FMZ平台目前不支持bitfinex交易所的保证金杠杆交易,我们可以通过IO函数来实现这一个功能,按照以下步骤。

  • 先找到bitfinex的API接口说明页面:bitfinex

  • 然后我们得知下单是以POST请求交互的,所以我们把参数httpMethod传入"POST"保证金交易的下单地址为:https://api.bitfinex.com/v1/order/new。因为FMZ已经在内部指定了根地址,所以我们只需要把参数resource的值传入"/v1/order/new"就行了。

  • 然后还剩params参数没有填入,params变量代表了所要交互的信息,我们把各种信息以"&"符号链接起来发送即可,我们先到bitfinex查看得知下一个买单或卖单需要5个参数,分别是:symbolamountpricesidetype。我们分别给这5个参数赋值,假如我们要买莱特币LTC,数量为1个,价格为10,为保证金交易模式,那么我们可以构造这么一个字符串:"symbol=ltc&amount=1&price=10&side=buy&type=limit"

  • 最后我们把以上结合通过一行代码即可交易:

    JavaScript范例:

    function main(){
        exchange.IO("api","POST","/v1/order/new","symbol=ltc&amount=1&price=10&side=buy&type=limit");
    }
    

    全部代码例子可到FMZ策略广场:bitfinex保证金交易查看。

  • 注意: 如果params即Http请求参数,需要传入JSON形式的字符串,需要用单引号(符号 ’ )写在参数值左右。 例如:bitfinex交易所。

    JavaScript范例:

    function main () {
        var message = "symbol=" + basecurrency + quotecurrency + "&amount='" + amount.toString() + "'&price=" + price.toString() + "&side=buy" + "&type=limit"
        var id = exchange.IO("api", "POST", "/v1/order/new", message)
    }
    
  • OKEX 范例:

    JavaScript范例:

    function main(){
        /*
            URL: /api/v1/future_position.do
            symbol        String 是  btc_usd   ltc_usd    eth_usd    etc_usd    bch_usd
            contract_type String 是  合约类型: this_week:当周   next_week:下周   quarter:季度
            api_key       String 是  用户申请的apiKey
            sign          String 是  请求参数的签名    
        */
        var ret = exchange.IO("api", "POST", "/api/v1/future_position.do", "symbol=eth_usd&contract_type=this_week")
        Log(ret)
    }
    

    返回数据:

    {
        "result": true,
        "holding": [{
            "buy_available": 0,
            "contract_id": 201876560020041,
            "sell_amount": 0,
            "sell_profit_real": 0.07166192,
            "buy_profit_real": -0.00003518,
            "contract_type": "this_week",
            "create_date": 1516881053000,
            "buy_price_avg": 1093.737,
            "lever_rate": 10,
            "sell_price_cost": 933.14087684,
            "buy_price_cost": 1093.737,
            "sell_price_avg": 933.14087684,
            "sell_available": 0,
            "symbol": "eth_usd",
            "buy_amount": 0
        }],
        "force_liqu_price": "0.000"
    }
    

IO 函数修改机器人的其它设置:

  • 切换当前交易所的交易对

    exchange.IO("currency", "ETH_BTC")

    这样就会通过代码切换机器人创建时配置的交易对。

    注意:

    • 1、如果在火币现货交易所对象切换了websocket协议模式,则不能使用exchange.IO("currency", "XXX_YYY")切换币种。
    • 2、exchange.IO("currency", "ETH_BTC")仅支持实盘,回测不支持。
  • IO函数切换交易所API基地址(REST协议,部分交易所不支持)

    例如:火币交易所的API基地址,资料来源:火币API文档 Pro站:国内服务器建议使用api.huobipro.com,其它服务器建议使用api.huobi.pro

    切换基地址为:api.huobi.pro

    JavaScript范例:

    function main () {
        exchanges[0].IO("base", "http://api.huobi.pro")        // exchanges[0]就是机器人创建时,第一个添加的交易所对象
    }
    

    切换基地址为:api.huobipro.com。 JavaScript范例:

    function main () {
        exchanges[0].IO("base", "http://api.huobipro.com")
    }
    
  • 切换为杠杠账户模式

    使用exchange.IO("trade_margin")切换为杠杠账户模式,下单、获取账户资产将访问交易所杠杆接口。 使用exchange.IO("trade_normal")切换回普通账户模式。

    支持的交易所列表

exchange.Log(…)

exchange.Log(LogType, Price, Amount),不下单, 只记录交易信息。

注意:

  • 此函数是exchange交易所对象的成员函数,区别于全局函数Log()
  • 参数值:LogType可为LOG_TYPE_BUYLOG_TYPE_SELLLOG_TYPE_CANCEL,price为价格,amount为数量,当LogTypeLOG_TYPE_CANCEL的时候price为订单ID。

使用exchange.Log(LogType, Price, Amount)可以进行实盘跟单测试,模拟下单,可以辅助记录下单。

JavaScript范例:

function main() {
    exchange.Log(LOG_TYPE_BUY, 999, 0.1)      // 下单类型买入,价格999,数量 0.1
    exchange.Log(LOG_TYPE_CANCEL, id)         // 取消订单
}

exchange.HMAC(…)

exchange.HMAC(Algo, OutputAlgo, Data, Key),支持md5/sha256/sha512/sha1HMAC加密计算,只支持实盘。 exchange.HMAC("sha256", "hex", "xxxxx", "{{secretkey}}") 引用accessKey,使用"{{accesskey}}"。 引用secretKey,使用"{{secretkey}}",也可以使用明文"abc-123-xxxx"(举例)。 "{{accessKey}}"、"{{secretkey}}"方式仅在该函数使用时有效。 OutputAlgo支持:“hex”,“base64”。 具体例子

Bitmex仓位变化推送微信(wss协议,需要bitmex api ID) JavaScript策略:

function main() {
    var APIKEY = "your Access Key(Bitmex API ID)"
    var expires = parseInt(Date.now() / 1000) + 10
    var signature = exchange.HMAC("sha256", "hex", "GET/realtime" + expires, "{{secretkey}}")
    var client = Dial("wss://www.bitmex.com/realtime", 60)
    var auth = JSON.stringify({args: [APIKEY, expires, signature], op: "authKeyExpires"})
    var pos = 0
    client.write(auth)
    client.write('{"op": "subscribe", "args": "position"}')
    while (true) {
        bitmexData = client.read()
        if(bitmexData.table == 'position' && pos != parseInt(bitmexData.data[0].currentQty)){
            Log('position change', pos, parseInt(bitmexData.data[0].currentQty), '@')
            pos = parseInt(bitmexData.data[0].currentQty)
        }
    }
}

exchange.Go(…)

exchange.Go(Method, Args…),多线程异步支持函数,可以把所有支持的函数的操作变成异步并发的.(只支持数字货币交易平台)。参数值:Method为string类型,函数名。

注意:

  • 该函数只在实盘运行时创建多线程执行任务,回测不支持多线程并发执行任务(回测可用,但是还是顺序执行)。
  • Go函数返回对象后,通过该对象调用其wait函数获取线程返回数据时,必须wait获取完成后,该线程才会自动释放。
  • 简单表述就是,申请的线程 无论执行成功或者失败,必须由wait函数获取到结果,并由托管者自动释放通过Go函数申请的线程资源。
  • 如果最终wait函数的返回结果没有被获取,线程资源不会自动释放,会导致申请的线程累积,超过2000个会报错:“too many routine wait, max is 2000”。

支持的函数:GetTicker,GetDepth,GetTrades,GetRecords,GetAccount,GetOrders,GetOrder,CancelOrder,Buy,Sell,GetPosition

JavaScript范例:

function main(){
    var a = exchange.Go("GetTicker"); // GetTicker 异步多线程执行 
    var b = exchange.Go("GetDepth"); 
    var c = exchange.Go("Buy", 1000, 0.1); 
    var d = exchange.Go("GetRecords", PERIOD_H1);
                                      // 上面四种操作是并发多线程异步执行, 不会耗时, 立即返回的
    var ticker = a.wait();            // 调用wait方法等待返回异步获取ticker结果 
    var depth = b.wait();             // 返回深度, 如果获取失败也是有可能返回null的 
    var orderId = c.wait(1000);       // 返回订单号, 限定1秒超时, 超时返回undefined, 此对像可以继续调用wait等待如果上次wait超时 
}

注意:

  • 判断undefiend要用typeof(xx) === "undefined", 因为null == undefined在JavaScript里是成立的。
function main() {
    var d = exchange.Go("GetRecords", PERIOD_H1);
    var records = d.wait();   // 等待K线结果
    var ret = d.wait();       // 这里wait了一个已经wait过且结束的异步操作,会返回null,并记录出错信息
}

Python与JavaScript的区别,Python的wait返回两个参数,第一个是异步的api返回的结果,第二个表示是异步调用是否完成。

Python范例:

def main():
    d = exchange.Go("GetRecords", PERIOD_D1)
    ret, ok = d.wait()          # ok是一定返回True的, 除非策略被停止
    ret, ok = d.wait(100)       # ok返回False, 如果等待超时, 或者wait了一个已经结束的实例

账户信息

exchange.GetAccount()

exchange.GetAccount(),将返回交易所账户信息。返回值:Account结构结构体。

JavaScript范例:

function main(){
    var account = exchange.GetAccount();
    Log("账户信息,Balance:", account.Balance, "FrozenBalance:", account.FrozenBalance, "Stocks:",
        account.Stocks, "FrozenStocks:", account.FrozenStocks);
}

exchange.GetName()

exchange.GetName(),返回交易所名称。返回值:string类型。

命令行版本的托管者,可以使用-v命令打印交易所名称列表。

exchange.GetLabel()

exchange.GetLabel(),返回交易所自定义的标签。返回值:string类型。

exchange.GetCurrency()

exchange.GetCurrency(),返回交易所操作的货币对名称如LTC_BTC,传统期货CTP返回的固定为STOCK。返回值:string类型。

exchange.GetQuoteCurrency()

exchange.GetQuoteCurrency()。返回交易所操作的基础货币名称,例如BTC_CNY就返回CNY,ETH_BTC就返回BTC。返回值:string类型。

期货交易

期货支持传统商品期货CTP协议,易盛接口。支持数字货币期货交易所例如:OKEX,BitMEX等。

exchange.GetPosition()

exchange.GetPosition(),获取当前持仓信息,可以传入一个参数,指定要获取的合约类型。返回值:position结构体数组。

JavaScript范例:

// 注意:GetPosition函数获取的是所有持仓品种的持仓信息,如果没有持仓返回空数组,所以引用前要先判断
// 交易所设置为OKEX期货时,如果合约设置为交割合约,获取的是当周、次周、季度持仓数据,数据类型为position数据类型的数组
// 交易所设置为OKEX期货时,如果合约设置为永续合约,获取的是包含永续合约持仓数据的position数据类型的数组
function main(){
    exchange.SetContractType("this_week");
    exchange.SetMarginLevel(10);
    exchange.SetDirection("buy");
    exchange.Buy(10000, 2);
    position = exchange.GetPosition();
    if(position.length>0){
        Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
            position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,
            "ContractType:", position[0].ContractType);
    }
}

exchange.SetMarginLevel(…)

exchange.SetMarginLevel(MarginLevel),设置杆杠大小。参数值:number整型。 设置数字货币期货下单的杆杠大小,例如:

JavaScript范例:

function main() {
    exchange.SetMarginLevel(10)
}

注意:

  • 只支持数字货币期货。
  • 回测支持切换杠杆。

exchange.SetDirection(…)

exchange.SetDirection(Direction),设置Buy或者Sell下单类型。参数值:string类型。 SetDirection函数设置期货交易方向和下单函数之间的对应关系。

下单函数 SetDirection函数的参数设置的方向 备注
exchange.Buy “buy” 买入开多仓
exchange.Buy “closesell” 买入平空仓
exchange.Sell “sell” 卖出开空仓
exchange.Sell “closebuy” 卖出平多仓

Direction可以取buyclosebuysellclosesell四个参数,传统期货多出closebuy_today,与closesell_today,指平今仓,默认为closebuy/closesell为平昨仓。对于CTP传统期货,可以设置第二个参数”1”或者”2”或者”3”,分别指”投机”,“套利”,“套保”,不设置默认为投机。

JavaScript范例:

function main(){
    exchange.SetContractType("this_week")    // 举例设置为OKEX期货当周合约
    exchange.SetMarginLevel(5);              // 设置杠杆为5倍
    exchange.SetDirection("buy");            // 设置下单类型为做多
    exchange.Buy(1000, 2);                   // 以1000的价格,合约数量为2张下单
    exchange.SetMarginLevel(5);
    exchange.SetDirection("closebuy"); 
    exchange.Sell(1000, 2);
}

exchange.SetContractType(…)

exchange.SetContractType(ContractType),设置合约类型。参数值:string类型。 传统的CTP期货的ContractType就是指的合约ID,如SetContractType("au1506")。返回合约的详细信息,如最少一次买多少,手续费,交割时间等,主力连续合约为代码为888,如MA888,连续指数合约为000MA000888000为虚拟合约交易只支持回测,实盘只支持获取行情。

订阅虚拟合约成功以后,返回的字段


More

sajshuai 新手刚接触FMZ,模拟时_C(exchange.GetRecords, PERIOD_H1)只能返回前101个数据,PERIOD_D1只返回了11条数据,不能用于完整的计算整个指标。想问下有什么办法可以完整的获取全部数据么?或者根据指定日期来获取

haiwwhai _C(function, args...) 这个默认是3s吗? 修改默认直接放_CDelay(1000) 在_C(function, args...) 之前就可以了吗?设定一次就可以了吧?

lanchaiye 集群: 如果你创建1000个机器人并发,也是没有压力的, 可以创建多个托管者来分散任务 有代码例子来建集群?如何建多个托管者来分散任务

黑马王子 Record和Ticker 很多内容很相似,到底有什么不同,用在什么场合为好了?

wangyj1 Log(talib.help('MACD'));只能在js下使用,python下没有talib.help属性...

cjz140 _C(function, args…) 和Sleep 函数有什么区别呢,我觉得都是等待重试的意思

3263243y SetErrorFilter 后怎么清空 ErrorFilter?不过滤错误信息。

qq47898077 如果想用第三方库有什么办法吗?

qq47898077 如果想继承交易所对象定义新的类的话,父类应该填什么呢。

wyx API文档好难看 有没有模板代码 就一个main

ethanwu 有本地调试工具吗?

pengliheng 那exange.IO("status")呢?

pengliheng 为什么sell的函数是灰色的,是不是代表函数不可用了?by是可用的,那要如何卖呢

pengliheng 为什么sell的函数是灰色的,是不是代表函数不可用了?by是可用的,那要如何卖呢

pengliheng js没白学,哈哈哈,就想问问es6支持么

pengliheng js没白学,哈哈哈,就想问问es6支持么

Don. Volume的均线要怎么写出来?

zjuturtle 按市价购买exchange.Buy(1000)如果不成功会返回什么?

langpanf 怎么这么难

langpanf 怎么这么难

宁公子 这个新字体好看~

hippo Bitmex的测试网络(testnet.bitmex.com)同样存在API接口,但目前交易所只能选Bitmex主站,API文档地址是 https://testnet.bitmex.com/app/apiOverview 请问如何支持?

cxjijin var ret1 = exchanges[0].IO("api", "future_estimated_price", "symbol=btc_usd"); Log('ok期货预估交割价格', ret1); https://dn-filebox.qbox.me/d1ed268c1e75753c5d289447d279aa9d81e41b5f.png 调用其他交易所功能接口,这么写报错,是为什么呢?

allenfrostline 想问realTicker和Ticker有什么区别?最近在重写套利的策略,同时出现了这两个但前者API里似乎没有提到

visions 你好 作为一个python开发者 觉得你们的api文档写的是什么东西?一些字段函数接口看得莫名其妙的,能不能像githubpage和readdocs这样写一份文档?

allenfrostline GetAccount: [EAPI:Rate limit exceeded] 想问这个怎么解决?另外我没有qq有没有微信群之类的?感谢

tino BITMEX not supported ? i mean future exchange, thanks for reply

tino BITMEX not supported ?

piccolo247 I can't setup the bot to trade on cryptocurren ies. Can anyone help me do that? Mirror trading will be a useful step. Is anybody willing to be my mentor? Or help me manage my account?

yermin 托管者为啥不支持32位 Linux

wangxindiy // 策略采用轮询而非事件驱动是因为作者喜欢对代码100%的掌控力. 好吧。这句话实在不理解。。。。。就是评论一下

zhjx2314 不支持StochRSI,是否可以尽快添加

__fy [ ORDER_STATE_PENDING :未完成 ORDER_STATE_CLOSED :已关闭 ORDER_STATE_CANCELED :已取消 ] OKCOIN-status: -1:已撤销 0:未成交 1:部分成交 2:完全成交 4:撤单处理中 HUOBI-status: 0未成交 1部分成交 2已完成 3已取消 4废弃(该状态已不再使用) 5异常 6部分成交已取消 7队列中 这三种状态是如何对应的?

yhfgg python策略实盘的时候脚本是在自己的阿里云服务器还是botvs集群?

yhfgg python用的什么版本?

fkysly GetFee 的 解释应该是”返回一个Fee结构”吧,少了一个构字。

zkwap 使用js能调用talib的方法吗

yhfgg 求python文档

simtech2win Python量化策略回测研发 来到这里,震撼!

bitsbetter 新手上路,请多关照。

wmjbs123 策略编辑的代码背景能不能搞个黑色的?白色的刺眼,晚上写代码,容易近视

Don. 机器人微信推送中的概要 该怎么设置??

数·狂 订单(Order)结构里能不能加一个成交均价的字段?

小丁丁 GetOrders:获取所有未完成的订单, 返回一个Order数组结构, 在中国比特币交易ETH ,只返回最近的10条 ,这里有返回中国比特币ETH所有未完成的订单的函数吗,表示其它平台都可以用GetOrders返回所有的 ,只有这个鬼中国比特币返回10条,

yhfgg 需要用到统计概率论的数学函数,从哪里用呢?

Gavin 请问群号多少?

jiebang $.Cross(x, y)这个函数的返回值是啥意思?

qdk0901 $.Cross(x, y)这个函数是什么鬼,api文档里怎么不说明啊

我的昵称 这个 LogReset 清空所有日志, 可以带一个数字参数, 指定保留的条数 这个要怎么删除最新的几条日志?

edwardgyw talib 中CORRE函数好像没有移植过来 是漏掉了么?

逐浪蚊子 上穿,下穿,相交 这些函数没有找到。

穷山僻壤 貌似没有指标引用的功能!有吗

小小 读取的k线时间怎么翻译成现在时间啊,看不懂,太长的一个,解决了,谢谢

小小 数组中的数删除怎么写,我用records.remove(records[0])好像不行啊

snakeayu 平常获取的是小时K线,如何调用日K线的ATR?

snakeayu 平常获取的是小时K线,如何调用日K线的ATR?

57278863 学习一下传统期货怎么获得价格和下单,不好意思,根基很薄

kirin 同求传统期货交易例子!

小小 zero,能写个关于传统期货交易的例子吗

小小 多空单子同时持有的时候,如何打印持仓状态,我的怎么打印的是[object object][object object],怎么获得多单和空单持仓状况啊,还有GetTicker(),当周,次周,和季度怎么都得到当周 价格,括号中的当周,次周和季度我都写了。

cxjijin 期货交易所可以用GetTicker()获取行情吗?, 返回的是那种类型的合约行情(当周、次周..)?

卖大 StochRSI 这个什么指标,能添加吗?

momox CancelOrder(orderId) 根据订单号取消一个订单, 返回true或者false ,请问 true=单子被成功取消,对吧?

momox _G(K, V) 可保存的全局字典表 这个方法保存的全局变量,可以用于不同策略之间的数据共享吗?

flufy3d 冲冲人气

Zero 可以用LogProfitReset重置下收益日志. 之前的收益图表上的历史就没有了.

xcy 能不能直接复制EA过来用

sjironman 感觉这个平台棒棒哒,多在群里交流哈

小小 这是什么语言,有学习资料吗

murphy 请问, 你说的支持异步的这些操作是什么意思?这样难道不会造成自成交吗?

jamesbd PF,PF

jxhbtc Data error 一个星期 一直连接不了机器人 怎么解决

dyhhu 指标库TA,只是对收盘价进行计算吗?

btcrobot hi, world

小小梦 持续 获取 K线数据, 累积足够的数据量开始计算指标。策略广场有些 指标策略 里面有范例,可以看下

小小梦 python 的 talib 库 需要 安装一下。https://www.botvs.com/bbs-topic/669 可以参看 这个 帖子。

小小梦 Sleep 是 程序什么也不做,等待 参数设定的 毫秒数, _C 是重新调用一次 参数 传入的 函数。

小小梦 不用继承, JS 直接 封装在对象就行了 {name : "新对象", old_exchange : exchange[0], ...... }

小小梦 有本地 编辑器 远程同步插件,基本算是 本地编辑 远程调试。

小小梦 有的,在策略广场有 策略框架 模板, 也有策略基本结构范例,可以找下。另外论坛里面 好几个 策略的注释版 。

小小梦 可以来 QQ群,^^ 方便讨论~

小小梦 API文档上 灰色的意思是 这个 函数 没有过多的展开解释,就显示灰色,蓝色的代表 有更多的解释,仅此而已。

小小梦 ES6暂时不支持, ^^

小小梦 可以 到群里QQ 我,问题描述一下,我来解答 ^^

小小梦 直接会返回 一个错误 ,并且 不会下单(其实就是 要买,钱不够!)。

zjuturtle 比如OKCoin,如果购买的量超过了持有的人民币,会返回什么?

小小梦 具体是 哪个交易所呢,我在OK期货会返回一个订单号。

小小梦 您好 请问 有什么问题, 初学BotVS 可以看下 置顶的教程附带有视频讲解。

Zero 已经支持运行时切换交易对, 需下载最新托管者. 支持Bter/Poloniex 详情 API文档 交易函数栏下面的描述(清空浏览器缓存后刷新如果看不到)

小小梦 QQ我吧,我帮您找下问题。359706687

职业养鸡户 需要设置白名单, 我设置的是托管机子的IP?

小小梦 这个是 底层链接 没有建立 服务器没响应。API KEY 申请的时候 有要设置 IP地址么?

职业养鸡户 这就尴尬了···我ok可以跑的策略换到比特时代就失灵了,GetAccount 都获取不到 GetAccount: Post http://api.btc38.com/v1/getMyBalance.php: read tcp 192.168.0.227:58596->211.149.148.144:80: wsarecv: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 2017-05-23 21:08:24 比特时代 错误 GetAccount: timeout 2017-05-23 21:08:02 比特时代 错误 GetAccount: timeout 2017-05-23 21:07:40 比特时代 错误 GetAccount: timeout 2017-05-23 21:07:20 重启 是不是 IP白名单的问题???

小小梦 交易所的 服务器 没有响应了,TCP协议 三次握手都没有建立。

职业养鸡户 不知道为什么策略用到比特时代的话会一直报这个错 A connection attempt failed because the connected party did not properly respond after a period of time,

小小梦 您好! 说的是 exchange.IO(“api”, ApiName, Args) 这个函数 不支持, 参见 https://www.botvs.com/bbs-topic/812

职业养鸡户 A connection attempt failed because the connected party did not properly respond after a period of time,

职业养鸡户 比特时代不支持吗

小小梦 https://dn-filebox.qbox.me/a709b30c6cc0a3565234b9e0c99b073f7ba8b454.png 应该是可以的。

宁公子 比如我想做个poloniex 的全币种交易,但是BOTvs 支持的币种只有几个,exchange.IO貌似是不支持P网的。

小小梦 可以调用 exchange.IO 这个。

宁公子 需要验证账户的 API 的呢?

小小梦 如果不需要验证账户的 API 可以使用 httpQuery (详见 BotVS 文档), 实际交易 API 需要接入。

小小梦 可以使用 HttpQuery 这个 API 参数传:https://www.okcoin.com/api/v1/future_estimated_price.do?symbol=btc_usd ,这样就可以了。 对于 不用验证 账户的 行情类的 交易所 API 直接就用 平台上的 HttpQuery 这个函数, 那些 跟账户相关的 才用 IO 这个API (IO 不支持这些 不需要验证的行情API )。 帖子 : https://www.botvs.com/bbs-topic/850

visions 好的谢谢,期望能有完善优美的API文档。

小小梦 请问 realTicker 这个API 是在什么地方看到的?

小小梦 https://dn-filebox.qbox.me/fe1a6f5563ed43a5357f858ecf8a50239619228e.png API文档 是JavaScript 语言 描述的,python 版描述的在 “交流社区” 页面置顶的帖子。(如有具体问题欢迎留言提出)

Zero 你好, 多谢建议, 目前API文档正在重构中.

小小梦 您好~显示的是 访问频率超出限制。 https://dn-filebox.qbox.me/a09498920d04cac62624b7438a058d2098d8fb00.png 策略中使用Sleep(1000) 函数了么 ? , 这个1000就是 让程序每轮暂停一秒,可以自行设置,目的就是控制程序 访问API 的频率,因为有些交易所设置了最大访问限制,一定时间超过一定访问次数会拒绝访问,封掉IP地址。

小小梦 Excuse me, We are planning to support BITMEX .

小小 you can qq call 小小梦,add his qq 1521288475,then he let zero add this exchange

小小梦 Welcome to BotVS ,This video is what you need . address is : http://v.youku.com/v_show/id_XMjUxMTc5Nzc5Ng==.html?f=29474416&from=y1.7-3&spm=a2hzp.8253876.0.0 if you need help , you can call me on QQ, my number is 1521288475 。

小小梦 可能 这个版本的性能 不如 64 的。

小小梦 https://dn-filebox.qbox.me/c29ab7fc279e1b758355f137907cf52dc8257df6.png 我个人写的 已经对比过OK 的STOCHRSI指标 ,一致 ,就是速度有些慢有待优化,暂时可用。https://www.botvs.com/bbs-topic/392

小小梦 火币: ORDER_STATE_PENDING: 挂单没有完全成交,或者 没有成交。 对应0、1 、7 ORDER_STATE_CLOSED: 完全成交, 对应 2 ORDER_STATE_CANCELED: 3、6

Zero 可以自己选择是在botvs提供的服务器上回测还是自己的托管者所在服务器回测, 版本是2.7.5

小小梦 现已添加。

小小梦 现在已经可以自己配置 背景风格了。

小小梦 python 文档正在写。

小小梦 可以的 talib 库支持。

hzzgood48 https://www.botvs.com/bbs-topic/276

小小梦 貌似在策略广场有例子,https://www.botvs.com/strategy/15098

Zero 访问Order的AvgPrice属性, 交易所支持可以, 不支持的交易所会一直为0这个属性

yhfgg 第三方库怎么引用?

Zero mathjs看能满足不能, 不能就只能找第三方库复制进策略了. 为了编译速度, 系统只内置了一些少量的库.

小小梦 309368835 官方QQ群

小小梦 不客气,有问题在群里可以M我~我基本都在线。

jiebang 谢谢

小小梦 在群里么?你可以看看注释版的 数字货币交易类库代码分析 里面就有 $.Cross函数的注释

jiebang Cross(x, y)这个函数的返回值是啥意思?

小小梦 这个函数 不是平台的API, 是群主写的一个模板的导出函数。

Zero 不能删除最新的,只能保留最新的几条..删除之前所有老的.

逐浪蚊子 上穿用这种是不对的,我们需要的是一个点。如果用他会无休止的循环加仓。

wsnrag 这个要自己写的,比如MA(RECORDS,5)>MA(RECORDS,15)就是上穿

kirin 要用position[i]获取每个持仓,position是个数组

宁公子 exchange.GetRecords(PERIOD_D1);

kirin 我的传统期货老是报“GetAccount: not login",密码没有输错,就是登陆不了

Zero 默认是周, 要获取指定的需要SetContractType先.

Zero 刚看到,这个true是交易所返回的取消订单这个动作的返回值, 但真正取消没取消,得看交易所内部怎么处理了.

momox 3q

Zero 暂时不能, 是隔离的.

xuanxuan 当然不能,那是MT4的专用吧

Zero 策略广场里有很多开源的可以看

Zero Javascript 资料网上到处都有哈

卖大 你的问题解决了吗?

卖大 有教程吗,我是新手,初学策略编写,困难重重,希望指教。

Zero 大部分是, 传入的数据可以直接是records或者是一个纯价格的数组