記事一覧に戻る

【OANDA API】Pythonで指値・逆指値・トレーリング注文等、成行以外の注文をする方法

はじめに

今まで、OANDA APIについて以下の内容で記事を書いてきました。

今回は、指値注文、逆指値等、成行以外の注文のやり方を解説します。

用語の整理

指値、逆指指値がどういう注文か正確に理解していないと思った通りに動かない場合があります。例えば、「価格が100円の時、101円まで上がったら新規に"買い"たい」時、101円で買い指値注文を出してしまうと、想定に反して現在価格で成行買いになってしまいます。この場合は逆指値を出す必要があります。

私もはじめ指値と逆指値の理解が適当で苦戦しました。しかもAPIは英語で表現されるのと、STOP ORDERSTOP LOSS ORDERと似た名前の注文方法があってややこしいので、 まずは各注文がどういった内容なのか整理したいと思います。

英語の表記はOANDA APIドキュメントのDefinitionsに合わせています。

LimitOrderRequest

※記事内ではLimit注文と略します。

Limit注文は指値注文のことです。指値注文の意味については、SMBC日興証券社の初めてでもわかりやすい用語集が分かりやすかったので引用します。

希望する売買価格(買いの場合は上限価格、売りの場合は下限価格)を指定して発注する方法。~~(中略)~~。買い注文は、指定した値段以下の売り注文が出れば約定でき、売り注文は、指定した値段以上の買い注文が出れば約定できます。

買いたい時はなるべく安く、売りたいときはなるべく高く約定することは、市場参加者にとって有利になります。指値で出した注文より有利な価格が提示されている場合、有利な価格で約定するというのが指値注文のポイントです。

例えば「101円で買いたい」時、101円より安い価格で売りが提示されていれば、そちらの価格で約定します。逆に「101円で売りたい」時、101円より高い価格で買いが提示されていればその価格で取引成立します。

「この価格(買いの上限価格)より安ければ買う」もしくは「この価格(売りの下限価格)より高ければ売る」、というのが指値注文です。指値注文で指定する価格はこの上限・下限価格となります。

逆に「ここまで上がったら買い、下がったら売り」としたい場合には、指値注文は出来ません

StopOrderRequest

※記事内ではStop注文と略します。

Stop注文は逆指値注文のことです。名前のとおり、指値の逆です。「ここまで上がったら買い、ここまで下がったら売り」としたい場合に使う注文です。

例えば現在価格で100円のとき、「99円になったら売りたい」場合、99円で逆指値売り注文を出せばOKです。

TakeProfitOrderRequest

※記事内ではTakeProfit注文と略します。

利確注文と言えば良いでしょうか。指値や逆指値のように、日本の一般的な取引用語に訳せませんでしたが、利確と考えれば問題ありません。

利益が出る価格を指定し、その価格に到達したらポジションを決済する注文方法です。決済の注文のため、新規取引には使えません。未約定の指値・逆指値注文に対しても無効になります。あくまで、保有中のポジションに対して出す注文です。

例えば、100円で買ったポジションがある場合、110円でTakeProfitを出すことが出来ます。逆に、90円だと損切になるので出せません。

また、「この価格以下になったら新規取引し、この価格になったら決済(利確)する」といった、所謂IFD注文ではないので注意が必要です。

StopLossOrderRequest

※記事内ではStopLoss注文と略します。

損切注文です。TakeProfitの逆です。例えば100円の買いポジションがあるとき、99円まで下がったら決済(損切)したいときに出す注文です。TakeProfitと同じく、決済用の注文です。新規取引、未約定の注文に対して出すことは出来ません。

名前が似ていますが、Stop(逆指値)注文とは異なります。

TrailingStopLossOrderRequest

※記事内ではTrailing注文と略します。

利確や損切注文は指定した価格に到達したら決済されますが、Trailing注文では値幅(distance)を指定し、値幅分逆行したら決済されます。

