つまりこういうことですかね。BitMEXのOCO注文サンプルコード(未検証)

そんなもん置くなって話ですが

検証する時間が無いです!

前回。

パターン1:成行

成行の場合は、現在の値段で買ったら上下に注文を出すだけなのでそこまで複雑ではないですね。

ざっとこんな感じ。

サンプルコード

import ccxt
from pprint import pprint
import json
import math

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

last = bm.fetch_ticker('BTC/USD')['last']
stopPer = 1.0
profitPer = 3.0
amount = 1

# ポジションを立てる
symbol = 'BTC/USD'
type = 'market'
side = 'buy'
price = None
params = {}
order1 = bm.create_order(symbol, type, side, amount, price, params)
pprint(order1)

# OCO1 ストップ
symbol = 'BTC/USD'
type = 'stop'
side = 'sell'
price = None
params = {
    'stopPx': math.floor(last * (100.0 - stopPer) / 100.0), #-0.1%
    'clOrdLinkID': 'out',
    'contingencyType': 'OneCancelsTheOther',
    'execInst': 'ReduceOnly',
}
order1 = bm.create_order(symbol, type, side, amount, price, params)
pprint(order1)

symbol = 'BTC/USD'
type = 'Limit'
side = 'sell'
price = math.floor(last * (100.0 + profitPer) / 100.0) #-0.1%
params = {
    'clOrdLinkID': 'out',
    'contingencyType': 'OneCancelsTheOther',
    'execInst': 'ReduceOnly',
}
order1 = bm.create_order(symbol, type, side, amount, price, params)
pprint(order1)

keyのあたりは説明を省いてます。
詳しくは前段の記事を参照していただくか、適当にググってください。

パターン2:指値

問題なのがこっち。
考えないといけないのが、指値に刺さらずに値段がストップまで下がるパターン。

もちろんその時は注文をキャンセルしたりすべきなんですが、それはそれとしてストップでポジションを取るなんてことがないようにしてやる必要があります。

し、その後で最初の価格まで戻ったときにもう一度ポジションを取りたいか?
と言われればやや微妙で、仕切り直したいのが人情ってやつですよね。

みたいなところを考慮しつつ、たぶんこれでいけるはず……?

概要

パラメータは以下のような感じ。

インとして以下の注文を設定。

パラメータ 注文1 注文2
symbol BTC/USD BTC/USD
type Limit Stop
side buy sell
amount 10 10
price 7000 -
stopPx - 6900
clOrdLinkID in in
contingencyType OneCancelsTheOther OneCancelsTheOther
execInst - ReduceOnly

アウトとして以下の注文を設定。

パラメータ 注文1 注文2
symbol BTC/USD BTC/USD
type Stop Limit
side sell sell
amount 10 10
price - 7250
stopPx 6900 -
clOrdLinkID out out
contingencyType OneCancelsTheOther OneCancelsTheOther
execInst ReduceOnly ReduceOnly

これで指値に刺さらず下がったらどちらの注文もキャンセルされるし、指値が成立したら余計なストップは消えてOCOの形となるはずです。

サンプルコード

こんな感じになるかな。
たぶん。

import ccxt
from pprint import pprint
import json
import math

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

last = bm.fetch_ticker('BTC/USD')['last']
stopPer = 1.0
profitPer = 3.0
amount = 1

# OCO1-1
symbol = 'BTC/USD'
type = 'limit'
side = 'buy'
price = last + 0.5
params = {
    'clOrdLinkID': 'in',
    'contingencyType': 'OneCancelsTheOther',
}
order1 = bm.create_order(symbol, type, side, amount, price, params)
pprint(order1)

# OCO1-2
symbol = 'BTC/USD'
type = 'stop'
side = 'sell'
price = None
params = {
    'stopPx': math.floor(last * (100.0 - stopPer) / 100.0), #-0.1%
    'clOrdLinkID': 'in',
    'contingencyType': 'OneCancelsTheOther',
    'execInst': 'ReduceOnly',
}
order1 = bm.create_order(symbol, type, side, amount, price, params)
pprint(order1)

# OCO2-1
symbol = 'BTC/USD'
type = 'stop'
side = 'sell'
price = None
params = {
    'stopPx': math.floor(last * (100.0 - stopPer) / 100.0), #-0.1%
    'clOrdLinkID': 'out',
    'contingencyType': 'OneCancelsTheOther',
    'execInst': 'ReduceOnly',
}
order1 = bm.create_order(symbol, type, side, amount, price, params)
pprint(order1)


symbol = 'BTC/USD'
type = 'Limit'
side = 'sell'
price = math.floor(last * (100.0 + profitPer) / 100.0) #-0.1%
params = {
    'clOrdLinkID': 'out',
    'contingencyType': 'OneCancelsTheOther',
    'execInst': 'ReduceOnly',
}
order1 = bm.create_order(symbol, type, side, amount, price, params)
pprint(order1)

売りの場合

上記はいずれも買いから入るパターンですが、売りの場合も同じですね。

値段の指定とsideを変更すれば動くはずです。

そのへんまとめて関数にしておけば便利そうですね。
やってみよう。

……とりあえず

エラーは出ませんでした。
ちゃんと動くかはわかりません。

いやだって1%ですらけっこうな値幅なんですもん。
そう簡単に動きませんて。
とか言ってたらめっちゃ朝のタイミングで下がってたんですけど。

ReduceOnlyがうまく働いてくれればそう変なことにはならないでしょうし、そもそも1ドルぽっちです。
ということで、出しっぱなしでもそうひどいことにはならないでしょう。

知らんけど。

とりあえず思ったことはひとつ。

こりゃサンプルコード集で300円くらい取ってもバチは当たらないわ。

B! LINE