Type/to search
8
Follow
1376
Followers
2.1 API를 사용하여 계정 정보, 시장 데이터, K-line 데이터 및 시장 심도 정보를 얻습니다.
Tutorials
Created 2016-11-05 16:41:04  Updated 2019-08-01 09:31:23
 39
 11341

2.1 API를 사용하여 계정 정보, 시장 데이터, K-line 데이터 및 시장 심도 정보를 얻습니다.

이제 제2장입니다. 제1장부터는 발명가들이 정량화한 기능에 대해 조금 알고 있어야 합니다. 이제 코드를 쓰기 시작하세요!


  • API를 사용하여 계정 정보를 얻습니다.

    첫 번째 장의 투어를 통해 관리자, 거래소를 추가했다고 가정하면, 물론 우리는 발명자의 양적 시뮬레이션 디스크를 사용하여 코드 테스트를 할 수 있습니다.

    먼저, 우리는 전략을 만들어야 합니다. 테스트 1이라고 하죠.
    img

    정책 편집 인터페이스
    img
    img

    코드는 다음과 같습니다.

function main() { Log(exchange.GetAccount()); // 看过API 文档后知道, exchange就是交易所对象,实际上策略有个全局变量 // exchanges 数组,这个数组存放的就是你创建机器人或者回测时添加的交易所(可以是多个) // 添加1个交易所 exchanges 数组就只包含1个交易所对象,即添加的交易所对象。 // 那么 exchange 和 exchanges 是什么关系呢? 其实 exchange 就是 exchanges[0] , // exchange 就是 exchanges 数组的第一个元素(这里这个元素是交易所对象)。 // Log()函数应该也不陌生吧,这个API 就是输出一条日志,日志内容就是Log括号里面的参数。 }

로봇을 만들거나 테스트 1로 묶는 전략은 <unk> 테스트 1이라고 불리는데, 발명자가 <unk> 시뮬레이션 디스크를 사용해서 테스트해 보도록 한다.
img
img

이 전략은 즉시 실행되었고, 계정 정보가 표시되었습니다.
img

그리고는, 우리는 모의 디스크의 계정 정보와 비교합니다.
img

  • 시장 데이터를 얻으세요

function main() { Log(exchange.GetAccount()); // 已经知道怎么获取 主交易所 账户信息了 //下面我们来试试 不停的获取行情数据。 while(true){ // 这里用一个无限循环的结构来不停的获取 交易所行情数据。 Log("行情数据:", exchange.GetTicker()); // 哇! Log() 函数的括号里面可以写2个参数,第一个参数是: "行情数据:" // 第二个参数是 exchange.GetTicker() 这个函数的返回值。就是主交易所的行情数据。 // 注意 Log() 函数的参数要用 逗号分隔。 Sleep(1000); // 咦~ 这个又是什么? 答:机器人程序 执行循环也需要休息!它可是执行很快的哦!(一秒N次) // Sleep 函数的作用就是让程序暂停一会儿,括号里面的参数 1000 是 毫秒数, 1秒 = 1000毫秒。Sleep(1000);就是暂停1000毫秒。 // 不要小看这个参数,这个参数控制了程序的轮询频率,间接影响访问 交易所API 的频率,有些交易所API访问过于频繁可是会拒绝访问的。 } }

img
**참고:**아마도 학계 동료들은 GetTicker 함수가 얻는 데이터 최고 가격과 최저 가격의 차이가 많다는 것을 알게 될 것입니다. 이것은 GetTicker가 반환하는 시장 상황 데이터의 High, Low가 거래소가 합의한 주기 내의 최고, 최저 가격이라는 것을 말해줍니다. 거래소가 설정하는 것을 의미합니다. 위의 테스트는 발명가 계량화 모의 디스크, 발명가 계량화 모모 디스크는 모의 디스크가 작동하기 시작한 순간까지의 최고 가격, 최저 가격입니다.

  • K선 데이터를 가져오기

    API 문서의 설명을 살펴보자:

GetRecords(Period) 返回一个K线历史, K线周期在创建机器人时指定, Record数组结构 不加参数, 默认返回添加机器人时时指量的K线周期, 但也可以自定义K线周期 支持: PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟, PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天

K-라인 데이터의 기본 주기 (~5분) 를 얻기 위해 테스트 코드를 작성해 봅시다.

function main() { Log(exchange.GetAccount()); // 已经知道怎么获取 主交易所 账户信息了 //下面我们来试试 不停的获取行情数据。 var records = exchanges[0].GetRecords(); // 按照默认周期获取K线数据 Log("records:", records); // 在日志中输出 获取到的K线数据。 }

출력 표시:
records:
[{"Time":1478260200000,"Open":4765.14,"High":4773,"Low":4764.54,"Close":4769.47,"Volume":5211.539999999999},
{"Time":1478260500000,"Open":4769.47,"High":4773.01,"Low":4764,"Close":4764.78,"Volume":3742.250000000002},
{"Time":1478260800000,"Open":4764.78,"High":4782,"Low":4764,"Close":4781.28,"Volume":7929.090000000004},
{"Time":1478261100000,"Open":4781.28,"High":4795,"Low":4774,"Close":4792.02,"Volume":11793.540000000006},
{"Time":1478261400000,"Open":4792.02,"High":4792.96,"Low":4781,"Close":4786.78,"Volume":9204.90000000001},
{"Time":1478261700000,"Open":4786.51,"High":4788.66,"Low":4775,"Close":4775.31,"Volume":7722.3399999999965}]

변수 레코드는 K줄 시간 순서대로 멀리 (인덱스 0) 부터 가까이 (인덱스 records.length - 1) 까지 순서대로 배열된 구조적 배열이다.
K선 (K line) 을 알아보자: ((어떤 도표는 빨간색이 태양선을, 녹색이 음선을, 어떤 것은 반대의 색을 나타낸다。)
img
5분 주기 K선 예제 그래프를 보세요.
img
**알아채다:**한 K 선주기가 완료된 후에야 그 값이 결정된다. 실제 응용에서는 var records = exchanges를 호출한다.[0].GetRecords(); 반환된 데이터 레코드들의 마지막 요소, 즉: records[records.length - 1] , 그 주기가 완료되기 전까지 끊임없이 변화한다. 심지어 마지막 초에, 선선에서 음선으로 변화할 수도 있다.

GetRecords 함수는 추가 매개 변수가 없는 상태에서 정책 설정에 따라 기본 주기적으로 데이터를 반환한다. K 선의 주기들을 지정하기 위해 매개 변수를 입력할 수도 있다. 현재 회수 시스템은 GetRecords 전송 매개 변수를 사용하여 주기들을 지정할 수 있도록 지원하고 있다.

  • 시장에 대한 깊이 있는 정보를 얻으십시오.

    GetDepth는 Depth 구조를 반환합니다.

function main() { var depth = exchanges[0].GetDepth(); //获取市场深度信息, 返回订单薄信息,一个对象包含2个属性,每个属性是一个对象数组。 Log("depth:", depth); // 日志中输出,一下的输出是 整理过的格式,是方便读者理解,实际上是所有内容都在一行显示的。 }

위 코드의 추론은 다음과 같습니다:

depth: {"Asks":[{"Price":4726.07,"Amount":15}, // 卖单数组,回测时,数据都是模拟出来的,所以Amount 都是 15,索引为0的是卖一,依次类推。 {"Price":4726.08,"Amount":15}, {"Price":4726.09,"Amount":15}, {"Price":4726.1,"Amount":15}, {"Price":4726.11,"Amount":15}, {"Price":4726.12,"Amount":15}, {"Price":4726.13,"Amount":15}, {"Price":4726.14,"Amount":15}, {"Price":4726.15,"Amount":15}, {"Price":4726.16,"Amount":15}, {"Price":4726.17,"Amount":15}], "Bids":[{"Price":4726.05,"Amount":15}, // 买单数组,索引为0的是买一, 向后依次类推。 {"Price":4726.04,"Amount":15}, {"Price":4726.03,"Amount":15}, {"Price":4726.02,"Amount":15}, {"Price":4726.01,"Amount":15}, {"Price":4726,"Amount":15}, {"Price":4725.99,"Amount":15}, {"Price":4725.98,"Amount":15}, {"Price":4725.97,"Amount":15}, {"Price":4725.96,"Amount":15}, {"Price":4725.95,"Amount":15}] }

해당 주문이 얇은 것은 다음과 같습니다 ((여기 OKCoin의 실제 데이터가 있습니다)). 실제 프로세스의 시장 깊이 정보는 ((요청이 얇습니다.)

img

시장에 대한 깊이 있는 정보 (추가 자료) 가 있으면 어떻게 될까요? 추가 자료는 많은 용도로 쓰일 수 있습니다. 예를 들어, 식료품 (물론 수고도 있습니다.)

function main() { var depth = exchanges[0].GetDepth(); // 获取市场深度 Log("depth:", depth); // 日志输出显示 Log(exchanges[0].GetAccount()); // 输出 吃单前的 账户信息 var buyPrice = depth.Asks[0].Price; // 设置吃卖单的价格,即卖一, // 有时为确保吃单成功,这样处理:var buyPrice = depth.Asks[0].Price + slidePrice; var buyAmount = depth.Asks[0].Amount; // 吃卖单的量 exchanges[0].Buy(buyPrice, buyAmount); // 执行买入操作, 吃掉卖一 这个单子 Log(exchanges[0].GetAccount()); // 显示买入后的 账户信息,对比初始账户信息。可以对比出 买入操作的成交的数量。 }

발명자의 양적 모의 디스크 실행 결과:
img

Related Recommendations
Comment
All comments (33)

    补充一下问题的发现之二,我选择美国公用托管者后,机器人列表里面没有了那个警示符号,但是运行后,已然是日志里面没人输出任何信息,提示没有日志信息

    8 years ago

    这个可能要具体看下 策略 是什么样的执行逻辑,也可能 策略正常运行 , 只是 没有触发任何操作。

    8 years ago

    谢谢这么多的回复,我按照提示,再试一试

    8 years ago

    好的 如果还有问题 可以加QQ 官方群 @管理员

    8 years ago

    补充一下问题的发现:在机器人列表里面,状态是“红上三角号里有个感叹号”,好像是异常提示。

    8 years ago

    有红色叹号 是机器人运行 报错,需要检查下机器人日志,或者 托管者 日志 信息。

    8 years ago

    小小梦,你好,我在用平台模拟测试的,第一步测试账户信息,没有日志输出,提示错误,不知道问题出在哪里?(在策略栏中编写回测没有问题,但是放到机器人里面就不行 了,请指教,谢谢)
    机器人测试代码:
    function main() {
    Log(exchange.GetAccount());
    Log("test");
    }
    结果:
    测试1
    策略: 测试1 (最后更新 2018-09-13 14:25:33)
    日期: 创建于 2018-09-13 14:07:57 最近开始于 2018-09-13 14:40:24 停止于 2018-09-13 14:40:25
    状态: K线周期 1分钟 有错误 托管于 中国 : 42.236.82.38 - linux/amd64 (公用), ID: 118025
    交易平台: BotVS/BTC_USD

    8 years ago

    您用 自己的私有托管者 试下。

    8 years ago

    小小梦,你好,我在用平台模拟测试的,第一步测试账户信息,没有日志输出,提示错误,不知道问题出在哪里?(在策略栏中编写回测没有问题,但是放到机器人里面就不行 了,请指教,谢谢)
    机器人测试代码:
    function main() {
    Log(exchange.GetAccount());
    Log("test");
    }
    结果:
    测试1
    策略: 测试1 (最后更新 2018-09-13 14:25:33)
    日期: 创建于 2018-09-13 14:07:57 最近开始于 2018-09-13 14:40:24 停止于 2018-09-13 14:40:25
    状态: K线周期 1分钟 有错误 托管于 中国 : 42.236.82.38 - linux/amd64 (公用), ID: 118025
    交易平台: BotVS/BTC_USD

    8 years ago

    不知道是不是 公共托管者的问题,您可以用私有托管者 测试下 ,私有托管者应该是 可以的, 您在自己电脑上部署一个 就行。

    8 years ago

    模拟的时候调用 exchange.GetTicker(),经常会出现 GetTicker: timeout,请问是为什么?

    8 years ago

    最近网络问题,另外 在 模拟盘 行情没有更新的时候 是 超时的,可以 使用 exchange.IO("mode") 调整 行情获取 模式。

    8 years ago

    你好,实盘仿真的数据用的是那个交易所的实盘数据?

    8 years ago

    实盘仿真 是一个 24小时运行的 仿真模拟盘, 是跟随几个 主流交易所 的行情 走的,所有 使用 模拟盘的用户都是 这个仿真盘的参与者,行情不会和 参考的交易所 完全一致,但是大概走势是一致的。

    8 years ago

    xuexizhong

    9 years ago

    请问 exchange.GetDepth() 返回的是当前交易所的全部挂单信息吗?会不会因为挂单太多,而只返回一部分数据?

    9 years ago

    返回的档数 具体多少 看交易所 API 接口提供, 有些交易所 返回的多些有的少些,并且有的交易所 接口支持 深度 合并,有的没有支持,具体还是看交易所实现的,BotVS 封装的是默认返回数据,如果想直接调用, 可以使用 exchange.IO 函数 ,设定参数 调用(这个函数免签名,详见 API 文档)。

    9 years ago

    非常感谢。另外请问一下, 在模拟回测的实盘级仿真时,exchange.GetDepth() 返回的是BotVS拟合的数据还是真实历史数据?根据返回的情况来看,不太像真实历史数据。

    9 years ago

    实盘级别回测 ,买卖1档 是真实数据。

    9 years ago

    好的,这下明白,多谢了

    9 years ago

    GetRecords(Period) 返回一个K线历史,但是这个K线历史数据包含多少个K线bar,这个在哪里指定?

    9 years ago

    这个不能指定 , 返回多少条K线 是交易所 具体推送的, 各个交易所 可能 推送的数量不一样,另外一些交易所 没有提供 K线接口,托管者 会自行收集 交易所的交易记录,生成K线,这个K线就是 从第一根 开始 累积的。

    9 years ago

    好吧,我密匙错了,已改正

    9 years ago

    ^^ 最开始 我也老弄错~

    9 years ago

    GetAccount: 签名不匹配
    怎么弄,梦哥哥

    9 years ago

    为什么模拟盘depth的amount都是15? 模拟盘是拿的过去的数据,还是随机生成的数据?如果是过去的数据,amount是可以有值的。

    9 years ago

    深度数据 量太大了 如果全部记录 ,会非常多的。所以 深度数据 除了第一档 其他都是 模拟数值。

    9 years ago

    深度数据是还没有发生的,价格曲线都是过去发生的。个人认为过去和将来的数据共同判决当前的买卖才更靠谱。强烈建议把深度数据也记录下来。

    9 years ago

    好的, 我们考虑下,这个问题主要有2点:

    • 1、深度数据量太庞大,每秒都在变化,而且是很快的速度变化,我们看到的实际盘口 也仅仅是切片数据。
    • 2、即使 做出实际深度数据,但是 因为 此时此刻回测 中参与者仅仅是我们自己, 并没有其他参与者,还是无法准确模拟出订单薄深度环境。其实和目前的回测系统差别不大。

    不过我们会考虑尽量优化贴近真实情况的, 感谢提出建议 ^^

    9 years ago

    record是一个函数,length是什么?depth是一个对象?对象和函数如何区分?比如depth(Asks(price,amount)),这里的depth是对象,asks是数组?price和amount是属性?

    9 years ago

    records 是一个 变量, 用来接收 API 函数 GetRecords 返回的 K线数据, length 是 JS 语言中 数组类型变量的 长度属性,代表数组长度(即其中元素个数),depth 类似 records 也是一个变量 用来接收 GetDepth 函数返回的深度数据,这些 records、depth、ticker 的 数据结构在 API 文档 可以找到。

    9 years ago

    slidePrice 是什么?

    9 years ago

    滑价,翻译的有点直白,就是为了吃单 加的一点点价格,更容易成交。

    9 years ago
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)