例えば、100円で買いポジションを持っており、20pipsの値幅でTrailing注文を出している場合、20pips下落したら決済されます。101円、102円、、と値上がりしている場合でも、20pipsの下落がなければ決済はされません。損失を指定した値幅に限定しつつ、トレンドに乗って利益を伸ばしたい時に使えます。

OANDAラボでも解説されているのでご参考に。

用語のまとめ

ここまで、Limit(指値)、Stop(逆指値)、TakeProfit(利確)、StopLoss(損切)、Trailing(トレール)を解説しました。

各注文の取扱いや呼び方は、業者や商品によって異なる場合があります。10年近く前ですが、以前使っていた業者は、現在より安い価格で指値買いを発注すると、自動で逆指値注文として処理してくれました。また、私が今使っている仮想通貨のAPIでは、TakeProfitやStopLossといった決済注文も、LimitやStopといった表記になっています。

OANDA APIでは、以下の点を押させておけば、注文の種類に迷うことはないでしょう。

  • 新規注文はLimitかStopで注文する

    • 安くなったら買う/高くなったら売る ⇒ 指値
    • 安くなったら売る/高くなったら買う ⇒ 逆指値
  • 決済注文はTakeProfitかStopLossで注文する

    • 利確 ⇒ TakeProfit
    • 損切 ⇒ StopLoss
  • TakeProfitかStopLossは、建玉に対して有効(未約定の注文に対して注文できない)

IFD,IFD-OCO注文について

上記の用語の整理にて、決済注文は未約定の注文に対しては無効と書きました。「IFDやIFD-OCOは出来ないの?」と思われた方もいると思いますが、ちゃんと出来ます。

Limit/Stop注文時のオプションとして、決済用注文の指定が可能です。Limit注文、Stop注文にあるパラメータのtakeProfitOnFillstopLossOnFillを指定することで、IFD、IFD-OCO注文を出すことができます。

※ パラメータの詳細はLimit注文のドキュメントに記載されています。LimitとStopでドキュメントは分かれていますが、takeProfitOnFillstopLossOnFillはどちらも同じ内容です。

ちなみに、takeProfitOnFillは、「指値の約定(on-fill)をトリガーに発行される利確(take-profit)注文」という意味のようです。stopLossOnFillはこの損切バージョンです。

APIを使った注文の出し方は後述します。

※ IFD(If-Done)注文は、新規注文と決済注文(利確か損切いずれか1つ)を同時に出せる注文方法です。「100円で新規買いし、101円で利確する」といった具合です。

※ IFD-OCO(If-Done One Cancels the Other)は、新規注文と決済注文(利確と損切両方)を同時に出す注文方法です。「100円で新規買いし、101円で利確もしくは99円で損切」といったイメージです。決済注文は、両方が約定することはありません。片方が約定するともう片方はキャンセル扱いになるので、こういう呼び方をされています。

前提

Python3.9とRequests2.26を使います。いずれもこれより新しいバージョンであれば問題ありません。

なお、OANDA APIでは、Responseはapplication/json、POST/PUT/DELETEのRequestのBody部もapplication/jsonが原則となります。

APIキーの読取り方法や、認証用ヘッダーを取得する関数については、『PythonでOANDA APIの実行例を紹介』と同様になりますので、割愛します。

Limit注文・Stop注文

ドキュメント

指値注文はは一番上です。指値注文だけでなく、用語の整理で説明した注文は全て同じエンドポイントとなります。HTTPリクエストのBody部に、各注文方法ごとに指定されたデータを指定することで使い分けます。なお、メソッドはGETではなくPOSTになります。

指値注文の詳細は、DefinitionページLimitOrderRequestに記載されています。逆指値は、StopOrderRequestです。

endpoint

/v3/accounts/{accountID}/orders

サンプル

まずは、シンプルに指値と逆指値をそれぞれ単独で実施するサンプルです。EUR_USD(実行時、約1.05)が、「1.075まで上がったら10単位売る指値注文」、「1.0150まで下がったら10単位売る逆指値注文」を出してみます。

