【BitMEX】APIでのトレーリングストップの出し方を勉強&サンプルコード作成【CCXT】

近頃BitMEXのAPI(というかccxt.bitmex())の勉強をしています。

OCO注文の出し方はだいたい理解できました。
その他のトリガー系特殊注文もだいたい同じようにして出せるみたいです。
ちょっとOUOAとOUOPは使い所がわからないんですけどね。

なので(?)とりあえずスルーしつつ、次はトレイリングストップに挑んでみます。

例によって参考にするのはこのページ。

正直もうこれ見れば分かるからこれ見てって感じなんですけど

訳してみよう

You may use pegPriceType of ‘TrailingStopPeg’ to create Trailing Stops.
(トレーリングストップを実現するには「pegPriceType」に「TrailingStopPeg」をセットしてください。)
The pegged stopPx will move as the market moves away from the peg, and freeze as the market moves toward it.
(するとストップ価格が固定されます。市場価格が遠ざかる場合は移動し、近付く場合は動きません。)

To use, combine with pegOffsetValue to set the stopPx of your order.
(この設定を実現するには、「stopPx」と「pegOffsetValue」を組み合わせます。)
The peg is set to the triggering price specified in the execInst (default ‘MarkPrice’).
(ストップを移動するのに利用する価格は、execInstの設定によって決まります(デフォルトは「MarkPrice」です。)
Use a negative offset for stop-sell and buy-if-touched orders.
(stopでの売りとifTouchedでの買いではoffsetの値はマイナスになります。)

トレイリングストップってなんぞや?
っていうと、価格がStopから遠ざかる場合にStopを同じだけ動かすという特殊注文の名称です。

価格とStopを紐でつなぐイメージですね。
近付く場合はなにも起きません(もちろんStopまで到達したらStopが成立します)が、離れる場合は紐の長さ以上は離れません。

設定としては普通にstop(あるいはIfTouched)の注文形式を取りつつ、更に以下のパラメータを追加する感じです。

パラメータ
pegPriceType TrailingStopPeg
pegOffsetValue (double)
[execInst] MarkPrice/LastPrice/IndexPrice

execInstは、トレイリングする基準値を決めるだけなので設定しなくても構いません。

pegOffsetValueに何を入れれば良いの?というのは後述します。

やってみよう

やってみます。
すでにロングのポジションがある前提で、トレイリングストップを出すコードです。

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

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

symbol = 'BTC/USD'
type = 'stop'
side = 'sell'
amount = 1.0
price = bm.fetch_ticker(symbol)['last']
stopPx = math.floor(price * 0.99)
offset = - math.floor(price * 0.01)
params = {
    'stopPx': stopPx,
    'pegPriceType': 'TrailingStopPeg',
    'pegOffsetValue': offset,
    'execInst': 'LastPrice',
}

try:
    pprint(bm.create_order(symbol, type, side, amount, None, params))
except Exception as e:
    pprint(e)

Paramsにいくつかパラメータを指定してあります。

ちょっとstopPxとpegOffsetValueの関係がわかりづらいですが、こういうイメージです。

enter image description here

伝わるかわかりませんが(

当然ながら、ショートのStopではこの関係が逆転します。

stopとoffsetが異なる場合

ちなみに、stopPxとoffsetの数値は異なっていても問題ありません。
その場合にどうなるかというと若干アレなんですが、基本的には原義通り動きます。

Stopから遠ざかる場合にのみStopが動くというわけです。

offsetが小さい場合

現在価格が8000でStopが7500、offsetがマイナス100としましょう。

この場合、価格が上に動いた瞬間に、offsetの位置までStopが動きます。

たとえば8000から8001に動いたらStopも7500から7901にワープします。
7800まで落ちてから7801に上がればStopは7701になります。

また、7550まで落ちてから7551に上がった場合はなにも起きません。

Stopは7500なので、offsetの100まではまだ余裕があるからです。

offsetが大きい場合

これは比較的わかりやすいかと思います。

単純に、トレイリングされるまでの価格に余裕があるというだけです。

offsetの符号が逆の場合

これは設定ミスです。

たとえば現在価格が8000でStopが7500、offsetがマイナスではなくてプラス100とします。

この場合、価格が上に動いた瞬間にStopがその価格+offsetの値に移動して即座にStopになります。

こんなかんじです。

価格が8000から8001に動く
→offsetはプラス100なので、Stopのあるべき位置は8101
→現在のStopは7500なので、あるべき位置より低い
Stopがトレイリングというか一本釣りされて8101まで移動する
→価格がStopより下に来ているので即座にStop

もしかしたら価格が下がっても発動するかもしれませんが試す気にはなれません。
とりあえずここの正負は間違えないようにしましょう。

現在価格+offset=stopPx、という式を覚えておくと良さそうです。

ざっくりですが

というわけでトレイリングストップの出し方を調べました。
基本的なところは学べた気がします。

当然ながらこの注文で出せるのはあくまで『現在の価格に連動してトレイリングされるストップ注文』だけです。

どういうことかと言うと、ストップされるべきポジションは別途用意する必要があります。

ポジションの入りが成行でない場合、OTO注文にしておいてポジションが取られた場合のみトレイリングストップが有効になるみたいな設定にするのもアリかもしれませんね。

B! LINE