2.2 下限价单 交易

Author: 小小梦, Created: 2016-11-07 16:41:10, Updated: 2019-08-01 09:26:27

下限价单 交易


  • Buy(Price, Amount) 函数

小准备

在使用交易函数 Buy( ) / Sell( ) 前有几个API 是必须熟悉的。

  • 1、 GetOrder(orderId) 根据订单号获取订单详情, 返回一个Order结构。
  • 2、 GetOrders 获取所有未完成的订单, 返回一个Order数组结构。
  • 3、 CancelOrder(orderId) 根据订单号取消一个订单, 返回true或者false。
  • 4、 订单的状态 Order结构里的Status值
[
        ORDER_STATE_PENDING     :未完成
        ORDER_STATE_CLOSED      :已关闭
        ORDER_STATE_CANCELED	:已取消
]
  • 5、 Order 订单结构, 由GetOrder函数返回
{
        Id          :交易单唯一标识
        Price       :下单价格
        Amount      :下单数量
        DealAmount  :成交数量
        Status      :订单状态, 参考常量里的订单状态
        Type        :订单类型, 参考常量里的订单类型
}

API文档

Buy(Price, Amount)	下买单, Price为买单价格,Amount为数量, 返回一个订单ID
可以跟多余的参数做为附加消息显示到日志, 如exchange.Buy(1000,0.1, "OK", 123)
支持现货(火币/BitVC/OKCoin/OKCoin国际/OKCoin期货/BTCChina/BitYes)市价单, 市价单价格指定为-1
exchange.Buy(1000), 指买市价1000元的币, BTCChina例外exchange.Buy(0.3)指市价买0.3个币
  • 限价单

我们来看看如何简单的使用限价单,其实限价单有很多细节需要处理,我们先简单的了解,因为在稍后 章节3.1 会有一个非常细致的处理流程让大家学习。

function main() {    
        //  方便用户看这些  宏的值 我们事先打印出来
        //  ORDER_STATE_PENDING     :未完成
        //  ORDER_STATE_CLOSED      :已关闭
        //  ORDER_STATE_CANCELED    :已取消

        Log("ORDER_STATE_PENDING:", ORDER_STATE_PENDING, ", ORDER_STATE_CLOSED:", 
            ORDER_STATE_CLOSED, ", ORDER_STATE_CANCELED:", ORDER_STATE_CANCELED); // 这些都是订单状态的宏,打印这些值认识下,在本段代码不起任何作用,仅仅观察下这些 “状态” 的值。
    
        var ticker = exchange.GetTicker();               // 上一章 已经讲述了怎么获取行情信息。
        Log("初始账户信息:", exchange.GetAccount());      //  用于对比交易前后账户信息
    
        var ID = exchange.Buy(ticker.Sell + 0.1, 0.1);   // ticker.Sell 即 上一章中的  depth.Asks[0].Price 。
                                                         //  返回值是一个订单 ID ,参考上面 小准备。
        // 限价单下单后 返回一个ID 可以用来查询这个订单的完成情况。我们暂停1秒 即:  Sleep(1000)   。
        Sleep(1000);
        var order = exchange.GetOrder(ID);               // 根据ID 获取 对应的 订单信息。
        Log("order:", order);
        Log("当前账户信息:", exchange.GetAccount());       //  对比初始账户信息
}

运行结果如下: img 可以看到 打印出来的 order 的 Status 的值 为 1, 即: ORDER_STATE_CLOSED 。当前的订单状态为已完成,看到dealAmount为0.1, 也能印证 这个订单已经完成交易。 成交量就是 dealAmount 。可能有细致观察的同学发现 打印出来的 order 比API 文档多出一个 AvgPrice(成交均价) ,这是因为这个属性是后来扩展显示出来的。

  • Sell(Price, Amount) 函数

API文档

    Sell(Price, Amount)	跟Buy函数一样的调用方法和场景
  • 限价单

上面的Buy() 函数我们使用的回测系统测试的,这里我们用模拟盘测试一下,看看订单有没有未成交的情况(或者部分成交)。