指値と逆指値の違いは、データの1つに"LIMIT"と指定するか、"STOP"と指定するかだけの違いなので、一緒にサンプルを付けます。

def _base_order(
        conf, pair, units, price, order_type,
        tif="GTC", gtd_time=None, takeProfitOnFill=None, stopLossOnFill=None):

    account_id = conf["id"]
    url = LIVE_URL + f"/v3/accounts/{account_id}/orders"
    header = default_header(conf["key"])
    param = {
        "order": {
            "type": order_type,
            "instrument": pair,
            "units": units,
            "price": price,
            "timeInForce": tif,
        }
    }
    if takeProfitOnFill:
        param["order"]["takeProfitOnFill"] = takeProfitOnFill
    if stopLossOnFill:
        param["order"]["stopLossOnFill"] = stopLossOnFill
    if gtd_time:
        param["order"]["gtdTime"] = gtd_time

    # POSTメソッドで実行
    res = requests.post(url, headers=header, json=param)
    return res.json()


# 指値注文
def limit_order(conf, pair, units, price, tif="GTC",
                gtd_time=None, takeProfitOnFill=None, stopLossOnFill=None):
    return _base_order(conf, pair, units, price,
                       "LIMIT", tif, gtd_time, takeProfitOnFill, stopLossOnFill)


# 逆指値注文(STOP注文)
def stop_order(conf, pair, units, price, tif="GTC",
               gtd_time=None, takeProfOnFill=None, stopLossOnFill=None):
    return _base_order(conf, pair, units, price,
                       "STOP", tif, gtd_time, takeProfOnFill, stopLossOnFill)


# 口座IDとapi-keyをファイルから取得
conf = load_key("./key.json")

# 指値注文。
limit_res = limit_order(conf, "EUR_USD", -10, "1.0750")

# ストップ注文
stop_res = stop_order(conf, "EUR_USD", -10, "1.0150")

# 実行結果の表示
pprint(limit_res, indent=1)
pprint(stop_res, indent=1)

confはapiキーと口座IDを保持したディクショナリ、pairは通貨ペア(USD_JPYEUR_USD等)、unitsは取引量、priceは指す価格です。売りから入る場合、unitsにはマイナスの値を指定します。order_typeは、"LIMIT"とすれば指値、"STOP"なら逆指値となります。

共通部分の処理を_base_order関数として分離させています。指値はlimit_order関数、逆指値はstop_order関数とし、その関数内でorder_typeを指定して共通処理を呼び出しています。

takeProfitOnFillstopLossOnFillは、利確と損切の注文を同時に出す場合に指定します(ここだけpythonの変数命名規則に反してしまいました。見逃してください)。IFDやIFD-OCOをしたい時に使います。IFD-OCOのサンプルは後述します。

tifは、timeInForce(注文の有効期間)です。指値注文の場合、特段の指定がなければGTC(キャンセルされるまで有効)として処理されます。そのため、デフォルト引数をGTCにしています。細かくなるのでここでの説明は割愛しますが、他にも次のような種類があります。

TimeInForce-Doc

[出典]:https://developer.oanda.com/rest-live-v20/order-df/#TimeInForce

デフォルトでは、キャンセルされるまで生き続けると覚えておけば大丈夫でしょう。GTDとする場合、キャンセルする日付を指定する必要があるので、limit_orderstop_ordergtd_timeのパラメタを設けています。

実行結果

指値でも逆指値でも返ってくるデータの型は同じです。orderCreateTransaction["id"]は注文のIDとなります。後にキャンセルをしたくなった時に必要になるので、適宜控えておくとよいでしょう。

指値(LIMIT)の実行結果

