CCXTでBitMEXのOCO注文を出す関数を作ってみた

関数。

create_oco_order(bitmex, symbol, type, side, amount, price, profitPx, stopPx)

bitmexにはccxt.bitmex()でAPIキーとシークレットを持たせたインスタンスを渡します。
profitPxは利確、stopPxは損切の価格を入れます。
価格の大小関係がちゃんとしてないと動かないようにしてます。

それ以外のパラメータは基本的に普通のcreate_orderと同じです。

symbol・・・基本的に'BTC/USD'
type・・・'limit'または'market'
side・・・'buy'または'sell'
amount・・・購入するUSD
price・・・購入する価格

コードは以下になります。

# create_oco_order.py

import ccxt
from pprint import pprint
import json
import math
import random
import time

def create_order_wrap(bitmex, symbol, type, side, amount, price, params):
    err_cnt = 0
    while True:
        try:
            if err_cnt >= 2:
                break
            order = bitmex.create_order(symbol, type, side, amount, price, params)
            break
        except Exception as e:
            print(e)
            err_cnt += 1
            time.sleep(5)
            
    return order

def create_oco_order(bitmex, symbol, type, side, amount, price, profitPx, stopPx):
    # 反対注文を選択
    if side.lower() == 'buy':
        if not (stopPx < profitPx): # 高い価格で売りたい=利確、低い価格でも売りたい=損切
            return [{'error':'Px is wrong.'}]
        rside = 'sell'
    elif side.lower() == 'sell':
        if not (profitPx < stopPx): # 低い価格で買い戻したい=利確、高い値段でも買い戻したい=損切
            return [{'error':'Px is wrong.'}]
        rside = 'buy'
    else:
        return [{'error':'side is wrong.'}]

    # ordTypeとParamsを設定
    clOrdLinkSeed = str(random.randrange(100000, 999999))
    inId = 'in' + clOrdLinkSeed
    outId = 'out' + clOrdLinkSeed
    if type.lower() == 'limit':
        typeIn1 = 'limit'
        paramsIn1 = {'clOrdLinkID':inId, 'contingencyType':'OneCancelsTheOther', }
        typeIn2 = 'Stop'
        paramsIn2 = {'clOrdLinkID':inId, 'contingencyType':'OneCancelsTheOther', 'execInst':'ReduceOnly', 'stopPx':stopPx, }
        typeOut1 = 'MarketIfTouched'
        paramsOut1 = {'clOrdLinkID':outId, 'contingencyType':'OneCancelsTheOther', 'execInst':'ReduceOnly', 'stopPx':profitPx, }
        typeOut2 = 'Stop'
        paramsOut2 = {'clOrdLinkID':outId, 'contingencyType':'OneCancelsTheOther', 'execInst':'ReduceOnly', 'stopPx':stopPx, }
    elif type.lower() == 'market':
        typeIn1 = 'market'
        paramsIn1 = {}
        typeOut1 = 'MarketIfTouched'
        paramsOut1 = {'clOrdLinkID':outId, 'contingencyType':'OneCancelsTheOther', 'execInst':'ReduceOnly', 'stopPx':profitPx, }
        typeOut2 = 'Stop'
        paramsOut2 = {'clOrdLinkID':outId, 'contingencyType':'OneCancelsTheOther', 'execInst':'ReduceOnly', 'stopPx':stopPx, }
    else:
        return [{'error':'type is wrong.'}]

    # create_orders
    orders = []
    orders.append(create_order_wrap(bitmex, symbol, typeIn1, side, amount, price, paramsIn1))
    if type.lower() == 'limit': orders.append(create_order_wrap(bitmex, symbol, typeIn2, rside, amount, None, paramsIn2))
    orders.append(create_order_wrap(bitmex, symbol, typeOut1, rside, amount, None, paramsOut1))
    orders.append(create_order_wrap(bitmex, symbol, typeOut2, rside, amount, None, paramsOut2))

    return orders
    


使い方。

# create_order_test.py

import ccxt
from pprint import pprint
import json
import math
import create_oco_order as oco

bm_keys_json = open('config/mexkeys.json', 'r')
bm_key = json.load(bm_keys_json)
bm = ccxt.bitmex(bm_key)

symbol = 'BTC/USD'
type = 'limit'
side = 'buy'
amount = 1.0
price = bm.fetch_ticker(symbol)['last'] - 1
profitPx = math.floor(price * 1.01)
stopPx = math.floor(price * 0.995)

pprint(oco.create_oco_order(bm, symbol, type, side, amount, price, profitPx, stopPx))


# config/mexkeys.json

{
   "apiKey":"",
   "secret":""
}

直下にconfig/bmkeys.jsonを置いて……とか基本的なところはこちらの記事でも紹介しています。

http://whyimoeat.blogspot.com/2018/07/bitmex-ccxt-learning-basic.html


注意点。

エラーの制御がアレなので、バッドリクエストを投げまくって規制される危険があります。
使う人がいるか知りませんが、ループ処理で使う場合は正しく動くことをよく確認してから使ってください。

あとlimitのときは、指値がそもそも刺さらなかった場合のストップを入れてます。
その関係で既存の注文があると決済されてしまうことがあります。
裁量取引やその他BOTなどと併用する場合は、marketで注文するか適宜変更するようにしてください。

課題やら。

エラーのときの制御とかよくしらない。

ccxtを継承とかしてclassとかにしたほうがいいんですかね。

基本的なところを理解していません……。

この続きをみるには

この続き:0文字

CCXTでBitMEXのOCO注文を出す関数を作ってみた

たこなしやき

100円

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

6

たこなしやき

たこなしやきだったよ まいにち たこやきをやく すごいやつ だったよ
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。