取引を行う

取引を行うには、broker を使用します。 broker は、 Agentのインスタンス変数として初期化時に設定されます。

注文を行う

成行、指値、逆指値、Market If Touched で注文を行うことができます。
以下、各種注文を行う例です。

# EURJPYを10000単位、成行で売り
broker.sell(:EURJPY, 10000)
# 各種オプションを指定して、EURJPYを10000単位、成行で買い
order_result = broker.buy(:EURJPY,  10000, :market, {
  # 建玉の約定条件
  stop_loss:     { price: 135.23 },  #ストップロス価格
  take_profit:   { price: 135.73 },  #テイクプロフィット価格
  trailing_stop: { distance: 10 }    #トレーリングストップのディスタンスをpipsで指定します。
})
# 成行注文の場合、通常、即約定するため、以下のようなコードで注文によって作成された建玉を取得できます
position = broker.positions[order_result.trade_opened.internal_id]

# 指値135.6で売り注文
broker.sell(:USDJPY, 10000, :limit, {
  price:         122.6,
  time_in_force: 'GTD',
  gtd_time:      Time.utc(2015, 5, 2)  #注文の有効期限
})

# 逆指値112.404で買い注文
broker.buy(:USDJPY, 10000, :stop, {
  price:       112.404,
  time_in_force: 'GTD',
  gtd_time:      Time.utc(2015, 5, 2)

  # stop_loss等のオプションは、注文方法によらず指定可能です。
  stop_loss:     { price: 111.404 },
  take_profit:   { price: 113.404 },
  trailing_stop: { distance: 10 }
})

# Market If Touched で買い
broker.buy(:EURUSD, 10000, :marketIfTouched, {
  price:         1.4325,
  time_in_force: 'GTD',
  gtd_time:      Time.utc(2015, 5, 2)
})

sell(pair_name, units, type, options), buy(pair_name, units, type, options) の引数は次の通りです。

番号 名前 説明
1 pair_name 取引する通貨ペアを、:EURJPY のようなシンボルで指定します。(必須)
2 units 注文単位を指定します。(必須)
OANDA JApan では、1単位からの取引が可能です。
3 type 取引の種別を指定します。
成行 (:market)、指値 (:limit)、逆指値 (stop)、 Market If Touched (:marketIfTouched) のいずれかが指定可能です。
省略した場合、成行(:market) 注文になります。
4 options 指値注文の指値価格や、有効期限などを指定します。
指定可能なパラメータについては、こちらを参照ください。

注文を行うと、 OrderResult が返却されます。

注文一覧を取得する

Broker#orders で、注文一覧を取得できます。

orders = broker.orders # Orderの配列が返されます。
orders.length
orders.select { |o| o.sell_or_buy == :sell } #売り注文の一覧を取得

Orderの属性はこちらを参照ください。

注文を変更する

指値や決済条件は、 Broker#modify_order(order) または、 Order#modify で変更することが可能です。

order = broker.orders[0]

# 変更
order.price = 135.7
order.gtd_time = Time.utc(2015, 5, 2)
order.take_profit_on_fill = {
  price: 135.63
}
order.stop_loss_on_fill = {
  price: 135.83
}
order.trailing_stop_loss_on_fill = {
  distance: 10
}

# 変更を反映
broker.modify_order(order)
# or
order.modify

変更可能なプロパティについては、こちらを参照ください。

注文をキャンセルする

約定していない注文は、 Broker#cancel_order(order) または、 Order#cancel でキャンセルできます。

order = broker.orders[0]

# 注文をキャンセル
broker.cancel_order(order)
# or
order.cancel

建玉一覧を取得する

注文が約定すると、 建玉( Position )が生成されます。
Broker#positions で、現在の建玉一覧を取得できます。

positions = broker.positions # Positions オブジェクトが返されます
positions.length
positions.select { |p| p.sell_or_buy == :sell } #売建玉の一覧を取得

建玉オブジェクトからは、購入レートや現在の損益が取得できます。

# 建玉
position = broker.positions[0]

position.internal_id     # 一意な識別子
position.pair_name       # 通貨ペア 例) :EURJPY
position.units           # 取引単位
position.sell_or_buy     # 売(:sell) or 買(:buy)

# ステータス
# - 新規   .. :live
# - 決済済 .. :closed
# - ロスト .. :lost
#   (決済前にシステムが再起動された場合、ロスト状態になります)
position.status

position.profit_or_loss  # 損益
position.max_drow_down   # 最大ドローダウン

position.entry_price     # 購入価格
position.current_price   # 現在価格
position.exit_price      # 決済価格 (未決済の場合 nil)

position.entered_at      # 購入日時
position.exited_at       # 決済日時 (未決済の場合 nil)
position.updated_at      # 最終更新時刻

# 決済条件
position.closing_policy.take_profit     # テイクプロフィット価格
position.closing_policy.stop_loss       # ストップロス価格
position.closing_policy.trailing_stop   # トレーリングストップディスタンス
position.closing_policy.trailing_amount # トレーリングストップ数量
※証券会社へのアクセス回数を減らすため、建玉情報は1分間キャッシュされます。
最新の建玉を参照したい場合は、 broker#positions の代わりに broker#load_positions を利用してください。

建玉を決済する

建玉を決済するには、Broker#close_position(position) または、 Position#close を実行します。

position = broker.positions.select { |p| p.sell_or_buy == :sell }[0]

# 建玉を決済
broker.close_position(position)
# or
position.close

建玉の決済条件を変更する

Broker#modify_position(position) または、 Position#modify で、建玉の決済条件を変更することができます。

position = broker.positions.select { |p| p.sell_or_buy == :sell }[0]

# 決済条件を変更
position.closing_policy = Jiji::Model::Trading::ClosingPolicy.create({
  stop_loss:     130,
  take_profit:   140.5,
  trailing_stop: 10
})

# 変更を反映
broker.modify_position(position)
# or
position.modify