{
    'lastTransactionID': '1244',
    'orderCreateTransaction': {
        'accountID': '001-009-7411475-001',
        'batchID': '1244',
        'id': '1244',
        'instrument': 'EUR_USD',
        'partialFill': 'DEFAULT',
        'positionFill': 'DEFAULT',
        'price': '1.07500',
        'reason': 'CLIENT_ORDER',
        'requestID': '25028217562888846',
        'time': '2022-12-28T10:52:52.660759001Z',
        'timeInForce': 'GTC',
        'triggerCondition': 'DEFAULT',
        'type': 'LIMIT_ORDER',
        'units': '-10',
        'userID': 7411475
    },
    'relatedTransactionIDs': ['1244']
}

逆指値(STOP)の実行結果

{
    'lastTransactionID': '1245',
    'orderCreateTransaction': {
        'accountID': '001-009-7411475-001',
        'batchID': '1245',
        'id': '1245',
        'instrument': 'EUR_USD',
        'partialFill': 'DEFAULT',
        'positionFill': 'DEFAULT',
        'price': '1.01500',
        'reason': 'CLIENT_ORDER',
        'requestID': '151129007133616088',
        'time': '2022-12-28T10:52:53.041615581Z',
        'timeInForce': 'GTC',
        'triggerCondition': 'DEFAULT',
        'triggerMode': 'TOP_OF_BOOK',
        'type': 'STOP_ORDER',
        'units': '-10',
        'userID': 7411475
    },
    'relatedTransactionIDs': ['1245']
}

スマホのアプリで「ポートフォリオ>注文中」を見ると、ちゃんと注文通っていることが確認できます。

limit-and-stop-order-app

Limit注文・Stop注文(IFD-OCO編)

指値注文のサンプルlimit_orderstop_ordertakeProfitOnFillstopLossOnFillパラメタを指定することでIFD-OCOを再現できます。名前のとおり前者が利確、後者が損切注文です。損切か利確片方だけ出すIFD注文としたい場合、片方だけ指定すればOKです。

ここでは指値(LIMIT)でIFD-OCOのサンプルを付けます。

パラメタの補足

limit_orderstop_order関数のtakeProfOnFillstopLossOnFillに関する補足です。

それぞれ、ドキュメントのTakeProfitDetailsStopLossDetailsのDefinitionsに該当します。指値・逆指値の約定をトリガーに発行される決済注文という位置づけです。

用語の整理に出てきた、決済用注文のTakeProfitOrderRequestStopLossOrderRequestとは別モノです。あくまでLimit、Stop注文のパラメタとして指定するものとなりますので、ご注意ください。

いずれも、利確・損切する価格を指定します。stopLossOnFillに関しては、「値幅」での指定も可能です。

ここで、ちょっとドキュメントで不可解なことが箇所があるので共有します。stopLossOnFillのドキュメントは次のとおりです。

stoplossonfill

price(価格)もしくはdistance(値幅)どちらかで指定する、と記載されています。一方、takeProfitOnFillの定義を見ると、distanceに関する記載がありません。

takeprofitonfill

ただし、よくよく見ると、コメント欄にdistanceでの指定も可能と記載されています。コメントが間違っているのか、distanceに関する記載が漏れてしまったのか分かりませんが、不整合な記載になっていることに変わりありません。

実際に、takeProfitOnFilldistanceを指定して試してみたところ、ちゃんと注文が通ります。ただ、通常未約定の注文はアプリで確認できるのですが、この時は確認できませんでした。何かOANDA側でうまく処理されていないのかもしれません。一方で、APIを通じて未約定の注文を取得すると、正常に受け付けられているように見えます。

この辺りは、priceにdistanceを指定したことが原因なのか突き詰められていないため、別の機会に検証してみます。

少し話がそれてしまいましたが、この記事では、takeProfitOnFillstopLossOnFillともに価格での指定で進めていきます。

サンプル

takeProfitOnFillstopLossOnFillパラメタに指定するデータを生成する関数を作成します。