function main() {    
        //  方便用户看这些  宏的值 我们事先打印出来
        //  ORDER_STATE_PENDING	:未完成
        //  ORDER_STATE_CLOSED	:已关闭
        //  ORDER_STATE_CANCELED	:已取消

        Log("ORDER_STATE_PENDING:", ORDER_STATE_PENDING, "
            , ORDER_STATE_CLOSED:", ORDER_STATE_CLOSED, ", ORDER_STATE_CANCELED:", ORDER_STATE_CANCELED);
    
        var ticker = exchange.GetTicker();   // 上一章 已经讲述了怎么获取行情信息。
        Log("初始账户信息:", exchange.GetAccount());   //  用于对比交易前后账户信息
        var ID = exchange.Sell(ticker.Sell + 0.3, 2); // 这里故意把卖出价格加了 0.3 ,并且使用的ticker.Sell,增加了未成交的几率。
                                                      //  返回值是一个订单 ID ,参考上面 小准备。
        // 限价单下单后 返回一个ID 可以用来查询这个订单的完成情况。我们暂停1秒 即:  Sleep(1000)   。
        Sleep(1000);
        var order = exchange.GetOrder(ID);            // 根据ID 获取 对应的 订单信息。
        Log("order:", order);
        Log("当前账户信息:", exchange.GetAccount());   //  对比初始账户信息
}

发明者量化 模拟盘运行结果如下: img 可以看到 打印的order的 Status 值为0, 即未完成。 DealAmount 的值为0, 并且卖出的2个币由于 order 为Pending 状态,也冻结了。(看最后输出的账户信息)

那对于Pending 的单子怎么处理呢? 这里用到了 CancelOrder(ID) 这个函数,我们用它来取消 指定ID的订单。

function main() {    
        //  方便用户看这些  宏的值 我们事先打印出来
        //  ORDER_STATE_PENDING	:未完成
        //  ORDER_STATE_CLOSED	:已关闭
        //  ORDER_STATE_CANCELED	:已取消

        Log("ORDER_STATE_PENDING:", ORDER_STATE_PENDING, ", ORDER_STATE_CLOSED:", ORDER_STATE_CLOSED,
            ", ORDER_STATE_CANCELED:", ORDER_STATE_CANCELED);
    
        var ticker = exchange.GetTicker();   // 上一章 已经讲述了怎么获取行情信息。
        Log("初始账户信息:", exchange.GetAccount());   //  用于对比交易前后账户信息
        var ID = exchange.Sell(ticker.Sell + 50, 2);  // ticker.Sell 即 上一章中的  depth.Asks[0].Price 。
                                                      //  返回值是一个订单 ID ,参考上面 小准备。
        // 限价单下单后 返回一个ID 可以用来查询这个订单的完成情况。我们暂停1秒 即:  Sleep(1000)   。
        Sleep(1000);
        var order = exchange.GetOrder(ID);  // 根据ID 获取 对应的 订单信息。
        Log("order:", order);
        Log("当前账户信息:", exchange.GetAccount());   //  对比初始账户信息
        Sleep(60 * 1000);
        exchange.CancelOrder(ID);         //  取消 这个ID 的订单
        order = exchange.GetOrder(ID);    //  读取这个ID的订单信息。
        Log("order:", order);
}

运行结果: 显示ID 号634795459 的订单最后 打印的信息中 Status 为2 即:ORDER_STATE_CANCELED :已取消 img

GetOrder(ID) 和 GetOrders() 函数看起来很像,区别就是前者是获取指定ID的订单信息,后者是获取所有未完成的订单(GetOrders() 返回的数据结构为对象数组,即每一个元素为order结构的数组)。


More

bijiasuo 如果我不要买比特币,买其他的币,咋整?

bijiasuo 马克一下

pengliheng 能不能问一下,我根据 exchange.Buy(ticker,0.1)来买一 和 exchange.Buy(depth,0.1)来买一 的区别是什么, 币的市场真实交易价到底如何获取哦

FangBei python版本 https://dn-filebox.qbox.me/a2802f5f41f416374d79c48aca05030ce2b2e8a8.png https://dn-filebox.qbox.me/d6d7d1af28993a2225ec33b092b4cf2e8c479edc.png

小小梦 参看这个 帖子的 第四个问题: https://www.botvs.com/bbs-topic/1427 实盘的时候 可以使用自定义控件设置。

小小梦 GetTicker 获取的就是 实时的 行情数据, GetDepth 获取的是深度 信息, 买一 、卖一 都是一样的。

小小梦 感谢 分享!