# stopLoss,takeProfパラメタ用のdictを生成する関数[price版]
def ifd_prm(price, tif="GTC", gtd_time=None):
    prm = {"price": price, "timeInForce": tif, }
    if gtd_time:
        prm["gtdTime"] = gtd_time
    return prm

Limit注文、Stop注文の本体と同じく、それぞれtimeInForceの指定が可能です。扱い方は本体と同じですので、ここではデフォルトのGTCのままにします。

それではIFD-OCOで「EUR_USDが"1.06"まで下がったら10units買い。"1.065"まで上がったら利確、"1.055"まで下がったら損切」という注文を出してみます。

# 口座IDとapi-keyをファイルから取得
conf = load_key("./key.json")

# takeProfitOnFill,stopLossOnFillに指定するデータを生成
take_prof = ifd_prm("1.065")
stop_loss = ifd_prm("1.055")

# 指値でIFD-OCOで注文
res = limit_order(conf, "EUR_USD", 10, "1.06",
                  takeProfitOnFill=take_prof, stopLossOnFill=stop_loss)
pprint(res)

実行結果

レスポンスにもちゃんとtakeProfitOnFillstopLossOnFillに指定した内容が確認できます。

{
    'lastTransactionID': '1409',
    'orderCreateTransaction': {
        'accountID': '001-009-7411475-001',
        'batchID': '1409',
        'id': '1409',
        'instrument': 'EUR_USD',
        'partialFill': 'DEFAULT',
        'positionFill': 'DEFAULT',
        'price': '1.06000',
        'reason': 'CLIENT_ORDER',
        'requestID': '205174252153710792',
        'stopLossOnFill': {
            'price': '1.05500',
            'timeInForce': 'GTC',       
            'triggerMode': 'TOP_OF_BOOK'
        },
        'takeProfitOnFill': {
            'price': '1.06500',       
            'timeInForce': 'GTC'
        },    
       'time': '2023-01-03T02:36:50.080532238Z',      
       'timeInForce': 'GTC',
       'triggerCondition': 'DEFAULT',
       'type': 'LIMIT_ORDER',
       'units': '10',
       'userID': 7411475},
    'relatedTransactionIDs': ['1409']
}

スマホのアプリで「ポートフォリオ>注文中」を見ると、ちゃんとリミットオーダーとストップオーダーが設定されていることが確認できます。

limit-and-stop-order-app

ここはPips表示なのでややこしいですね。画像上部のテキストが被っているのはアプリのバグでしょうか。実害は無いですが見ずらいので直してほしいです。

TakeProfit注文・StopLoss注文

ポジション(建玉)に対して出す利確、損切注文です。Limit注文、Stop注文のパラメタに指定するtakeProfitOnFillstopLossOnFillとは異なります。

サンプル

EUR_USD・1.06716の売りポジションに、1.06で利確、1.07で損切注文を入れてみます。建玉の指定にはtradeIDを指定する必要があります。今回のIDは1411です。position一覧をAPIで取得すればデータの中に含まれています。

# 利確注文
def take_profit_order(conf, trade_id, price, tif="GTC", gtd_time=None):
    account_id = conf["id"]
    url = LIVE_URL + f"/v3/accounts/{account_id}/orders"
    header = default_header(conf["key"])

    param = {
        "order": {
            "type": "TAKE_PROFIT",
            "tradeID": trade_id,
            "price": price,
            "timeInForce": tif,
        }
    }
    if gtd_time:
        param["order"]["gtdTime"] = gtd_time

    res = requests.post(url, headers=header, json=param)
    return res.json()


# 損切注文
def stop_loss_order(conf, trade_id, price, tif="GTC", gtd_time=None):
    account_id = conf["id"]
    url = LIVE_URL + f"/v3/accounts/{account_id}/orders"
    header = default_header(conf["key"])

    param = {
        "order": {
            "type": "STOP_LOSS",
            "tradeID": trade_id,
            "price": price,
            "timeInForce": tif,
        }
    }
    if gtd_time:
        param["order"]["gtdTime"] = gtd_time

    res = requests.post(url, headers=header, json=param)
    return res.json()


# 口座IDとapi-keyをファイルから取得
conf = load_key("./key.json")

# 利確注文と損切注文
tpo = take_profit_order(conf, "1411", 1.06)
slo = stop_loss_order(conf, "1411", 1.07)

# 実行結果を表示
pprint(tpo)
pprint(slo)

take_profit_orderstop_loss_orderの違いはparam["order"]["type"]に指定する値のみです。共通部分を切り出しても良かったのですが、良い名前が思いつかなかったので別々に作成しています。

実行結果

takeProfitOrderの実行結果

{
    'lastTransactionID': '1412',
    'orderCreateTransaction': {
        'accountID': '001-009-7411475-001',
        'batchID': '1412',
        'id': '1412',
        'price': '1.06000',
        'reason': 'CLIENT_ORDER',
        'requestID': '115102275108072621',
        'time': '2023-01-03T03:38:26.991426366Z',      
        'timeInForce': 'GTC',
        'tradeID': '1411',
        'triggerCondition': 'DEFAULT',
        'type': 'TAKE_PROFIT_ORDER',
        'userID': 7411475
      },
    'relatedTransactionIDs': ['1412']
}

stopLossOrderの実行結果

{
    'lastTransactionID': '1413',
    'orderCreateTransaction': {
        'accountID': '001-009-7411475-001',
        'batchID': '1413',
        'id': '1413',
        'price': '1.07000',
        'reason': 'CLIENT_ORDER',
        'requestID': '169145470641081706',
        'time': '2023-01-03T03:38:27.339678729Z',      
        'timeInForce': 'GTC',
        'tradeID': '1411',
        'triggerCondition': 'DEFAULT',
        'triggerMode': 'TOP_OF_BOOK',
        'type': 'STOP_LOSS_ORDER',
        'userID': 7411475
    },
    'relatedTransactionIDs': ['1413']
}

スマホのアプリの「ポートフォリオ」から該当ポジションをクリックして詳細を見てみます。

closing-order

リミットオーダーとストップオーダーが設定されていることが確認できます。

Trailing注文

ポジションに対してTrailing注文を出すことも出来ますが、Limit注文・Stop注文のオプションで指定し、新規取引と同時に注文することも出来ます。ここでは後者を説明します。

サンプル

ここまで、limit_order(指値注文)、stop_order(逆指値)ではtakeProfitOnFillstopLossOnFillは実装していましたが、TTrailing注文は未対応でした。なので追加していきます。

# 共通処理部分。trailingStopLossOnFillパラメタを追加
def _base_order(
        conf, pair, units, price, order_type,
        tif="GTC", gtd_time=None,
        takeProfitOnFill=None, stopLossOnFill=None,
        trailingStopLossOnFill=None):

    account_id = conf["id"]
    url = LIVE_URL + f"/v3/accounts/{account_id}/orders"
    header = default_header(conf["key"])
    param = {
        "order": {
            "type": order_type,
            "instrument": pair,
            "units": units,
            "price": price,
            "timeInForce": tif,
        }
    }
    if takeProfitOnFill:
        param["order"]["takeProfitOnFill"] = takeProfitOnFill
    if stopLossOnFill:
        param["order"]["stopLossOnFill"] = stopLossOnFill
    if gtd_time:
        param["order"]["gtdTime"] = gtd_time
    # trailingStopLossを追加
    if trailingStopLossOnFill:
        param["order"]["trailingStopLossOnFill"] = trailingStopLossOnFill

    res = requests.post(url, headers=header, json=param)
    return res.json()


# 指値注文。trailingStopLossOnFillパラメタを追加
def limit_order(conf, pair, units, price, tif="GTC", gtd_time=None,
                takeProfitOnFill=None, stopLossOnFill=None,
                trailingStopLossOnFill=None):
    return _base_order(conf, pair, units, price,
                       "LIMIT", tif, gtd_time,
                       takeProfitOnFill, stopLossOnFill,
                       trailingStopLossOnFill)


# 逆指値注文(STOP注文)。trailingStopLossOnFillパラメタを追加
def stop_order(conf, pair, units, price, tif="GTC", gtd_time=None,
               takeProfOnFill=None, stopLossOnFill=None,
               trailingStopLossOnFill=None):
    return _base_order(conf, pair, units, price,
                       "STOP", tif, gtd_time,
                       takeProfOnFill, stopLossOnFill,
                       trailingStopLossOnFill)

追加したtrailingStopLossOnFillパラメタに指定するデータを生成する関数も追加します。価格での指定でなく、値幅での指定となります。なお、いわゆるpipsではありません。例えば、USD_JPYで10pips(0.1円)の値幅で指定したい場合、"0.1"と指定する必要があります。

def ifd_prm_dist(distance, tif="GTC", gtd_time=None):
    prm = {"distance": distance, "timeInForce": tif, }
    if gtd_time:
        prm["gtdTime"] = gtd_time
    return prm

USD_JPYが131円の時に1000units逆指値買い、トレール幅0.2円(20pips)の注文を入れてみます。

# 口座IDとapi-keyをファイルから取得
conf = load_key("./key.json")

# 0.2円のトレール幅を指定して逆指値買い注文
trail = ifd_prm_dist("0.2")
res = stop_order(conf, "USD_JPY", 1000, "131", trailingStopLossOnFill=trail)

# 実行結果を出力
pprint(res)

実行結果

{
    'lastTransactionID': '1429',
    'orderCreateTransaction': {
        'accountID': '001-009-7411475-001',
        'batchID': '1429',
        'id': '1429',
        'instrument': 'USD_JPY',
        'partialFill': 'DEFAULT',
        'positionFill': 'DEFAULT',
        'price': '131.000',
        'reason': 'CLIENT_ORDER',
        'requestID': '97087905144742665',
        'time': '2023-01-03T05:31:52.508489615Z',
        'timeInForce': 'GTC',
        'trailingStopLossOnFill': {
            'distance': '0.200',
            'timeInForce': 'GTC',
            'triggerMode': 'TOP_OF_BOOK'
        },
        'triggerCondition': 'DEFAULT',
        'triggerMode': 'TOP_OF_BOOK',
        'type': 'STOP_ORDER',
        'units': '1000',
        'userID': 7411475
    },
    'relatedTransactionIDs': ['1429']
}

アプリでもトレールが設定されていることが確認できます。

trailing-stop

最後に

今回は、指値注文、逆指値注文、利確・損切注文、トレーリング注文の解説をしました。主要な注文方法は網羅出来たと思います。

利確注文(TakeProfitOrderRequest)、損切注文(StopLossOrderRequest)、トレーリング注文(TrailingStopLossOrderRequest)は、建玉に対して後追いで注文することも可能ですが、指値・逆指値注文のオプションとして、新規取引と一緒に注文することが可能です。オプションとして指定することがほとんどかと思いますので、指値注文(LimitOrderRequest)と逆指値注文(StopLossOrderRequest)をしっかり押さえておけば大丈夫そうですね。

前回、前々回の内容と合わせれば、簡易的な自動取引に必要なエンドポイントの解説は出来たと思いますので、今後は実際にBOTを作るところも記事にしたいと思います。その前に、これまでのサンプルコードを少し綺麗にする必要がありそうですが、、、。後、指値・逆指値の利確オプション(takeProfitOnFill)に、ドキュメント上存在しない(正確にはコメント上には存在しているのですが)distanceでの指定が可能なのか、検証もしていきたいです。

最後に、結構なボリュームになってしまいましたが、まだ触ったことがなく、今回実装していないパラメータもいくつかあります。これからもいろいろ触って試していこうと思います。もし今回紹介していないパラメータで、面白いものがあったらtwitter等で連絡もらえると幸いです。

記事一覧に戻る